本文介紹了如何使用阿里云智能語音服務提供的iOS NUI SDK,包括SDK下載安裝、關鍵接口及代碼示例。
前提條件
下載安裝
- 重要
下載后請在樣例初始化代碼中替換您的阿里云賬號信息、Appkey和Token才可運行。
為方便集成,2.5.14版本后iOS接口使用純Object-C接口,不再使用C++混合接口。
對象
說明
智能語音交互移動端SDK
智能語音交互移動端SDK
阿里云計算有限公司
阿里云計算有限公司
SDK版本
2.6.3-01B
SDK更新時間
2024-12-19
SDK整合包大小
17.3MB
SDK整合包MD5值
edf1a1a770bf869b738ee89ab43d88aa
隱私政策
SDK整合包下載
類別
兼容范圍
系統
最低支持iOS9
架構
arm64,x86_64
此SDK還包含如下功能,若未支持您想要的功能,請去對應文檔獲取SDK。
功能
是否支持
一句話識別
是
實時語音識別
是
語音合成
是
實時長文本語音合成
是
流式文本語音合成
是
離線語音合成
否
錄音文件識別極速版
是
喚醒及命令詞
否
聽悟實時推流
是
解壓ZIP包,將ZIP包中的nuisdk.framework添加到您的工程中,并在工程Build Phases的Link Binary With Libraries中添加nuisdk.framework。請確保在編譯配置的General > Frameworks, Libraries, and Embedded Content中配置nuisdk.framework為Embed & Sign。
使用Xcode打開此工程,工程中提供了參考代碼以及一些直接可使用的工具類,例如音頻播放錄制和文件操作,您可以直接復制源碼到您的實際工程進行使用。其中語音合成示例代碼在StreamInputTtsViewController類中。
SDK關鍵接口
startStreamInputTts:開始運行流式TTS
/** * 與服務端完成建鏈,并開始流式語音合成任務 * @param ticket:json string形式的初始化參數,參見下方說明。 * @param parameters:json string形式的初始化參數,參見下方說明。 * @param session_id:當前會話的id,若客戶端請求時傳入則原樣返回,否則由服務端自動生成32位唯一ID。 * @param level:log打印級別,值越小打印越多。 * @param save_log:是否保存log為文件,存儲目錄為ticket中的debug_path字段值。注意,log文件無上限,請注意持續存儲導致磁盤存滿。 * @return:參見錯誤碼:http://bestwisewords.com/document_detail/459864.html。 */ - (int) startStreamInputTts:(const char *)ticket parameters:(const char *)parameters sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
stopStreamInputTts: 停止語音合成
/** * 結束合成任務,通知服務端流入文本數據發送完畢,阻塞等待服務端處理完成,并返回所有合成音頻。阻塞超時可以通過start接口中的complete_waiting_ms設置 * @return:參見錯誤碼:http://bestwisewords.com/document_detail/459864.html。 */ - (int) stopStreamInputTts;
sendStreamInputTts:以流式的方式發送文本
/** * 以流式的方式發送文本 * @param text:從大模型當中生成的流式文本 * @return:參見錯誤碼:http://bestwisewords.com/document_detail/459864.html。 */ - (int) sendStreamInputTts:(const char *)text;
StreamInputTtsDelegate 事件代理
onStreamInputTtsEventCallback:SDK事件回調
/** * 事件回調 * @param event:回調事件,參見如下事件列表。 * @param taskid:整個實時語音合成會話的任務ID,整個請求中需要保持一致,32位唯一ID。 * @param sessionId:當前會話的id,若客戶端請求時傳入則原樣返回,否則由服務端自動生成32位唯一ID。 * @param ret_code:參見錯誤碼,出現STREAM_INPUT_TTS_EVENT_TASK_FAILED事件時有效,可查閱http://bestwisewords.com/document_detail/459864.html。 * @param error_msg:詳細錯誤信息,出現STREAM_INPUT_TTS_EVENT_TASK_FAILED事件時有效。 * @param timestamp:合成結果中時間戳相關信息。 * @param all_response:完整的json string格式返回消息,可從中解析需要的信息。 */ - (void)onStreamInputTtsEventCallback:(StreamInputTtsCallbackEvent)event taskId:(char*)taskid sessionId:(char*)sessionId ret_code:(int)ret_code error_msg:(char*)error_msg timestamp:(char*)timestamp all_response:(char*)all_response;
StreamInputTtsCallbackEvent事件列表:
名稱
說明
TTS_EVENT_SYNTHESIS_STARTED
語音合成開始,準備播放。
TTS_EVENT_SENTENCE_BEGIN
服務端檢測到了一句話的開始。
TTS_EVENT_SENTENCE_SYNTHESIS
增量返回語音合成的結果,包含最新的音頻和時間戳,句內全量,句間增量。
TTS_EVENT_SENTENCE_END
服務端檢測到了一句話的結束,返回該句的全量時間戳。
TTS_EVENT_SYNTHESIS_COMPLETE
服務端檢測到了一句話的結束,返回該句的全量時間戳。
TTS_EVENT_TASK_FAILED
語音合成發生錯誤,詳見ret_code和error_msg。
onStreamInputTtsDataCallback:合成數據回調。
/** * 合成數據回調。 * @param data:合成的音頻數據,寫入播放器。 */ void onStreamInputTtsDataCallback(byte[] data);
調用步驟
初始化SDK和播放組件。
根據業務需求設置參數。
調用startStreamInputTts開始進行流式文本語音合成。
調用sendStreamInputTts持續發送待合成文本。在合成數據回調中,將數據寫入播放器進行播放,建議使用流式播放。
調用stopStreamInputTts表示文本發送完成,等待合成完畢。
收到語音合成結束的回調。
代碼示例
開始語音合成
NSMutableDictionary *ticketJsonDict = [NSMutableDictionary dictionary]; [ticketJsonDict setObject:@"wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1" forKey:@"url"]; // 必填 [ticketJsonDict setObject:@"10000" forKey:@"complete_waiting_ms"]; //獲取賬號訪問憑證: [_utils getTicket:ticketJsonDict Type:get_token_from_server_for_online_features]; if ([ticketJsonDict objectForKey:@"token"] != nil) { NSString *tokenValue = [ticketJsonDict objectForKey:@"token"]; if ([tokenValue length] == 0) { TLog(@"The 'token' key exists but the value is empty."); } } else { TLog(@"The 'token' key does not exist."); } NSError *error; NSData *ticketJsonData = [NSJSONSerialization dataWithJSONObject:ticketJsonDict options:0 error:&error]; NSString *ticket = [[NSString alloc] initWithData:ticketJsonData encoding:NSUTF8StringEncoding]; NSDictionary *paramsJsonDict = @{ @"voice": @"zhixiaoxia", @"format": @"pcm", @"sample_rate": @(16000), @"volume": @(50), @"speech_rate": @(0), @"pitch_rate": @(0), @"enable_subtitle": @(YES) }; NSData *paramsJsonData = [NSJSONSerialization dataWithJSONObject:paramsJsonDict options:0 error:&error]; NSString *parameters = [[NSString alloc] initWithData:paramsJsonData encoding:NSUTF8StringEncoding]; _streamInputTtsSdk = [StreamInputTts get_instance]; _streamInputTtsSdk.delegate = self; int ret = [_streamInputTtsSdk startStreamInputTts:[ticket UTF8String] parameters:[parameters UTF8String] sessionId:nil logLevel:NUI_LOG_LEVEL_VERBOSE saveLog:NO];
流式發送合成文本
NSString * sentence = @"番茄炒蛋怎么做?"; [_streamInputTtsSdk sendStreamInputTts:[sentence UTF8String]]
結束語音合成
[_streamInputTtsSdk stopStreamInputTts];
回調處理
onStreamInputTtsEventCallback:流式文本語音合成事件回調,根據語音合成狀態控制播放器。
- (void)onStreamInputTtsEventCallback:(StreamInputTtsCallbackEvent)event taskId:(char*)taskid sessionId:(char*)sessionId ret_code:(int)ret_code error_msg:(char*)error_msg timestamp:(char*)timestamp all_response:(char*)all_response { NSString *log = [NSString stringWithFormat:@"\n事件回調(%d):%s", event, all_response]; TLog(@"%@", log); if (event == TTS_EVENT_SYNTHESIS_STARTED) { TLog(@"onStreamInputTtsEventCallback TTS_EVENT_SYNTHESIS_STARTED"); // 合成啟動,啟動播放器 [_audioController startPlayer]; } else if (event == TTS_EVENT_SENTENCE_BEGIN) { TLog(@"onStreamInputTtsEventCallback TTS_EVENT_SENTENCE_BEGIN"); } else if (event == TTS_EVENT_SENTENCE_SYNTHESIS) { TLog(@"onStreamInputTtsEventCallback TTS_EVENT_SENTENCE_SYNTHESIS"); } else if (event == TTS_EVENT_SENTENCE_END) { TLog(@"onStreamInputTtsEventCallback TTS_EVENT_SENTENCE_END"); } else if (event == TTS_EVENT_SYNTHESIS_COMPLETE) { TLog(@"onStreamInputTtsEventCallback TTS_EVENT_SYNTHESIS_COMPLETE"); // 注意這里的event事件是指語音合成完成,而非播放完成,播放完成需要由voicePlayer對象來進行通知 [_audioController drain]; } else if (event == TTS_EVENT_TASK_FAILED) { TLog(@"onStreamInputTtsEventCallback TTS_EVENT_TASK_FAILED:%s", error_msg); // 注意這里的event事件是指語音合成完成,而非播放完成,播放完成需要由voicePlayer對象來進行通知 [_audioController drain]; } }
onStreamInputTtsDataCallback:語音合成數據回調,將回調中的合成數據寫入播放器進行播放。
- (void)onStreamInputTtsDataCallback:(char*)buffer len:(int)len { NSString *log = [NSString stringWithFormat:@"\n音頻回調 %d bytes", len]; TLog(log); dispatch_async(dispatch_get_main_queue(), ^{ self.logTextView.text = [self.logTextView.text stringByAppendingString:log]; NSRange bottom = NSMakeRange(self.logTextView.text.length -1, 1); [self.logTextView scrollRangeToVisible:bottom]; }); if (buffer != NULL && len > 0) { [_audioController write:(char*)buffer Length:(unsigned int)len]; } }