Nuance
最近接手的新项目是一个做翻译的公司,支持的语种较多、较广。语音识别(ASR)和语音合成(TTS)我们又多用了一家叫Nuance的开源库,一搜竟然是挺久挺出名的一家呢。
下载SDK&注册AppKey
其中开发指南就是官方文档啦,不过特别简单,我也是基于官方的文档来进行的简单应用,等后期用到更多内容的时候再更新。
最坑的地方就是AppKey相关的注册了!
其实只需要 sign up
完毕就可以了,不需要按照他们的注册指引一步一步来,我甚至都进行到需要我打包ipa然后把他们的7个(没错就是7个)UDID添加到我的帐号理的地步了,并且我真的那么做了……后来才发现,其实只要你注册完毕就有了的。
具体路径是:Home > My Account > Sandbox Credentials
我使用的SpeechKit 2.x
tips:咱们 iOS 的URL和 Android 的不一样的,不需要自己拼接,直接复制URL和 App Key就好了。
修改info.plist
应该是iOS 10的新特性,之前在用摄像头的时候也用到了。App如果需要调用硬件的话,就需要在info.plist里加入对应的键值对。
例如摄像头的:
~
NSMicrophoneUsageDescription
此 App 需要您的同意才能使用麦克风
~
<string>
串中的内容会出现在权限提醒的弹窗内(好像安卓啊)
具体<key>
的值在你崩溃的时候会告知的。
下面是麦克风的:
~
NSCameraUsageDescription
此 App 需要您的同意才能使用摄像头
~
语音识别(ASR)
其实SDK就是一个简简单单的SpeechKit.framework,直接拖到菜单里就好啦。如果报错(找不到库的那种),请在Targets > Build Settings > Search Paths
里在Framework Search Paths 后面键入你SpeechKit.framework存放的绝对路径。
一个头文件
极其简单,就一个#import <SpeechKit/SpeechKit.h>
一个代理
SKTransactionDelegate
两个变量
SKSession *sksession;
SKTransaction *speechTransaction;
配置AppKey
NSString *asrURL = @"我自己的";//就是Sandbox Credentials里的URL
NSString *appKey = @"就不填了";//就是Sandbox Credentials里很长的那串的App Key
初始化(也可以理解为开始录音)
if (!sksession) {
sksession = [[SKSession alloc] initWithURL:[NSURL URLWithString:asrURL] appToken:appKey];
}
//这个方法其实就是开始识别
speechTransaction = [sksession recognizeWithType:SKTransactionSpeechTypeDictation
detection:SKTransactionEndOfSpeechDetectionShort
language:@"eng-USA"
delegate:self];
官网文档给了5个代理方法。
- (void)transactionDidBeginRecording:(SKTransaction *)transaction {
//监视到录音开始
}
- (void)transactionDidFinishRecording:(SKTransaction *)transaction {
//录音结束
}
- (void)transaction:(SKTransaction *)transaction didReceiveRecognition:(SKRecognition *)recognition {
//返回识别结果
NSString* topRecognitionText = [recognition text];
NSLog(@"识别的结果是%@",topRecognitionText);
}
- (void)transaction:(SKTransaction *)transaction didFinishWithSuggestion:(NSString *)suggestion {
//不知道具体是干什么的方法,可是每次都会在结束的最最后调用一次。
}
- (void)transaction:(SKTransaction *)transaction didFailWithError:(NSError *)error
suggestion:(NSString *)suggestion {
//没有调用过,目测是出错的时候才会调用
}
语音合成(TTS)
与语音识别相比,同样的头文件、一样的SKSession对象(只需要init一次)、同样的代理
不同的是:
多了一个变量
SKTransaction *speakTransaction;
开始合成
SKTransaction* transaction = [session speakString:@"要合成的话"
withLanguage:@"eng-USA"
delegate:self];
代理方法只有三个
- (void)transaction:(SKTransaction *)transaction didReceiveAudio:(SKAudio *)audio
{
[sksession.audioPlayer playAudio:audio];//直接播放
}
另外两个同ASR里最后两个方法。反正我用不到。
遇到的问题
在手机静音的情况下,Nuance合成语音是听不到的,媒体音量开到最大也没有,而科大讯飞是有的。可能是options问题,也可能是session问题,不知道能不能解决,暂时放一放。