本文匯總了您在使用SDK時可能遇到的常見問題。
公共類
如何使用SDK設置泛熱詞?
SDK中使用POP API訓練的泛熱詞,是通過控制臺配置的業務專屬熱詞表與項目Appkey綁定的,您無需自行設置;而通過POP API訓練獲取的業務專屬熱詞表,需要在SDK中設置其詞表ID,且SDK設置熱詞的優先級更高,若與控制臺一起使用,將覆蓋控制臺設置結果。請參考使用SDK設置業務專屬熱詞,將為您介紹在一句話識別、實時語音識別、錄音文件識別中如何設置泛熱詞。
SDK報錯“DNS resolved timeout”是什么問題?
查看/etc/resolv.conf
文件中nameserver的設置,建議增加并優先使用以下配置:nameserver 114.114.114.114
。
如何使用SDK設置自學習模型?
如果是通過控制臺創建的自學習模型,可在項目切換模型時選擇該模型,發布上線后將與Appkey綁定,您無需在代碼中自行設置;而通過POP API訓練獲取的自學習模型,需要在SDK中設置其模型ID才可以使用。請參考使用SDK 2.0設置自學習模型,將為您介紹在一句話識別、實時語音識別、錄音文件識別中如何設置自學習模型。
是否有Android和iOS的SDK,能否用在專有云下?
有SDK,在專有云安裝包里默認不提供,可以通過阿里云幫助中心對應的服務文檔中下載,如實時語音識別的Android SDK和iOS SDK。移動端SDK可以調用公共云ASR、TTS服務,也可以用在專有云環境下。
Token如何使用?
公共云Token在不同項目間、不同進程間、不同線程間都可以共用,同時一定要注意在Token過期前提前重新獲取Token;出于安全考慮,建議您在服務端集成Token SDK,客戶端在服務端獲取Token。詳情請參見獲取Token。
專有云Token目前默認都是default,暫時無需修改。
Token重新獲取會不會導致已獲取的Token失效?
Token重新獲取不會影響已獲取Token的有效性,有效性只與時間有關。Token的有效期通過服務端響應消息的ExpireTime
參數獲取。更多信息,請參見獲取Token協議說明。
是否可以提供服務的IP白名單?
服務器的IP比較多,且會隨著擴容、機器故障置換等原因動態變化,當前的IP列表不代表后續都可以使用。建議增加以下兩個域名的訪問規則:nls-meta.cn-shanghai.aliyuncs.com、nls-gateway-cn-shanghai.aliyuncs.com,開通80、443端口,HTTP和websocket協議。
如何進行log控制與音頻保存?
SDK提供多級log控制,在初始化接口中配置。
同時提供音頻數據的保存方便問題定位,需要設置save_wav和debug_path初始化參數,詳情請參見接口說明。
實時語音識別的save_wav和debug_path參數含義與一句話識別相同。
調用上有什么限制?
SDK已經對語音服務的訪問做了封裝,對您而言只要調用開始接口,在回調中進行適當事件處理。一般需要處理錯誤事件和識別結果事件。注意不能在回調中直接調用SDK的接口,可能導致死鎖發生。
為什么鏈接不到framework?
framework中代碼采用Objective-C和C++混合編寫而成,所以需要使用.mm后綴文件進行調用,同時請確保工程的頭文件路徑與庫文件路徑設置正確。
SDK錯誤事件如何定位原因?
在SDK上報錯誤事件時,首先根據錯誤碼查看原因,一般能夠根據錯誤碼獲得問題的初步原因。
Java SDK類
一句話識別、實時語音識別SDK中,send接口參數含義及使用方式?
以Java為例。java SDK中,一句話識別和實時語音識別分別提供了三個重載的send()
接口。如下:
public void send(InputStream ins);
public void send(InputStream ins, int batchSize, int sleepInterval);
public void send(byte[] data);
三個接口使用時要保證持續、實時地向服務端發送語音數據。
demo是用語音文件模擬實時語音流的速度發送語音,通常一次發送間隔時間為100ms或200ms(sleepInterval)的語音數據,數據量(batchSize)和采樣率有關:發送間隔過大,會導致延遲較大,容易斷連;發送間隔過小,會消耗服務端和網絡資源。可以適當實驗調整到合適數值。
第2個接口中ins
為模擬語音流,需要控制發送速率。ins中的數據每間隔100ms,發送3200字節(16000采樣率)。調用示例:
public void send(ins, 3200, 100); // 16 KHz語音
第3個接口中data
為一次性發送的數據,控制循環調用的間隔,調用示例:
recognizer.send(data); // 100ms語音數據
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
如何結合SDK日志,分析延遲問題?
以Java SDK日志為例。
一句話識別的延遲為一句話說完開始,到收到最終識別結果為止,消耗的時間。
在日志中搜索關鍵字
StopRecognition
以及RecognitionCompleted
,分別找到語音發送完畢時的日志,以及一句話識別結束的日志。記錄的時間差即為SDK端記錄的一句話延時,如下日志延遲為:984-844=140(ms)。14:24:44.844 DEBUG [ main] [c.a.n.c.transport.netty4.NettyConnection] thread:1,send:{"header":{"namespace":"SpeechRecognizer","name":"StopRecognition","message_id":"bccac69b505f4e2897d12940e5b38953","appkey":"FWpPCaVYDRp6J1rO","task_id":"8c5c28d9a40c4a229a5345c09bc9c968"}} 14:24:44.984 DEBUG [ntLoopGroup-2-1] [ c.a.n.c.p.asr.SpeechRecognizerListener] on message:{"header":{"namespace":"SpeechRecognizer","name":"RecognitionCompleted","status":20000000,"message_id":"2869e93427b9429190206123b7a3d397","task_id":"8c5c28d9a40c4a229a5345c09bc9c968","status_text":"Gateway:SUCCESS:Success."},"payload":{"result":"北京的天氣。","duration":2959}}
語音合成關注首包延遲,即從發送合成請求開始,到收到第一個語音包為止,消耗的時間。
日志中搜索關鍵字
send
,找到這條日志和緊隨其后的一條收到語音包的日志。記錄的時間差即為SDK端記錄的首包延時。如下日志延時為1035-813=222(ms)。14:32:13.813 DEBUG [ main] [c.a.n.c.transport.netty4.NettyConnection] thread:1,send:{"payload":{"volume":50,"voice":"Ruoxi","sample_rate":8000,"format":"wav","text":"國家是由領土、人民、文化和政府四個要素組成的,國家也是政治地理學名詞。從廣義的角度,國家是指擁有共同的語言、文化、血統、領土、政府或者歷史等的社會群體。從狹義的角度,國家是一定范圍內的人群所形成的共同體形式。"},"context":{"sdk":{"name":"nls-sdk-java","version":"2.1.0"},"network":{"upgrade_cost":160,"connect_cost":212}},"header":{"namespace":"SpeechSynthesizer","name":"StartSynthesis","message_id":"6bf2a84444434c0299974d8242380d6c","appkey":"FWpPCaVYDRp6J1rO","task_id":"affa5c90986e4378907fbf49eddd283a"}} 14:32:14.035 INFO [ntLoopGroup-2-1] [ c.a.n.c.protocol.tts.SpeechSynthesizer] write array:6896
實時語音識別SDK日志類似一句話識別,可以從日志中計算語音末尾處延遲(關鍵字:
StopTranscription
和TranscriptionCompleted
)。RESTful形式訪問,客戶端自帶日志中沒有體現延遲。需要用戶自己編寫代碼,或者查看服務端日志。
Java SDK找不到com.alibaba的JAR包,如何安裝Alibaba Cloud SDK for Java?
請參見原版 SDK 使用指南安裝Alibaba Cloud SDK for Java。
使用Java SDK調用SpeechRecognizer.stop方法時出現連接超時,提示timeout after 10 seconds waiting for complete confirmation. state:STATE_STOP_SENT如何解決?
state:STATE_STOP_SENT
代表數據斷開連接。如果10秒內系統未接到數據,請優先排查網絡是否穩定,如偶發可能由于網絡抖動引起。
錄音文件轉寫接口Java SDK Demo運行報錯如何排查?
檢查智能語音交互服務開通地和代碼使用是否一致。
檢查SDK的
fastjson
和aliyun-java-sdk-core
兩個庫的依賴版本。阿里云Java SDK的核心庫版本支持3.5.0及以上(如果版本在4.0.0及以上,需要根據錯誤提示補充對應的第三方依賴),詳情請參見錄音文件識別Java SDK。<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.7.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
實時語音識別使用Java SDK,SpeechRecognizer recognizer如何調用stop()實現通知服務端語音數據發送完畢?
正常情況下自動調用,不需要單獨調用stop()。如果10秒之內沒有語音數據發給服務側, 會報錯41010120。如果一直實時發送語音數據給服務端,識別在服務側是一直進行的,您可以通過設置
enable_intermediate_result=true
參數實時獲取識別結果。如果您判斷一句話結束,也可以主動調用stop()停止發送數據,獲取最終識別結果。
實時流識別模式,Java SDK中如何觸發回調onTranscriptionComplete?
onTranscriptionComplete
可以通過stop觸發,狀態為STATE_STOP_SENT
,回調處理完狀態為STATE_COMPLETE
。
調用Java SDK時報錯,提示java.lang.IllegalStateException: complete already: DefaultChannelPromise@75822ea8(failure: java.lang.Exception: WebSocket Client failed to connect,status:403 Forbidden,reason:Meta:ACCESS_DENIED:The token '***' is invalid!)"如何解決?
報錯原因是Token無效,請重新生成一個Token,具體操作方法請參見獲取Token。
在生成synthesizer = new SpeechSynthesizer時一直失敗,提示java.nio.channels.ClosedChannelException如何解決?
建議您使用Java環境,并使用Demo在新的空項目中進行測試。如果測試Demo沒有問題,說明不是SDK集成問題,建議您檢查客戶端的前端集成情況。
在測試實時語音識別和語音合成功能時,對應JAR包在哪里?
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-java-examples</artifactId>
<version>2.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-example-tts</artifactId>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>com.alibaba.nls</groupId>
<artifactId>nls-sdk-tts</artifactId>
<version>${sdk.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.alibaba.nls.client.SpeechSynthesizerMultiThreadDemo</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Java SDK實時識別NlsClient類去連接server報錯, 提示ERROR NlsClient:102 - failed to connect to server after 3 tries,error msg is :hostname can't be null如何解決?
如果您不再使用Demo,需要指定hostname
,即請求阿里語音服務側的接口。
接口詳情請參見wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1
或實時語音識別Java SDK。
Java SDK語音合成報錯,提示java.nio.channels.ClosedChannelException at io.netty.channel.AbstractChannel$AbstractUnsafe.ensureOpen(...)如何解決?
如果未生成TaskId,說明請求未成功到達智能語音交互的服務端,一般為本地環境問題。建議您優先排查本地網絡和環境,將線上Demo和本地對比檢查。
Java SDK通過傳入阿里云賬號的AccessKey ID和AccessKey Secret,調用阿里云Java SDK得到client提示錯誤org.json.JSONArray.iterator()Ljava/util/Iterator如何解決?
請確認依賴包是否完整,查找并添加如下兩個依賴JAR包。
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20170516</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
Java版SDK可以直接提供上傳音頻文件的方式進行識別嗎?
如下圖所示,SDK示例通過調用RESTfulAPI接口,實現上傳音頻文件進行識別,詳情請參見一句話識別Java SDK。
使用Java Demo識別錄音文件沒有識別結果,使用文檔中的語音文件識別可以正常識別,該如何解決?
您可以使用file
命令查看語音格式,檢查該格式是否符合產品要求。模型支持的標準8K數據格式為8 KHz采樣率、16 bit采樣位數、單聲道WAV格式;16K語音數據標準格式為16 KHz采樣率、16 bit采樣位數、單聲道WAV格式。如果測試使用,可以使用Sox或者ffmpeg等工具轉成標準工具測試;如果線上使用,請參考相關產品說明。
下圖以實時語音識別的接口說明為例。
C++ SDK類
C++ SDK語音合成時傳入的文本沒有采用UTF-8編碼會有什么錯誤信息?
如果傳入的文本沒有采用UTF-8編碼,在文本中含有中文字符時,語音合成SDK調用start函數會失敗,返回錯誤信息Socket recv failed, errorCode: 0
。錯誤碼為0表示服務端已經關閉了連接,此時應檢查傳入的文本是否采用UTF-8編碼。
C++ SDK如何獲取Token?
具體操作請參見獲取Token。
下載C++ Token SDK后獲取到NlsCommonSDK,功能包括獲取Token和錄音文件識別。
NlsCppSDK(3.0.X和2.X舊版本)內部不包含NlsCommonSDK,功能包括實時識別、一句話識別、長/短語音合成,非NLS CPP SDK需要按照上圖所示重新獲取Token。
NlsCppSDK(3.1.X新版本)內部包含NlsCommonSDK,功能包括獲取Token、錄音文件識別、實時識別、一句話識別、長/短語音合成,不需要按照上圖所示重新獲取Token。
C++ SDK調用智能實時語音解析接口失敗,提示 {"TaskFailed":"connect failed."} {"channeclClosed": "nls request finished."}如何解決?
C++ SDK3.0及以前的版本有小概率出現這個問題,無需特別關注;3.1及以后版本出現這個問題可能是運行環境的網絡問題導致,建議您檢查本地網絡環境。
如果沒有返回TaskId,說明在連接過程中直接斷開,實時語音交互不需要重復調用接口,重復調用會有并發上限和超時時間,并發超過限制會直接返回超過限制,WebSocket連接超過10秒沒有音頻就會自動斷開,但是會返回TaskId。
這種情況一般是由于當時網絡擁堵造成的,建議您使用抓包工具查看分析實際發送的包是否重傳了
tcp retransmission
,可以在客戶端使用traceroute
命令或者使用MTR工具到nls-gateway-cn-shanghai.aliyuncs.com
進行鏈路測試,判斷從客戶端到接口服務之間網絡是否不穩定。
C++ SDK進行語音合成時,報錯未設置appkey,但是代碼已經設置該如何解決?OnSynthesisTaskFailed: status code=10000002 task id=***error message={TaskFailed":"{"task_id":"00000000000000000000000000000000","result":"","status":40000003,"message":"Gateway:PARAMETER_INVALID:appkey not set"}"}"
status
為40000003指傳入的參數有誤,請重新檢查傳入的參數值是否正確,例如appkey
、voice
、url
等 。’
C++ SDK(3.0及以后版本)使用語音合成和語音識別功能,可以提高GCC5.0以上的編譯版本嗎?
可以。Linux下支持GCC 4.8.5或以上版本。目前已驗證且順利編譯運行的GCC版本包括4.8.5、5.5.0、8.4.0。
C++ SDK中的speechRecognizerDemo.cpp中的g_akid和g_akSecret在哪里獲取?
請參見準備賬號。
C++ SDK實時語音識別報錯,提示status_text:Gateway:IDLE_TIMEOUT:Websocket session is idle for too long time, the last directive is 'StartTranscription'!如何解決?
因為超過10秒沒有發送數據到服務端,空閑超時自動斷連。同時請檢查URI是否正確,
wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1
。如果發生這種情況,可以增加重試機制再次請求。也可能服務端瞬間收到大量請求導致單個case無法及時處理,建議重試。
C++ SDK獲取Token,當系統的時間不是標準時間時會獲取失敗,在C++ SDK中,可以自己設置timestamp,而不是獲取系統的時間嗎?
不可以。Token需要根據系統時間來生成。
C++ SDK ASR請求有DNS解析失敗的情況導致異常,報錯ali-recog-skd.log:AliSpeech_C++SDK(ERROR): GetInetAddressByHostname:252 DNS: resolved timeout.ali-recog-skd.log:AliSpeech_C++SDK(ERROR): start:76 start failed: DNS: resolved timeout..unimrcpserver_current.log: [ERROR] [[./ali/AliRecogChannel.cpp:772,onTaskFailed]]Ali Task start failed Msg :DNS: resolved timeout., start finised."如何解決?
舊版(3.0及以前版本):在高并發或者電腦DNS忙碌的情況下容易出現以上問題,建議您更新到3.1.X版本,或進行再次重啟請求。
新版(3.0及以后版本):已經對此問題進行防御,若仍然偶現此問題,則為電腦DNS忙碌,需要再次重啟請求。
C++ SDK調用實時語音識別,集成在mrcp里面使用,部分情況下創建多個識別通道時會返回10000002如何解決?
錯誤碼10000002是openssl官方錯誤描述,Resource temporarily unavailable
一般是建連后未發送數據到服務端導致WebSocket超時,下一個發送的指令是StartTranscription
。
C++ SDK(新)集成到其他項目中時,將CMakeLists.txt中的add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) 修改為add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)后編譯不通過該如何解決?
除了CMakeLists.txt
,全工程都需要修改該參數,例如config/linux.thirdparty.debug.cmake
和config/linux.thirdparty.release.cmake
,請在全目錄搜索_GLIBCXX_USE_CXX11_ABI
進行修改。
C++ SDK在Windows上使用,報錯缺少nlsCommonSdk.dll如何解決?
3.1及以后版本無nlsCommonSdk.dll。
C++ SDK舊版NlsSdkCpp2.0和新版NlsSdkCpp3.X的區別是什么?
NlsSdkCpp2.0版本的SDK每一個請求為一個線程,且接口為同步接口。
NlsSdkCpp3.X版本的SDK內部由第三方庫libevent統一處理事件消息,并發性能更強,且接口為異步接口。
C++版的SDK不支持實現C11規范嗎? 現在導致項目無法鏈接SDK該如何解決?
工程默認為_GLIBCXX_USE_CXX11_ABI=0
,全工程都需要修改該參數,請在全目錄搜索_GLIBCXX_USE_CXX11_ABI
進行修改。
C++ 版SDK集成語音識別報錯,提示Meta:ACCESS_DENIED:The token '' is invalid!, start finised.start() failed.CbParam: 1 exg.onTaskFailed: status code: 10000011, error message: Stop invoke error. Please check the order of execution or whether the data sent is valid.如何解決?
Meta:ACCESS_DENIED:The token '' is invalid!, start finised.
指令牌無效,鑒權失敗,請檢查appkey
是否錯誤、Token是否填入、Token是否過期。status code: 10000011
指接口調用順序錯誤(接收到Failed/complete事件時,SDK內部會關閉連接,此時再調用send方法會上報錯誤)。
C++ 版SDK集成語音識別一句話報錯,提示transcriber process start...alispeech-DEBUG start:60 starting transcriber...alispeech-WARNING _on_error:123 retry start: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)alispeech-DEBUG _on_close:110 callback on_channel_closedMyCallback.OnRecognitionChannelClosed如何解決?
SSL證書校驗失敗,請檢查發起調用的機器系統時間是否正確。
C++ SDK一句話識別調用stop后返回錯誤回調狀態碼40000004該如何解決?{"header":{"namespace":"Default","name":"TaskFailed","status":40000004,"message_id":"xxxxxxxxxxxxxxxxxxxxxxxxx","task_id":"xxxxxxxxxxxxxxxxxxxxxxxxx","status_text":"Gateway:IDLE_TIMEOUT:Websocket session is idle for too long time, the last directive is 'StopRecognition'!"}}
可能是服務端瞬間收到大量請求導致的單個實例無法及時處理,建議重試。
C++ SDK測試Demo成功,集成項目報錯,DNS解析失敗,報錯nls-gateway-cn-shanghai.aliyuncs.com dns failed: nodename nor servname provided, or not known如何解決?
SDK中會查看當前設備開啟的所有協議族(IPv4、IPv6)進行DNS解析請求,
nls-gateway-cn-shanghai.aliyuncs.com
不支持 IPv6,返回解析錯誤,從而導致SDK DNS解析失敗退出。可禁用當前設備的IPv6協議族,后續CppSdk產品改進對這方面進行可配置處理。建議您升級到3.1.12及以后版本。
C++ SDK測試Demo可以成功,集成項目報錯,網絡鏈接失敗,報錯[dnsEventCallback:465]Node:0x7f087c001030 ai_canonname: nls-gateway-cn-shanghai.aliyuncs.com.gds.alibabadns.com[dnsEventCallback:477]Node:0x7f087c001030 IpV4:106.15.XX.XX[connectProcess:1329]Node:0x7f087c001030 sockFd:41[connectProcess:1347]Node:0x7f087c001030 new Socket ip:106.15.XX.XX port:443 Fd:41.[socketConnect:1458]Node:0x7f087c001030 Connect failed:Network is unreachable. retry...如何解決?
以上現象為無法連接網絡,查看日志發現DNS域名解析出來的IP鏈接不成功,進一步通過Ping判斷網絡不通。由于本地攔截DNS解析,導致SDK內部libevent
的evdns_getaddrinfo
獲得錯誤的IP。
解決辦法:
3.1.12版本以前可將evdns_getaddrinfo()手動替換成系統的getaddrinfo()。
3.1.12版本可在
CMakeLists.txt
中修改add_definitions(-DNLS_USE_NATIVE_GETADDRINFO)
。3.1.12及以后版本增加setDirectHost()接口,您可以在SDK外部進行DNS解析,獲取正確IP后通過該接口設入。
3.1.13及以后版本已解決此問題,若運行時仍存在上述問題,建議調用接口setUseSysGetAddrInfo(true)。
C++ 語音合成Demo,NlsCommonSdk版本20211018基于vc16.0,NlsSdkCpp3.X版本20210629基于vc14.0,Demo程序只執行到OnSynthesisTaskFailed,返回20000000,在win10 X64 vs2015中得不到WAV的可能原因?log信息如下ERROR alibabaNlsLog: [ID:15284][AlibabaNls::ConnectNode::parseFrame:1014]Node:000001D733079F20 Result conversion failed.
NlsSdkCpp3.X-20210629里的Demo不適用于Windows版本程序,alibabacloud-nls-cpp-sdk(github的)里的才是Windows的Demo。
Android SDK類
Android SDK是否可以上傳opus音頻數據,實現實時語音轉文字?
ASR中一句話識別和錄音文件極速版支持opus數據,實時語音轉文字僅支持PCM編碼、16 bit采樣位數、單聲道(mono)。具體詳情,請參見接口說明。
Android SDK中使用onNuiNeedAudioData錄音數據回調,并在該回調過程中填充錄音數據ret = audioRecord.read(buffer, 0, len)。在實時錄音轉寫過程中,突然斷網后再連網,錄音SDK會自動連接并繼續轉寫嗎?
斷網后需要重新連接錄音SDK,不會自動連接,需要您增加重試機制。
智能語音交互SDK,最低支持Android的哪個版本?
智能語音交互SDK對于常規Android版本都支持。
Android SDK錄音文件識別極速版,是否支持通過任務ID查詢任務狀態?
不支持。
Android SDK調用文件上傳轉寫極速版,調用int startFileTranscriber(String params, byte[] task_id)后無法收到回調,報錯提示“EventE/iDST::NativeNui: no java instance, maybe already released”。
您需要核實:
資源文件是否復制成功。
CommonUtils.copyAssetsData
函數是否已調用。
使用實時語音識別Android SDK,管控臺模型選擇為8K,但是實際測試中為何將采樣率設置成16K才能識別正確?
識別正確與否與您設置參數有關,您需要排查:
nls_config.put("sr_format", "pcm")
參數值是否配置為小寫模式。是否設置靜態變量SAMPLE_RATE為8000,即public final static int SAMPLE_RATE = 8000。
模型選擇是否正確選擇為8K模型。
int ret = nui_instance.initialize(this, genInitParams(assets_path,debug_path), Constants.LogLevel.LOG_LEVEL_VERBOSE, true)。在該段代碼中,錄音權限是打開的,但代碼仍然報錯240021。
表示FILE_ACCESS_FAIL文件訪問錯誤。你需要檢查:
是否有文件讀寫權限。
是否完成SDK配置文件的拷貝,檢查是否拷貝完成的代碼示例如下:
if (CommonUtils.copyAssetsData(this)) {
Log.i(TAG, "copy assets data done");
} else {
Log.i(TAG, "copy assets failed");
return;
}
使用離線語音合成Android SDK,語音播報時出現不合理斷句,該如何處理?
您可以通過SSML標記語言嘗試解決,更多信息,請參見SSML標記語言介紹。
使用語音合成Android SDK,在調用cancel時候出現一次anr,該如何處理?
SDK接口為同步調用,建議您不要在主線程調用SDK接口。
實時音頻識別對Android版本有要求嗎?
沒有要求。
調用Android SDK時,手機報錯提示“audio recoder not init”。
您可以通過以下方式排查:
檢查AudioRecord是否初始化正常。
檢查語音播放器是否有問題。
編寫AudioRecord錄音代碼,測試是否正常。
在模擬器上運行下載的Android程序,程序出現閃退現象,是什么原因?
模擬器可能會出現未知問題,建議您使用真機測試。
使用語音識別Android SDK回調onNuiNeedAudioData,但在onNuiEventCallback中回調延遲,并顯示錯誤碼50000000。
表示服務端內部錯誤,請重試。
使用語音合成Android SDK TTS時,報錯提示“tts event:TTS_EVENT_ERROR ret 140002”。
建議您檢查下輸入文本是否合規。
iOS SDK類
是否支持后臺處理?
SDK本身不限制前后臺,iOS SDK的樣例工程默認僅支持前臺處理,如果您需要支持后臺處理,可以做如下修改:
在工程Info.list中添加Required background modes配置,并在該配置下添加item,Value設置為
App plays audio or streams audio/video using AirPlay
。在錄音模塊中進入后臺時,不停止錄音。亦即NLSVoiceRecorder.m中_appResignActive接口中不做停止錄音調用。
下載語音交互iOS SDK至本地庫,測試代碼時,在模擬器可以正常運行,真機卻無法運行,報錯提示“Reason: no suitable image found. Did find:xxx”。
建議您刪除手機上對應的APP后,執行xcode clean
,并重新嘗試運行。除此以外,還需檢查簽名的正確性,如果簽名不正確,需撤銷原來的inHouse證書,重新制作新的證書和provisioning profile,并將代碼重新簽名,再次打包。
使用智能語音服務集成iOS SDK,接入NuiSdk運行報錯MIC。
建議您檢查下當前錄音設備是否有被占用。
使用智能語音服務集成iOS SDK,接入nuisdk.framework后,導入頭文件項目失敗。
一般情況下是SDK導入有問題導致,請您確認下圖參數是否已勾選,如果已勾選,建議您將頭文件導入方式換為#import <nuisdk/NeoNui.h>
。
使用iOS SDK接入nuisdk.framework后,報錯提示“/Users/admin/FlashTranscription_iOS/Fc_ASR.xcodeproj Building for iOS, but the linked and embedded framework 'nuisdk.framework' was built for iOS + iOS Simulator”。
可能因為版本過高導致,建議您修改項目配置Validate Workspace為Yes后,重新編譯。
使用集成語音服務iOS SDK,在接入nuisdk.framework后報錯,需要修改Legacy Build system,才可以運行,是什么原因?
建議您修改項目配置Validate Workspace為Yes后,重新編譯。
使用一句話識別iOS SDK,配置nuisdk.framework為Embed & Sign后,提示“nuisdk.framework/Headers/NeoNui.h”。
建議檢查下頭文件是否按照文檔正常導入,頭文件導入格式為#import <nuisdk/NeoNui.h>
。
使用App集成iOS SDK,提交到App store失敗,提示“Unsupported Architectures. The executable for AliYunSmart.app/Frameworks/nuisdk.framework contains unsupported architectures '[x86_ _64, i386]'. With error code”。
可能是模擬器架構影響,您可以參考如下方法查看framework版本并移除framework模擬器架構。
進入到framework目錄。
輸入命令
lipo -info xxxFramework
,查看framework的架構版本,如果含有模擬器打包需要把模擬器架構移除。
TRTC實時音視頻和語音識別結合,當同時調用麥克風時可能會發生沖突,導致有一方沒有聲音,如何解決?
建議嘗試TRTC的音視頻流,然后使用localStream.getAudioTrack
獲取MediaStreamTrack
對象,并轉換為符合ASR標準的音頻流,之后通過語音識別SDK發起請求。
使用智能語音交互iOS SDK,App是否能在后臺模式和終止應用的情況下進行語音播報?
應用被終止無法進行語音播報。
使用語音合成iOS SDK,onNuiTtsUserdataCallback不返回時間戳信息,如何解決?
默認情況SDK不返回時間戳,如果您需要獲取時間戳信息,可以通過接口setparamTts設置enable_subtitle,詳情請參見接口說明。
使用語音合成iOS SDK,如何保存為文件,保存格式是什么?
可以在onNuiTtsUserdataCallback接口參數中將合成的數據保存成文件,合成的格式以傳出參數為主,例如[nls_config setObject:@"mp3" forKey:@"encode_type"]
。
目前支持格式為PCM、WAV、MP3,需要注意是,語音合成的文檔案例中播放器不支持MP3格式音頻,直接使用可能產生噪音,但存儲的MP3格式文件可以用支持MP3格式的播放軟件試聽。如果個別音頻文件出現少字的現象,可能是因為該發音人合成速度過快(如xiaoyun),部分數據沒有寫入文件被清除,您可以在fwrite后調用fflush保證數據完全寫入文件。
使用語音合成iOS SDK,連續點擊播放按鈕,高頻率觸發播放出現頁面終止情況,該如何解決?
由于在線合成時需要連接網絡,網絡狀況會直接影響接口響應時間,如果您的業務需要快速停止任務并開始下一條,可以根據業務需求調整網絡超時時間。
使用集成語音服務iOS SDK,flutter_plugin集成時,報錯提示“Undefined symbols for architecture arm64: "std::__1::mutex::~mutex()", referenced from: ___cxx_global_var_init in libflutter_tts.a(ringBuf.o)”。
您可以打開iOS工程下的Podfile文件,修改post_install do |installer|部分的代碼,再次執行構建即可成功。
使用在線合成語音iOS SDK,寫入文件播放聲音是雜音,是什情況?
首先需要確認合成音頻格式(PCM、WAV、MP3),如存儲的音頻流是MP3格式,但播放器不支持該格式音頻就會出現雜音的狀況,建議更換一下播放軟件重試。同時也有用戶出現音頻只有尾部出現雜音的情況,可以用BeyondCompare查看音頻流,是否有日志寫入音。
WebSocket
實時語音識別接口WebSocket,發送語音體的指令是什么?一次可以發送多少Bytes?
指令由Header和Payload兩部分組成,其中Header為統一格式,不同指令的Payload格式不同。
服務端可支持一次發送3200 Byte或1600 Byte,單次發送數據時,需確保音頻在發送的時候沒有損壞。
使用實時語音識別接口WebSocket,設置了32位隨機message_id,報錯提示Status:40000002 Gateway:MESSAGE_INVALID:Invalid message id ''!。
WebSocket相當于您自己去構建的一個請求,message_id就是隨機生成的32位唯一ID。
您需要將message_id改成32個hex字符,檢查一下發送的消息是否符合要求。
使用WebSocket協議連接阿里云的地址,發送二進制語音數據時,建立的連接被服務器主動斷開且沒有錯誤提示,是什么原因?
實時語音識別WebSocket協議出現斷開, 建議您:
檢查下token是否生成正確。
確定客戶端是否有正常發送音頻流。
沒有錯誤信息提示,建議您設置status狀態碼,默認值20000000。
使用實時語音識別WebSocket,在基于Web的JavaScript WebSocket連接成功后,如何獲得message_id和task_id?
message_id和task_id是由您在調用側自行生成的。
message_id和task_id可以隨機生成32位唯一ID,且在一個鏈接的過程中,task_id可以保持唯一不變,用以標識該鏈接的唯一性;message_id建議在每次發送的消息中重新隨機生成,用以標識該消息的唯一性。
使用WebSocket調用實時語音識別時,WebSocket經常自動終止服務,不能實現實時語音識別,需要手動發送PCM或WAV音頻文件,是什么原因?
以上情況表示系統已經接收到您傳遞的音頻,在符合協議以及傳參的情況下,WSS或HTTP協議都能實現實時語音識別。如何實現不間斷發送,需要您自行處理WSS,智能語音交互文檔提供了Java后端代碼示例,即以讀取本地文件的形式模擬實時獲取語音流并發送,詳情請參見示例代碼。