本文為您介紹離線語音合成的常見問題和解答。
合成初始化失敗通常有哪些原因?
原因 | 詳述 |
鑒權失敗 |
|
資源問題 |
|
常見的鑒權失敗情況有哪些?
注冊失敗的原因通常包括以下情況:
參數設置不正確:例如Appkey錯誤或Appkey對應的項目為設備端解決方案類型。
注冊次數超過限制:管控臺對單臺設備每日注冊次數有限制。
沒有配額:用戶配額超過申請上限。
沒有網絡:注冊是需要聯網的。
下表給出了常見的錯誤信息(初始化失敗時,可以通過“error_msg”獲取):
日志錯誤信息 | 含義 |
register_over_frequency | 注冊次數超過限額,詳情請參見一個Deviceid一天可以注冊幾次。 |
AccessKeyId is mandatory for this action | AccessKey不正確,配置信息錯誤。 |
quota not-enough | 配額不足。 |
sdk_type_err | sdk_code不正確。請確認開通的是標準版(software_nls_tts_offline_standard)還是精品版(software_nls_tts_offline)。 |
Specified signature is not matched with our calculation | 請校驗AccessSecret是否填寫正確。 |
unit_not_exist | Appkey沒有申請過配額。 |
初始化成功但是播報失敗該如何處理?
請核對語音包名稱及路徑是否設置正確。SDK和語音包是完全獨立的,SDK里并沒有預置語音包。
回調數據長度和時間對應關系是怎樣的?
以采樣率16000的pcm,每次回調8000個字節為例,一秒鐘包含字節數:16000×sizeof(short)=32000個,所以8000個字節對應時間:8000/32000秒=250毫秒。
配額消耗的規則是什么?
設備標識(Deviceid)每發生一次變更,就會消耗一個配額。設備標識是進行管控的有效憑證,SDK使用者要保證設置的device_id有效性和唯一性,否則可能導致占用多個配額,甚至鑒權失敗。
調用者可能要考慮以下場景:
起初獲取不到設備信息,后獲取權限,Deviceid變化。
已獲取設備ID權限,但用戶關閉,Deviceid變化。
Android Q升級后,App端突然獲取不到有效設備信息,Deviceid變化。
一個Deviceid一天可以注冊幾次?
單個Deviceid每日只能注冊5次。如已注冊成功,設備卸載App并重新安裝,將消耗一次注冊機會,當5次機會消耗完后,只能等到24:00以后才能重新注冊。
如果App不卸載,第一天登錄和第二天登錄分別會注冊幾次?
App注冊成功之后,若有存儲權限,鑒權信息成功保存至本地,不需要再次聯網注冊,可以永久使用。
配額消耗耗盡還能增加嗎?
當一個Appkey對應的配額消耗完畢時,可以重新購買配額,系統將按照合同約定,增加相應的配額 。
申請離線配額后,能直接訪問在線語音服務嗎?
申請離線配額后,不關聯在線語音服務(如在線合成、在線語音識別等),如果想使用在線語音服務需要額外購買相應的服務。
已經投入使用的在線語音服務Appkey可以用于申請離線配額嗎?
除設備端解決方案外的其他Appkey可以。如果之前使用的是設備端解決方案的Appkey,需要重新申請一個僅語音合成的Appkey,詳情請參見創建項目。
SDK是如何進行打點的?
為什么進行打點?
方便問題排查:因為上線后通常會關閉log,能獲取的信息比較有限,打點能更方便地排查問題。
為發音人優化提供有效依據:例如xiaoyun這個發音人,如果大部分用戶都調音量,說明該語音包默認音量偏小。
統計latency,優化設備合成速度:如latency過高,可能會出現卡頓等問題,可以給用戶提供優化方案;如大部分設備都出現卡頓,則引導調整算法等。
打點會影響主流程嗎?
不會。打點是嘗試性的,打點時機在初始化成功和初始化失敗時,沒有網絡則直接退出。為減少資源消耗,打點內容小于1 KB。
打點內容包含哪些?
本著最小資源消耗,及充分保護用戶隱私的原則,SDK打點不涉及用戶任何信息,主要內容包括:
類別
觸發時機
內容
初始化錯誤原因
初始化失敗時
初始化失敗詳細信息
errror_msg:詳細的錯誤信息
auth_time:鑒權耗時
inittime:初始化耗時
統計信息
初始化成功時:用戶已經開始進行合成,因此異步嘗試發送上次合成任務的統計信息
sdk_ver:使用的SDK版本
font:發音人
format:音頻格式
speed:語速
volume:音量
latency:延遲,反映設備性能
sample_rate:采樣率
length:合成長度
call_time:合成次數
打點可以關閉嗎?
打點默認是開啟的,SDK提供了關閉打點的接口。如果用戶認為影響了主流程或者仍然擔心隱私問題,可在生成初始化參數的時候,傳入字段enable_et,并將值設為false,即可關閉該功能。代碼如下:
/** * @brief :按此方式填寫鑒權信息 * @param assets:資源存儲路徑,指配置文件及資源存放路徑 * @return std::string :打包成json格式的鑒權信息 */ std::string GenAuthInfo(const char *assets) { nuijson::Value root; std::string info; if (assets) { /* * 調用接口前,需配置環境變量,通過環境變量讀取訪問憑證。 * 智能語音交互的AccessKey ID、AccessKey Secret和AppKey的環境變量名:NLS_AK_ENV、NLS_SK_ENV、NLS_APPKEY_ENV */ root["ak_id"] = getenv("NLS_AK_ENV"); // ak_id也就是阿里云賬號的AccessKey ID,和ak_secret對應,請注意不要設置成阿里云主賬號ID(uid) root["ak_secret"] = getenv("NLS_SK_ENV"); root["app_key"] = getenv("NLS_APPKEY_ENV"); root["workspace"] = assets; root["sdk_code"] = "software_nls_tts_offline"; // 離線tts使用software_nls_tts_offline root["device_id"] = "012345678911a"; // 設備唯一標識,如Mac地址,cpu序列號等 root["enable_et"] = "false"; // 打點默認是開啟的,當設為false時關閉 nuijson::FastWriter writer; info = writer.write(root); printf("info:%s\n", info.c_str()); } return info; }
打點示例
一個初始化錯誤的打點內容如下:
{ "common": { "appcode": "026", "funcode": "6888", // 該SDK具備功能 "sdk_code": "software_nls_tts_offline", "sdk_ver": "V2.5.14-026-20210327" // 對應SDK版本號 }, "content": { "tts": [ { "auth_time": "277", // 鑒權花費277ms,該值為監控鑒權服務提供有效依據 "error_msg": "(170007)Specified access key is not found.-->(170800)register-failed-->(140008)tts-auth failed", // 詳細的錯誤信息,一目了然是用戶沒有設置appkey,加快問題排查速度 "init_time": "277" // 整個初始化耗時,包括“鑒權+資源加載” } ] } }
一個基于統計的打點內容如下:
{ "common": { "appcode": "026", "funcode": "4840", "sdk_code": "software_nls_tts_offline", "sdk_ver": "V2.5.14-026-20210326" }, "content": { "tts": [ { "call_time": "1", "font": "xiaoyun", "format": "pcm", "latency": "6", "length": "168640", "mode": "local", "pitch": "0", "sample_rate": "16000", "speed": "1", "volume": "1" } ] } }
NTP的作用是什么?
NTP:網絡時間協議(Network Time Protocol)
TTS SDK在首次使用時,需要訪問阿里云鑒權,阿里云要求本地時間和阿里云時間差不能超過15分鐘,否則會鑒權失敗,因此SDK使用NTP模塊獲取網絡時間。
需要注意的是,因為NTP本身和阿里云交互有一定時間消耗,網絡差的時候可能長達十幾秒。因此需要業務方綜合評估,如果端側時間不會存在異常,或者概率極小的設備時間異常對業務沒有影響,可以在初始化的時候通過將enable_ntp設為false,即關閉NTP。