全部产品
阿里云办公

iOS SDK 2.0

更新时间:2018-10-18 14:39:24

版本提示

本文档中的SDK只适用于7月5日新发布的2.0版语音服务,如果您是之前开通的,要使用此SDK需要新开通2.0版服务

实时语音识别

实时语音识别相对于一句话识别,支持一个持续不断的长连接进行识别,典型的应用场景是会议转写、记者访谈等。比如您可以用实时语音识别来转写一场会议的发言。服务会自动的对上传的语音进行断句,并返回每句话的开始、结束和识别结果。

SDK下载调用

  • 下载 iOS SDK 2.0,解压后打开压缩包,NlsDemo目录即为Demo工程目录;
  • 双击NlsDemo.xcodeproj可以使用Xcode 9.3打开Demo工程,如您的Xcode版本高于/低于该版本,可能需要您调整版本或手动导入Demo文件;
  • iOS SDK 即NlsDemo/NlsSdk.framework,SDK支持 x86_64/armv7/arm64三种架构,SDK的Deployment Target是iOS 8.0;
  • 修改Demo中的Recognizer.m/Transcriber.m/Synthesizer.m文件,填入您的appkey和token即可运行Demo。

SDK调用顺序

  1. 引入NlsSdk中的NlsClientAdaptor.h、NlsSpeechTranscriberRequest.h以及TranscriberRequestParam.h头文件。
  2. 实现NlsSpeechTranscriberRequest的NlsSpeechTranscriberDelegate回调方法。
  3. 创建一个NlsClientAdaptor的对象nlsClient,该对象只需创建一次并且可以重复使用。
  4. 通过调用nlsClient对象的createTranscriberRequest方法获得一个NlsSpeechTranscriberRequest 对象。该NlsSpeechTranscriberRequest对象不能重复使用,但是可以创建多个,每个请求创建一个对象。
  5. 通过TranscriberRequestParam设置识别过程中的参数,如accessToken、appkey等(详细参数说明见下文)。
  6. 通过NlsSpeechTranscriberRequest的setTranscriberParams 传入【步骤 5】中设置的TranscriberRequestParam对象。
  7. 调用NlsSpeechTranscriberRequest对象的start方法和stop方法开始结束识别。
  8. 通过NlsSpeechTranscriberRequest对象的sendAudio:(NSData *)audioData length:(int)len 接口传入识别数据。
  9. 如有识别结果,则会触发【步骤 3】中设置的相关回调函数,返回的形式是文本方式。

关键接口

  • NlsClientAdaptor:语言处理client,相当于所有语音相关处理类的factory,全局创建一个实例即可。线程安全。
  • NlsSpeechTranscriberRequest:语音识别处理的请求对象,用来完成语音识别等功能,线程安全。
  • TranscriberRequestParam:语音识别相关参数。
  • NlsSpeechTranscriberDelegate:定义了多个语音识别相关回调函数,在获得结果,遇到错误等事件发生时会触发回调。

代码调用示例

  1. #import <Foundation/Foundation.h>
  2. #import "Transcriber.h"
  3. @interface Transcriber()<NlsSpeechTranscriberDelegate,NlsVoiceRecorderDelegate>{
  4. IBOutlet UITextView *textViewTranscriber;
  5. IBOutlet UISwitch *switchTranscriber;
  6. Boolean transcriberStarted;
  7. }
  8. @end
  9. @implementation Transcriber
  10. -(void)viewDidLoad {
  11. [super viewDidLoad];
  12. //1. 全局参数初始化操作
  13. //1.1 初始化识别客户端,将transcriberStarted状态置为false
  14. _nlsClient = [[NlsClientAdaptor alloc]init];
  15. transcriberStarted = false;
  16. //1.2 初始化录音recorder工具
  17. _voiceRecorder = [[NlsVoiceRecorder alloc]init];
  18. _voiceRecorder.delegate = self;
  19. //1.3 初始化识别参数类
  20. _transRequestParam = [[TranscriberRequestParam alloc]init];
  21. //1.4 设置log级别
  22. [_nlsClient setLog:NULL logLevel:1];
  23. }
  24. - (IBAction)startTranscriber {
  25. //2. 创建请求对象和开始识别
  26. if(_transcriberRequest!= NULL){
  27. [_transcriberRequest releaseRequest];
  28. _transcriberRequest = NULL;
  29. }
  30. //2.1 创建请求对象,设置NlsSpeechTranscriberDelegate回调
  31. _transcriberRequest = [_nlsClient createTranscriberRequest];
  32. _transcriberRequest.delegate = self;
  33. //2.2 设置TranscriberRequestParam请求参数
  34. [_transRequestParam setFormat:@"opu"];
  35. [_transRequestParam setEnableIntermediateResult:true];
  36. //请使用https://help.aliyun.com/document_detail/72153.html 动态生成token
  37. // <AccessKeyId> <AccessKeySecret> 请使用您的阿里云账户生成 https://ak-console.aliyun.com/
  38. [_transRequestParam setToken:@""];
  39. //请使用阿里云语音服务管控台(https://nls-portal.console.aliyun.com/)生成您的appkey
  40. [_transRequestParam setAppkey:@""];
  41. //2.3 传入请求参数
  42. [_transcriberRequest setTranscriberParams:_transRequestParam];
  43. //2.4 启动录音和识别,将transcriberStarted置为true
  44. [_voiceRecorder start];
  45. [_transcriberRequest start];
  46. transcriberStarted = true;
  47. //2.5 更新UI
  48. dispatch_async(dispatch_get_main_queue(), ^{
  49. // UI更新代码
  50. [self->switchTranscriber setOn:true];
  51. self->textViewTranscriber.text = @"start Recognize!";
  52. });
  53. }
  54. - (IBAction)stopTranscriber {
  55. //3 结束识别 停止录音,停止识别请求
  56. [_voiceRecorder stop:true];
  57. [_transcriberRequest stop];
  58. transcriberStarted= false;
  59. _transcriberRequest = NULL;
  60. dispatch_async(dispatch_get_main_queue(), ^{
  61. // UI更新代码
  62. [self->switchTranscriber setOn:false];
  63. });
  64. }
  65. /**
  66. *4. NlsSpeechTranscriberDelegate接口回调方法
  67. */
  68. //4.1 识别回调,本次请求失败
  69. - (void)OnTaskFailed:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  70. NSLog(@"OnTaskFailed, statusCode is: %@ error message :%@",statusCode,eMsg);
  71. }
  72. //4.2 识别回调,服务端连接关闭
  73. - (void)OnChannelClosed:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  74. NSLog(@"OnChannelClosed, statusCode is: %@",statusCode);
  75. }
  76. //4.3 实时语音识别开始
  77. - (void)OnTranscriptionStarted:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  78. }
  79. //4.4 识别回调,一句话的开始
  80. - (void)OnSentenceBegin:(NlsDelegateEvent)event result:(NSString*)result statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  81. dispatch_async(dispatch_get_main_queue(), ^{
  82. // UI更新代码
  83. self->textViewTranscriber.text = result;
  84. NSLog(@"%@", result);
  85. });
  86. }
  87. //4.5 识别回调,一句话的结束
  88. - (void)OnSentenceEnd:(NlsDelegateEvent)event result:(NSString*)result statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  89. dispatch_async(dispatch_get_main_queue(), ^{
  90. // UI更新代码
  91. self->textViewTranscriber.text = result;
  92. NSLog(@"%@", result);
  93. });
  94. }
  95. //4.5 识别回调,一句话识别的中间结果
  96. - (void)OnTranscriptionResultChanged:(NlsDelegateEvent)event result:(NSString *)result statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  97. dispatch_async(dispatch_get_main_queue(), ^{
  98. // UI更新代码
  99. self->textViewTranscriber.text = result;
  100. NSLog(@"%@", result);
  101. });
  102. }
  103. //4.6 识别回调,转写完全结束
  104. - (void)OnTranscriptionCompleted:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  105. }
  106. /**
  107. *5. 录音相关回调
  108. */
  109. - (void)recorderDidStart {
  110. NSLog(@"Did start recorder!");
  111. }
  112. - (void)recorderDidStop {
  113. NSLog(@"Did stop recorder!");
  114. }
  115. - (void)voiceDidFail:(NSError *)error {
  116. NSLog(@"Did recorder error!");
  117. }
  118. //5.1 录音数据回调
  119. - (void)voiceRecorded:(NSData *)frame {
  120. if (_transcriberRequest != nil && transcriberStarted) {
  121. //录音线程回调的数据传给识别服务
  122. if ([_transcriberRequest sendAudio:frame length:(short)frame.length] == -1) {
  123. NSLog(@"connect closed ,stop transcriberRequest!");
  124. [self stopTranscriber];
  125. }
  126. }
  127. }
  128. @end