接入讯飞SDK及参数设置

简要描述

主要协助云上越秀App接入讯飞SDK,并且设置讯飞相应参数的功能代码示例;

主要内容

讯飞SDK是以framework框架的方式提供SDK的接入。

SDK的版本:1.180版本

包大小:19.2M

引入方式:将framework文件夹拖入工程即可

讯飞SDK初始化代码示例:

  1. + (void)configIFly {
  2. //Set log level
  3. [IFlySetting setLogFile:LVL_ALL];
  4. //Set whether to output log messages in Xcode console
  5. [IFlySetting showLogcat:YES];
  6. //Set the local storage path of SDK
  7. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
  8. NSString *cachePath = [paths objectAtIndex:0];
  9. [IFlySetting setLogFilePath:cachePath];
  10. PHAIConfig *config = PHAIConfig.sharedConfig;
  11. if ([PHAIUtils isNilOrEmpty:config.appId]) {
  12. IFlyLog(@"App ID 为空,初始化讯飞SDK失败");
  13. }
  14. //Set APPID
  15. NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",config.appId];
  16. //Configure and initialize iflytek services.(This interface must been invoked in application:didFinishLaunchingWithOptions:)
  17. [IFlySpeechUtility createUtility:initString];
  18. }

1. 10s内无声音自动中断

讯飞的SDK文档里面已经说明此类情况:文档地址

在听写过程中如果10秒未说话录制会自动停止。
答:听写vad_eos为支持的最长静音时间,超过这个时间会认为音频结束自动断开。

代码上主要通过配置[_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];[_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];来实现10s内无声音自动中断。
示例代码:

  1. -(void)defaultSetting {
  2. _speechTimeout = @"60000";
  3. _vadEos = @"10000";
  4. _vadBos = @"10000";
  5. _dot = @"1";
  6. _sampleRate = @"16000";
  7. _language = CHINESE;
  8. _accent = PUTONGHUA;
  9. _haveView = NO;
  10. _accentNickName = [[NSArray alloc] initWithObjects:NSLocalizedString(@"K_LangCant", nil), NSLocalizedString(@"K_LangChin", nil), NSLocalizedString(@"K_LangEng", nil), NSLocalizedString(@"K_LangSzec", nil),NSLocalizedString(@"K_LangJapa", nil),NSLocalizedString(@"K_LangRuss", nil),NSLocalizedString(@"K_LangFren", nil),NSLocalizedString(@"K_LangSpan", nil),NSLocalizedString(@"K_LangKor", nil), nil];
  11. _isTranslate = NO;
  12. }
  13. - (IFlySpeechRecognizer *)iFlySpeechRecognizer {
  14. if (_iFlySpeechRecognizer == nil) {
  15. _iFlySpeechRecognizer = IFlySpeechRecognizer.sharedInstance;
  16. _iFlySpeechRecognizer.delegate = self;
  17. //设置识别参数
  18. //设置为听写模式
  19. [_iFlySpeechRecognizer setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]];
  20. //Set result type
  21. [_iFlySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
  22. //Set microphone as audio source
  23. // [_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_source"];
  24. PHAIIATConfig *instance = [PHAIIATConfig sharedInstance];
  25. //set timeout of recording
  26. [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
  27. //set VAD timeout of end of speech(EOS)
  28. [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];
  29. //set VAD timeout of beginning of speech(BOS)
  30. [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];
  31. //set network timeout
  32. [_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];
  33. //set sample rate, 16K as a recommended option
  34. [_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
  35. //set language
  36. [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
  37. //set accent
  38. [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];
  39. //set whether or not to show punctuation in recognition results
  40. [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];
  41. }
  42. return _iFlySpeechRecognizer;
  43. }

2.监听讯飞录音状态

实现代理<IFlySpeechRecognizerDelegate>

  1. #pragma mark - IFlySpeechRecognizerDelegate
  2. /**
  3. volume callback,range from 0 to 30.
  4. **/
  5. - (void)onVolumeChanged: (int)volume {
  6. }
  7. /**
  8. Beginning Of Speech
  9. **/
  10. - (void)onBeginOfSpeech {
  11. IFlyLog(@"onBeginOfSpeech");
  12. }
  13. /**
  14. End Of Speech
  15. **/
  16. - (void)onEndOfSpeech {
  17. IFlyLog(@"onEndOfSpeech");
  18. }
  19. /**
  20. recognition session completion, which will be invoked no matter whether it exits error.
  21. error.errorCode =
  22. 0 success
  23. other fail
  24. **/
  25. - (void)onCompleted:(IFlySpeechError *)error {
  26. IFlyLog(@"%s",__func__);
  27. self.result = nil;
  28. if (error.errorCode != 0) {
  29. IFlyLog(@"语音识别出现问题:%@", error.errorDesc);
  30. } else {
  31. PHAIFileManager *fileManager = PHAIFileManager.sharedManager;
  32. NSString *fileName = self.fileName;
  33. NSString *pcmFilePath = [fileManager getCachesPCMURLWithName:fileName].path;
  34. NSString *mp3FilePath = [fileManager getIATAudioFileWithName:fileName].path;
  35. int sampleRate = [PHAIIATConfig.sharedInstance.sampleRate intValue];
  36. __weak typeof(self) weakSelf = self;
  37. [PHAIMP3Encoder conventToMp3WithCafFilePath:pcmFilePath
  38. mp3FilePath:mp3FilePath
  39. sampleRate:sampleRate
  40. callback:^(BOOL complete) {
  41. if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(mp3EnconderComplete:fileName:)]) {
  42. [weakSelf.delegate mp3EnconderComplete:complete fileName:fileName];
  43. }
  44. AudioEncoderLog(@"转码完成");
  45. }];
  46. }
  47. if (self.delegate && [self.delegate respondsToSelector:@selector(recongnizingComplete:)]) {
  48. [self.delegate recongnizingComplete:error.errorCode == 0];
  49. }
  50. }
  51. /**
  52. result callback of recognition without view
  53. results:recognition results
  54. isLast:whether or not this is the last result
  55. **/
  56. - (void)onResults:(NSArray *)results isLast:(BOOL)isLast {
  57. IFlyLog(@"%@",results);
  58. NSMutableString *resultString = [[NSMutableString alloc] init];
  59. NSDictionary *dic = results[0];
  60. for (NSString *key in dic) {
  61. [resultString appendFormat:@"%@",key];
  62. }
  63. if (self.result == nil) {
  64. self.result = @"";
  65. }
  66. NSString *result = [NSString stringWithFormat:@"%@%@", self.result, resultString];
  67. NSString * resultFromJson = nil;
  68. if([PHAIIATConfig sharedInstance].isTranslate) {
  69. NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData: //The result type must be utf8, otherwise an unknown error will happen.
  70. [resultString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];
  71. if(resultDic != nil){
  72. NSDictionary *trans_result = [resultDic objectForKey:@"trans_result"];
  73. if([[PHAIIATConfig sharedInstance].language isEqualToString:@"en_us"]){
  74. NSString *dst = [trans_result objectForKey:@"dst"];
  75. IFlyLog(@"dst=%@",dst);
  76. resultFromJson = [NSString stringWithFormat:@"%@\ndst:%@",resultString,dst];
  77. }
  78. else{
  79. NSString *src = [trans_result objectForKey:@"src"];
  80. IFlyLog(@"src=%@",src);
  81. resultFromJson = [NSString stringWithFormat:@"%@\nsrc:%@",resultString,src];
  82. }
  83. }
  84. }
  85. else{
  86. resultFromJson = [PHAIISRDataHelper stringFromJson:resultString];
  87. }
  88. self.result = [NSString stringWithFormat:@"%@%@",self.result, resultFromJson];
  89. // NSData *jsonData = [resultString dataUsingEncoding:NSUTF8StringEncoding];
  90. // NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
  91. // if (json) {
  92. // [self.jsons addObject:json];
  93. // }
  94. if (resultString) {
  95. [self.jsons addObject:resultString];
  96. }
  97. if (isLast){
  98. IFlyLog(@"ISR Results(json):%@", result);
  99. }
  100. IFlyLog(@"result=%@", result);
  101. IFlyLog(@"resultFromJson=%@",resultFromJson);
  102. IFlyLog(@"isLast=%d,_textView.text=%@",isLast, self.result);
  103. if (self.delegate && [self.delegate respondsToSelector:@selector(recognizingResult:)]) {
  104. [self.delegate recognizingResult:self.result];
  105. }
  106. }
  107. /**
  108. callback of canceling recognition
  109. **/
  110. - (void)onCancel {
  111. self.result = nil;
  112. IFlyLog(@"Recognition is cancelled");
  113. }
  114. #pragma mark - Getter
  115. - (NSData *)data {
  116. if (self.jsons.count > 0) {
  117. NSError *error;
  118. NSData *data = [NSJSONSerialization dataWithJSONObject:self.jsons options:NSJSONWritingPrettyPrinted error:&error];
  119. if (error) {
  120. IFlyLog(@"讯飞语音识别json生成失败: %@", error);
  121. return nil;
  122. } else {
  123. return data;
  124. }
  125. } else {
  126. return nil;
  127. }
  128. }