語音合成
更新時間 2025-10-20 10:46:24
最近更新時間: 2025-10-20 10:46:24
分享文章
語音合成(Text To Speech,TTS)將文本轉成擬人化的語音。
1、接口描述
語音合成(Text To Speech,TTS)將文本轉成擬人化的語音。目前僅支持中文語音合成,提供三種音色的選擇(包含一個男聲,兩個女聲),支持自定義語調、語速等參數,支持SSML標記語言功能。
2、請求方法
POST
3、接口要求
目前僅支持 base64 編碼方式請求
一次請求僅支持一條數據
4、URI
/v1/aiop/api/2z0yhhrzgv0g/tts/predict
5、請求參數
請求頭header參數
| 參數 | 是否必填 | 參數類型 | 說明 | 示例 | 下級對象 |
|---|---|---|---|---|---|
| Content-Type | 是 | String | json 格式 | application/json | |
| appkey | 是 | String | 應用appkey | 562b89493b1a40e1b97ea05e50dd8170 | |
| ctyun-eop-request-id | 是 | String | 用戶請求 id,由用戶構造,用戶可以通過 uuid 等方法自行生成唯一字符串,用于日志請求追蹤。 詳見文檔:Python3調用示例 | 33dfa732-b27b-464f-b15a-21ed6845afd5 | |
| eop-date | 是 | String | 請求時間,由用戶構造,形如 yyyymmddTHHMMSSZ。 詳見文檔:Python3調用示例 | 20211221T163014Z | |
| host | 是 | String | 終端節點域名,固定字段 | ai-global.ctapi.daliqc.cn | |
| Eop-Authorization | 是 | String | 由天翼云官網 accessKey 和 securityKey 經簽名后生成,參與簽名生成的字段包括天翼云官網 accessKey 、securityKey、平臺應用的appkey(非必須),用戶請求 id(非必須),請求時間,終端節點域名(非必須)以及請求體內容。 簽名邏輯詳見文檔:認證鑒權和Python3調用示例 |
請求體body參數
| 參數 | 是否必填 | 參數類型 | 說明 | 示例 | 下級對象 |
|---|---|---|---|---|---|
| Action | 是 | String | 算法名稱,固定值"TTS" | TTS | |
| TextData | 是 | String | 支持中文語音合成。合成語音的文本,按 UTF-8 編碼,最小支持 3 個字符,最多支持 300 個字符(聲音類型為2、3、4)。 漢字、英文、數字、標點均等同于一個字符。 強烈建議輸入文本加上標點符號,便于合成更正確的語音數據。 支持SSML標記語言輸出 | 今晚去吃火鍋嗎 | |
| VoiceType | 是 | Int | 聲音類型,取值2、3、4。2為甜美女聲,3為溫柔女聲,4為磁性男聲 | 2 | |
| Pitch | 否 | Float | 語調。返回范圍 [0.8, 2],默認值為 1.0 | 1.0 | |
| Speed | 否 | Float | 語速。返回范圍 [0.5, 2],默認值為 1.0 | ||
| Volume | 否 | int | 音量。返回范圍[-5, 5],默認值為 0,表示正常音量。值越大表示音量越大,值越小表示音量越小。取值為 -5 時為音量最小值,并非為無聲。 |
TextData支持SSML語言輸入:
| 標簽 | 功能描述 | 語法示例 |
|---|---|---|
| <speak> | 所有待使用SSML標簽的根節點,一切需要調用SSML標簽的文本都要包含在<speak></speak>中 | <speak>需要調用SSML標簽的文本</speak> |
| <break> | 在指定位置插入停頓,插入處至少一側需為中文文本 | <speak>那我<break/>打這個視頻電話的意義在哪里?</speak> |
| <word> | 指定文本連續讀,中間沒有任何停頓。僅支持中文 | <speak>那<word>我打這個</word>視頻電話的意義在哪里?</speak> |
| <phoneme> | 用拼音指定字的讀音,其中用數字(1-5)分別代表一至四聲調和輕聲,寫在拼音末尾。連續指定多個字時,拼音用空格隔開。僅支持中文 | <speak><phoneme alphabet="py" ph="dian3 dang4 hang2">典當行</phoneme>典當<phoneme alphabet="py" ph=“xing2”>行</phoneme></speak> |
| <say-as> | 指定數字是一個個讀還是整體讀 | 一個個讀:<speak><say-as interpret-as="digits">12345</say-as></speak> 整體讀:<speak><say-as interpret-as="cardinal">12345</say-as></speak> |
| <say-as> | 指定英文按照一個個字母讀 | 按照字母讀: <speak><say-as interpret-as="characters">app</say-as></speak> |
| <prosody> | 指定速度,僅支持純中文。其中速度值需為50%-200%間的百分數 | <speak><prosody rate="190%">如同愛人的鼻息吹著我</prosody></speak> |
| <sub> | 使用指定的別名代替原文本進行語音合成 | 文本語音合成代替TTS進行語音合成: <speak><sub alias="語音合成">TTS</sub></speak> |
使用SSML標記語言的文本中不要再使用‘<>’,否則會出現格式解析錯誤。
6、請求代碼示例
Curl -X POST
"//ai-global.ctapi.daliqc.cn/v1/aiop/api/2z0yhhrzgv0g/tts/predict"
-H "Content-Type: application/json"
-H "ctyun-eop-request-id:33dfa732-b27b-464f-b15a-21ed6845afd5"
-H "appkey:XXX"
-H "Eop-Authorization:XXX"
-H "eop-date:20211109T104641Z"
-H "host:ai-global.ctapi.daliqc.cn"
--data '{"Action": "TTS", "TextData": "今晚去吃火鍋嗎", "VoiceType":"2"}'7、返回值說明
請求成功返回響應參數
| 參數 | 是否必填 | 參數類型 | 說明 | 示例 | 下級對象 |
|---|---|---|---|---|---|
| statusCode | 是 | Int | 返回狀態,返回 0 表示成功,返回錯誤代碼參考下面的錯誤代碼列表 | 0 | |
| message | 是 | String | 如果statusCode 為 0,返回 success;如果 statusCode非 0,則返回對應的可讀錯誤信息 | success | |
| returnObj | 是 | Object | 返回結果對象 | returnObj |
表returnObj
| 參數 | 是否必填 | 參數類型 | 說明 | 示例 | 下級對象 |
|---|---|---|---|---|---|
| Audio | 是 | String | 語音編碼數據。Base64 編碼的 wav 格式音頻數據 | "_9j_4AAQSkZJRgA......Zuv_9k=" |
請求失敗返回響應參數
| 參數 | 是否必填 | 參數類型 | 說明 | 示例 | 下級對象 |
|---|---|---|---|---|---|
| statusCode | 是 | Int | 錯誤碼,放置API對應的錯誤碼 | 500001 | |
| message | 是 | String | 返回對應的錯誤信息 | 服務接口異常,請聯系管理員 | |
| details | 是 | String | 返回對應的錯誤描述 | 需要聯系管理員處理 | |
| error | 是 | String | 返回對應的錯誤碼 | AI_OP_500001 |
8、返回值示例
請求成功返回值示例
{
"statusCode": 0,
"message": "success",
"returnObj": {
"Audio": "_9j_4AAQSkZJRgA......Zuv_9k="
}
}請求失敗返回值示例
{
"statusCode": 400003,
"message": "Body 內容為空",
"details": "Body 請求數據為空,沒有包含內容",
"error":"AI_OP_400003"
}9、狀態碼
| http狀態碼 | 描述 |
|---|---|
| 200 | 表示請求成功 |
10、錯誤碼說明
6 位錯誤碼。4 開頭為業務錯誤碼,5 開頭為服務錯誤碼。
| 錯誤碼 | 錯誤信息 | 錯誤描述 |
|---|---|---|
| AI_OP_400003 | 請求體內容為空 | 請求體請求數據為空,沒有包含內容 |
| AI_OP_400004 | 請求體非 json 格式 | 請求體內容需要符合 json 要求 |
| AI_OP_400005 | 請求體類型錯誤 | 請求體需為字典,不能為其他類型 |
| AI_OP_400006 | 必傳的參數未傳 | 必須的參數(Action、TextData)未傳 |
| AI_OP_400008 | 請求體的參數字段類型錯誤 | 請求體的參數字段類型錯誤 |
| AI_OP_400009 | 請求體的參數字段值為空 | 請求體的參數字段值為空 |
| AI_OP_400010 | 請求體的參數字段值設置錯誤 | 請求體的參數字段值設置錯誤 |
| AI_OP_420001 | 文本長度超過限制 | 文本輸入過長,請參考接口文檔說明 |
| AI_OP_420002 | 文本長度低于閾值 | 文本輸入過短,請參考接口文檔說明 |
| AI_OP_500001 | 服務接口異常,請聯系管理員 | 需要聯系管理員處理 |
base64 解碼規則:使用常規的 safe base64 編碼方式
python 中推薦使用
base64.urlsafe_b64decode()函數進行編碼java 中推薦使用
BASE64.getUrlDecoder().encodeToString()函數進行編碼語音合成服務調用收到的base64編碼轉為wav格式音頻python示例:
import json
import base64
if __name__ == "__main__":
filename = "result.json" # 調用后的 json 結果
with open(filename, 'r') as file:
data = json.load(file)
audio_base64 = data["result"]["Audio"] # 獲取返回結果中的 base64
audio_wav = base64.urlsafe_b64decode(audio_base64) # 解碼
with open("output.wav", "wb") as f: # 保存音頻為 wav 格式
f.write(audio_wav)