请先查看接入必读了解具体接入方式,再参考此文档完成接入。
MemeSong
为用户提供文本转歌曲的歌唱合成能力,该API目前支持非流式、中文合成。
当前支持通过 HTTP 协议在线调用
请求内容包括:payload
字段为将请求参数序列化后的json文本
使用备注:
注意项 | 说明 | |
---|---|---|
功能 | 限制说明 |
|
输出 | 结果格式 | 详情请参考响应格式 |
参考详细说明功能调用-通用协议。
payload
配置参数为json字符串格式
字段 | 描述 | 类型 | 是否必传 | 默认值 |
---|---|---|---|---|
text | 输入文本 | string | 是 | - |
speaker | 发音人,具体见附录:发音人列表 | string | 是 | - |
song_name | 歌曲名称,具体见附录:歌曲列表 | string | 是 | - |
audio_config | 补充参数 | object | 否 | - |
audio_config.format | 输出音频编码格式,wav/mp3/aac | string | 否 | mp3 |
audio_config.sample_rate | 输出音频采样率,8000/16000/22050/24000/32000/44100/48000 | number | 否 | 24000 |
HTTP响应Content-Type: application/json
字段 | 描述 | 类型 |
---|---|---|
task_id | 请求任务id,用于链路追踪、问题排查 | string |
namespace | 服务接口命名空间,MemeSong | string |
data | 请求响应二进制数据,标准base64编码 | string |
payload | 请求响应文本信息,json字符串格式 | string |
status_code | 状态码 | number |
status_text | 状态信息 | string |
调用方式为:POST /api/v1/invoke
// Code sample: // use http client to invoke SAMI HTTP Service package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "log" "net/http" "time" ) type InvokeResponse struct { StatusCode int32 `form:"status_code,required" json:"status_code,required" query:"status_code,required"` StatusText string `form:"status_text,required" json:"status_text,required" query:"status_text,required"` TaskId string `form:"task_id,required" json:"task_id,required" query:"task_id,required"` Namespace string `form:"namespace,required" json:"namespace,required" query:"namespace,required"` Payload *string `form:"payload,omitempty" json:"payload,omitempty" query:"payload,omitempty"` Data []byte `form:"data,omitempty" json:"data,omitempty" query:"data,omitempty"` State *string `form:"state,omitempty" json:"state,omitempty" query:"state,omitempty"` } const ( domain = "https://sami.bytedance.com" // auth token appkey = "your_appkey" // SAMI method version = "v4" namespace = "MemeSong" // dump output dataOutputFile = "output.wav" payloadOutputFile = "output.json" isDump = true ) func main() { // Get token token := "your_token" // Construct HTTP request // 1. Read local audio file and construct request payload // 2. Set HTTP json body // 3. Do HTTP POST request speaker := "zh_female_sing_qingxin" songName := "xinnianhao_f" text := "老师下课后内容没讲完就拖长了课堂 昨天晚上睡觉前我调好了闹钟 过去我是一个小懒猪 每天早上都会赖床" body := fmt.Sprintf( `{"payload":"{\"speaker\":\"%v\",\"song_name\":\"%v\",\"text\":\"%v\",\"audio_config\": {\"format\":\"wav\"}}"}`, speaker, songName, text, ) urlPath := fmt.Sprintf( "%v/api/v1/invoke?version=%v&token=%v&appkey=%v&namespace=%v", domain, version, token, appkey, namespace, ) log.Printf("invoke request: %v", urlPath) // HTTP POST request start := time.Now() resp, err := http.Post(urlPath, "application/json", bytes.NewBuffer([]byte(body))) if err != nil { panic(err) } defer resp.Body.Close() // Parse HTTP response ret, err := ioutil.ReadAll(resp.Body) if err != nil || resp.StatusCode != http.StatusOK { panic(string(ret)) } log.Printf("http invoke: cost=%vms", time.Since(start).Milliseconds()) // parse SAMI response samiResp := InvokeResponse{} payloadStr := "" if err = json.Unmarshal(ret, &samiResp); err != nil { log.Println("parse response failed", string(ret), err) panic(err) } if samiResp.Payload != nil { payloadStr = *samiResp.Payload } log.Printf("response task_id=%v, payload=%v, data=[%d]byte", samiResp.TaskId, payloadStr, len(samiResp.Data)) if isDump && samiResp.Payload != nil { _ = ioutil.WriteFile(payloadOutputFile, []byte(*samiResp.Payload), 0644) } if isDump && len(samiResp.Data) > 0 { _ = ioutil.WriteFile(dataOutputFile, samiResp.Data, 0644) } }
场景 | 发音人 | 语种 | 性别 | 调用参数speaker |
---|---|---|---|---|
通用 | 清新女声 | 中英混 | 女 | zh_female_sing_qingxin |
活力男声 | 中英混 | 男 | zh_male_sing_huoli | |
女高音 | 中英混 | 女 | zh_female_sing_soprano |
歌曲名称 | 调用参数song_name |
---|---|
找朋友 | zhaopengyou |
闹新年 | naoxinnian |
新年好 | xinnianhao_f |
爱的礼赞 | salut_damour-5 |
Susanna | susanna |
夜后的咏叹调 | queen_of_night |
洋娃娃和小熊跳舞 | bear_dance |