博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang学习日志 ━━ 借百度AI实现语音合成实例
阅读量:4116 次
发布时间:2019-05-25

本文共 4502 字,大约阅读时间需要 15 分钟。

package mainimport (	"time"	"fmt"	"strings"	"io/ioutil"	"encoding/json"	"net/http"	"net"	"net/url"	"strconv"	"crypto/tls")const POST_REMOTE_TIMEOUT = 30const (	// APP相关的两个KEY,需要从百度AI开放平台申请	API_KEY = "4E1BG9lTnlSeIf1NQFlrSq6h"	SECRET_KEY = "544ca4657ba8002e3dea3ac2f5fdd241"	// 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声	PER = 4	// 语速,取值0-15,默认为5中语速	SPD = 5	// 音调,取值0-15,默认为5中语调	PIT = 5	// 音量,取值0-9,默认为5中音量	VOL = 9	// 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav	AUE = 3	CUID = "123456PYTHON"	TTS_URL = "http://tsn.baidu.com/text2audio"	TOKEN_URL = "http://openapi.baidu.com/oauth/2.0/token")type CommResp struct {
AccessToken string `json:"access_token"` SessionKey string `json:"session_key"` Scope string `json:"scope"` RefreshToken string `json:"refresh_token"` SessionSecret string `json:"session_secret"` ExpiresIn string `json:"expires_in"`}func main() {
token := fetch_token() tex := "hi, 我是百度智能语音合成机器人, 加油加油!" var format_map = make(map[int]string, 0) format_map[3] = "mp3" format_map[4] = "pcm" format_map[5] = "pcm" format_map[6] = "wav" params := make(map[string]interface{
}, 0) params["tok"] = token params["tex"] = tex params["per"] = PER params["spd"] = SPD params["pit"] = PIT params["vol"] = VOL params["aue"] = AUE params["cuid"] = CUID params["lan"] = "zh" params["ctp"] = 1 response := sendRequest(TTS_URL, params, "GET") name := fmt.Sprintf("result.%v", format_map[AUE]) WriteWithIoutil(name, response)}func fetch_token() string {
params := make(map[string]interface{
}, 0) params["grant_type"] = "client_credentials" params["client_id"] = API_KEY params["client_secret"] = SECRET_KEY response := sendRequest(TOKEN_URL, params, "GET") var res CommResp if err := json.Unmarshal([]byte(response), &res); err == nil {
fmt.Printf("res=[%v]\n", res) } return res.AccessToken}func WriteWithIoutil(name, content string) {
data := []byte(content) if ioutil.WriteFile(name,data,0644) == nil {
fmt.Println("生成音频文件成功:", name) }}func dialTimeout(network, addr string) (net.Conn, error) {
return net.DialTimeout(network, addr, time.Second*POST_REMOTE_TIMEOUT)}func typeSwitcher(t interface{
}) string {
switch v := t.(type) {
case int: return strconv.Itoa(v) case string: return v case int64: return strconv.Itoa(int(v)) case []string: return "typeArray" case map[string]interface{
}: return "typeMap" default: return "" }}func ParamsToStr(params map[string]interface{
}) string {
isfirst := true requesturl := "" for k, v := range params {
if !isfirst {
requesturl = requesturl + "&" } isfirst = false if strings.Contains(k, "_") {
strings.Replace(k, ".", "_", -1) } v := typeSwitcher(v) requesturl = requesturl + k + "=" + url.QueryEscape(v) } return requesturl}func httpGet(url string) string {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true}, } client := &http.Client{
Transport: tr, Timeout: time.Duration(3) * time.Second} fmt.Println(url) resp, err := client.Get(url) if err != nil {
fmt.Println(err) return err.Error() } defer resp.Body.Close() body, erro := ioutil.ReadAll(resp.Body) if erro != nil {
fmt.Println("http wrong erro") return erro.Error() } return string(body)}func httpPost(requesturl string, params map[string]interface{
}) string {
b, err := json.Marshal(params) if err != nil {
fmt.Errorf("json.Marshal failed[%v]", err) return err.Error() } req, err := http.NewRequest("POST", requesturl, strings.NewReader(string(b))) req.Header.Set("Content-Type", "application/json") transport := http.Transport {
Dial: dialTimeout, DisableKeepAlives: true, } client := &http.Client{
Transport: &transport, Timeout: time.Duration(30) * time.Second} resp, err := client.Do(req) if err != nil {
fmt.Println(err) return err.Error() } defer resp.Body.Close() body, erro := ioutil.ReadAll(resp.Body) if erro != nil {
fmt.Println("http wrong erro") return erro.Error() } return string(body)}func sendRequest(requesturl string, params map[string]interface{
}, method string) string {
response := "" if method == "GET" {
params_str := "?" + ParamsToStr(params) requesturl = requesturl + params_str response = httpGet(requesturl) } else if method == "POST" {
response = httpPost(requesturl, params) } else {
fmt.Println("unsuppported http method") return "unsuppported http method" } return response}

字数超过一定量无法合成

参考网址:

百度

谷歌

转载地址:http://bxkpi.baihongyu.com/

你可能感兴趣的文章
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
关于无线PCB中 中50欧姆的特性阻抗的注意事项
查看>>
Spring的单例模式源码小窥
查看>>
后台服务的变慢排查思路(轻量级应用服务器中测试)
查看>>
MySQL中InnoDB事务的默认隔离级别测试
查看>>
微服务的注册与发现
查看>>
bash: service: command not found
查看>>
linux Crontab 使用 --定时任务
查看>>
shell编程----目录操作(文件夹)
查看>>
机器学习-----K近邻算法
查看>>
HBASE安装和简单测试
查看>>
关于程序员的59条搞笑但却真实无比的编程语录
查看>>
搞笑--一篇有趣的文章编译自一篇西班牙博客。有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
查看>>
非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
查看>>