全部产品
Search
文档中心

iOS SDK 2.0

更新时间: 2020-11-03

提示:

实时语音识别

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

SDK下载调用

  • 下载 iOS SDK,解压后打开压缩包,NlsDemo目录即为Demo工程目录;
  • 双击NlsDemo.xcodeproj可以使用Xcode 9.3打开Demo工程,如您的Xcode版本高于/低于该版本,可能需要您调整版本或手动导入Demo文件;
  • Demo 已导入的iOS SDK 即NlsDemo/AliyunNlsSdk.framework,SDK支持 x86_64/armv7/arm64三种架构,支持模拟器架构;
  • 提交苹果应用商店,不允许提交x86_64架构,所以我们提供了只包含真机的framework,您可以集成这个版本:NlsDemo-iOS/ReleaseFramework-iphoneOS/AliyunNlsSdk.framework;
  • AliyunNlsSdk是动态库,所以您在项目导入时应该选择在Embedded Binaries 添加Framework。

SDK调用顺序

请使用Embedded Binaries方式导入SDK到您的工程中。

  1. 引入NlsSdk中的AliyunNlsClientAdaptor.h、NlsSpeechTranscriberRequest.h以及TranscriberRequestParam.h头文件。
  2. 实现NlsSpeechTranscriberRequest的NlsSpeechTranscriberDelegate回调方法。
  3. 创建一个AliyunNlsClientAdaptor的对象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】中设置的相关回调函数,返回的形式是文本方式。

关键接口

  • AliyunNlsClientAdaptor:语言处理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 setServiceUrl:@"wss://nls-gateway-ap-southeast-1.aliyuncs.com/ws/v1"];
  35. [_transRequestParam setFormat:@"opu"];
  36. [_transRequestParam setEnableIntermediateResult:true];
  37. //请使用https://help.aliyun.com/document_detail/72153.html 动态生成token
  38. // <AccessKeyId> <AccessKeySecret> 请使用您的阿里云账户生成 https://ak-console.aliyun.com/
  39. [_transRequestParam setToken:@""];
  40. //请使用阿里云语音服务管控台(https://nls-portal.console.aliyun.com/)生成您的appkey
  41. [_transRequestParam setAppkey:@""];
  42. //2.3 传入请求参数
  43. [_transcriberRequest setTranscriberParams:_transRequestParam];
  44. //2.4 启动录音和识别,将transcriberStarted置为true
  45. [_voiceRecorder start];
  46. [_transcriberRequest start];
  47. transcriberStarted = true;
  48. //2.5 更新UI
  49. dispatch_async(dispatch_get_main_queue(), ^{
  50. // UI更新代码
  51. [self->switchTranscriber setOn:true];
  52. self->textViewTranscriber.text = @"start Recognize!";
  53. });
  54. }
  55. - (IBAction)stopTranscriber {
  56. //3 结束识别 停止录音,停止识别请求
  57. [_voiceRecorder stop:true];
  58. [_transcriberRequest stop];
  59. transcriberStarted= false;
  60. _transcriberRequest = NULL;
  61. dispatch_async(dispatch_get_main_queue(), ^{
  62. // UI更新代码
  63. [self->switchTranscriber setOn:false];
  64. });
  65. }
  66. /**
  67. *4. NlsSpeechTranscriberDelegate接口回调方法
  68. */
  69. //4.1 识别回调,本次请求失败
  70. - (void)OnTaskFailed:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  71. NSLog(@"OnTaskFailed, statusCode is: %@ error message :%@",statusCode,eMsg);
  72. }
  73. //4.2 识别回调,服务端连接关闭
  74. - (void)OnChannelClosed:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  75. NSLog(@"OnChannelClosed, statusCode is: %@",statusCode);
  76. }
  77. //4.3 实时语音识别开始
  78. - (void)OnTranscriptionStarted:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  79. }
  80. //4.4 识别回调,一句话的开始
  81. - (void)OnSentenceBegin:(NlsDelegateEvent)event result:(NSString*)result statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  82. dispatch_async(dispatch_get_main_queue(), ^{
  83. // UI更新代码
  84. self->textViewTranscriber.text = result;
  85. NSLog(@"%@", result);
  86. });
  87. }
  88. //4.5 识别回调,一句话的结束
  89. - (void)OnSentenceEnd:(NlsDelegateEvent)event result:(NSString*)result statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  90. dispatch_async(dispatch_get_main_queue(), ^{
  91. // UI更新代码
  92. self->textViewTranscriber.text = result;
  93. NSLog(@"%@", result);
  94. });
  95. }
  96. //4.5 识别回调,一句话识别的中间结果
  97. - (void)OnTranscriptionResultChanged:(NlsDelegateEvent)event result:(NSString *)result statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  98. dispatch_async(dispatch_get_main_queue(), ^{
  99. // UI更新代码
  100. self->textViewTranscriber.text = result;
  101. NSLog(@"%@", result);
  102. });
  103. }
  104. //4.6 识别回调,转写完全结束
  105. - (void)OnTranscriptionCompleted:(NlsDelegateEvent)event statusCode:(NSString *)statusCode errorMessage:(NSString *)eMsg {
  106. }
  107. /**
  108. *5. 录音相关回调
  109. */
  110. - (void)recorderDidStart {
  111. NSLog(@"Did start recorder!");
  112. }
  113. - (void)recorderDidStop {
  114. NSLog(@"Did stop recorder!");
  115. }
  116. - (void)voiceDidFail:(NSError *)error {
  117. NSLog(@"Did recorder error!");
  118. }
  119. //5.1 录音数据回调
  120. - (void)voiceRecorded:(NSData *)frame {
  121. if (_transcriberRequest != nil && transcriberStarted) {
  122. //录音线程回调的数据传给识别服务
  123. if ([_transcriberRequest sendAudio:frame length:(short)frame.length] == -1) {
  124. NSLog(@"connect closed ,stop transcriberRequest!");
  125. [self stopTranscriber];
  126. }
  127. }
  128. }
  129. @end