语音合成(TTS, Text to Speech),能将文本转换成人类声音。它运用了语音合成领域突破性的端到端合成方案,能提供高保真、个性化的音频。
本实验实现将文本转换成语音。
进入语音技术控制台,创建应用,如下:
到语音合成界面,选择第一步创建的应用,获取相关信息,如下:
使用TTS HTTP 接口进行接入。
package main import ( "bufio" "bytes" "encoding/base64" "encoding/json" "errors" "fmt" "github.com/satori/go.uuid" "io" "io/ioutil" "net/http" "os" "time" ) //TTSServResponse response from backend srvs type TTSServResponse struct { ReqID string `json:"reqid"` Code int `json:"code"` Message string `json:"Message"` Operation string `json:"operation"` Sequence int `json:"sequence"` Data string `json:"data"` } func httpPost(url string, headers map[string]string, body []byte, timeout time.Duration) ([]byte, error) { client := &http.Client{ Timeout: timeout, } req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(body)) if err != nil { return nil, err } for key, value := range headers { req.Header.Set(key, value) } resp, err := client.Do(req) if err != nil { return nil, err } defer resp.Body.Close() retBody, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } return retBody, err } func synthesis(text string) ([]byte, error) { //var e1 error reqID := uuid.Must(uuid.NewV4()).String() //r1 := uuid.Must(uuid.NewV4(),e1) params := make(map[string]map[string]interface{}) params["app"] = make(map[string]interface{}) params["app"]["appid"] = "123456" //这部分的token不生效,填写下方的默认值就好 params["app"]["token"] = "access_token" params["app"]["cluster"] = "volc_xxxx" params["user"] = make(map[string]interface{}) params["user"]["uid"] = "uid" params["audio"] = make(map[string]interface{}) params["audio"]["voice"] = "other" params["audio"]["voice_type"] = "BV001" params["audio"]["encoding"] = "mp3" params["audio"]["speed"] = 10 params["audio"]["volume"] = 10 params["audio"]["pitch"] = 10 params["request"] = make(map[string]interface{}) params["request"]["reqid"] = reqID params["request"]["text"] = text params["request"]["text_type"] = "plain" params["request"]["operation"] = "query" headers := make(map[string]string) headers["Content-Type"] = "application/json" //bearerToken为平台对应的接入认证中的Access Token headers["Authorization"] = fmt.Sprintf("Bearer;%s", "xxxxxxxxxxxxxxxxxxx") // URL查看上方第四点: 4.并发合成接口(POST) url := "https://openspeech.bytedance.com/tts_middle_layer/tts" timeo := 30*time.Second bodyStr, _ := json.Marshal(params) synResp, err := httpPost(url, headers, []byte(bodyStr), timeo) if err != nil { fmt.Printf("http post fail [err:%s]\n", err.Error()) return nil, err } fmt.Println(params["request"]["text"]) var respJSON TTSServResponse err = json.Unmarshal(synResp, &respJSON) if err != nil { fmt.Printf("unmarshal response fail [err:%s]\n", err.Error()) return nil, err } code := respJSON.Code if code != 3000 { fmt.Printf("code fail [code:%d]\n", code) return nil, errors.New("resp code fail") } audio, _ := base64.StdEncoding.DecodeString(respJSON.Data) return audio, nil } func main() { filepath := "/Users/Documents/xxxx.txt" file,err := os.Open(filepath) if err != nil{ fmt.Println(err) } defer file.Close() reader := bufio.NewReader(file) buf := make([]byte,300) fmt.Println(string(buf)) f, err := os.OpenFile("test10.mp3", os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm) if err != nil{ fmt.Println(err) } defer func() { f.Close() fmt.Println("文件关闭") }() for{ read,err := reader.Read(buf) if err !=nil && err != io.EOF{ fmt.Println(err) } if read == 0{ break } audio,err := synthesis(string(buf)) f.Write(audio) } }
参考文档:
[1] http接口
如果您有其他问题,欢迎您联系火山引擎技术支持服务