重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
iOS在线识别:
嵩县网站建设公司创新互联公司,嵩县网站设计制作,有大型网站制作公司丰富经验。已为嵩县成百上千家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的嵩县做网站的公司定做!
kaldi静态库集成到项目中没问题后,现在就需要采集音频发送给解码器去解码。
我这里对音频的传输采用的是GStreamer的库,我们也可以采用自己的方式去传输音频,GStreamer的好处就是能将音频进行缓存,每次都能有序的从GstBufferSource中去读取数据进行解码,我们能控制好这个传输的管道,自己实现完全没问题。
采集
iOS采集音频的方式有很多种,我这里简单贴出我采集的方式:
传输
因为传输我是用的GStreamer,所以这里需要我们对GStreamer有个了解,不然不知道怎么去跟解码器串联起来,出了问题也不知道怎么查。
通俗的说,GStreamer在这里起到了一个管道的作用,连通采集跟解码器,管道内部有很多的元件,都是对音频的处理,这个我们不用去关心它是怎么去处理的,我们只需要知道这个管道里面都要需要哪些元件,怎么把他们串起来就可以了。
我这里用的元件有:
我们了解了这些元件,通过下面方法创建元件:
我们获得了这些元件,接下来我们就需要将这些元件加入到管道(pipeline)中:
接下来是将每个元件关联起来:
以上我们就做好了这个传输数据的管道,有些事件的监听和状态的设置也需要在这里做,因为都是一些标准的设置,我这里就不赘述了。
推送数据
采集到数据后,我们可以通过如下方式推送数据:
这样数据通过管道就会到达识别解码器,当然解码器也要做好接收的准备,这个后面讲自定义解码器插件的时候会说。
至此,我们就完成了音频的传输。
原文地址:
一、引言
iOS10系统是一个较有突破性的系统,其在Message,Notification等方面都开放了很多实用性的开发接口。本篇博客将主要探讨iOS10中新引入的SpeechFramework框架。有个这个框架,开发者可以十分容易的为自己的App添加语音识别功能,不需要再依赖于其他第三方的语音识别服务,并且,Apple的Siri应用的强大也证明了Apple的语音服务是足够强大的,不通过第三方,也大大增强了用户的安全性。
二、SpeechFramework框架中的重要类
SpeechFramework框架比较轻量级,其中的类并不十分冗杂,在学习SpeechFramework框架前,我们需要对其中类与类与类之间的关系有个大致的熟悉了解。
SFSpeechRecognizer:这个类是语音识别的操作类,用于语音识别用户权限的申请,语言环境的设置,语音模式的设置以及向Apple服务发送语音识别的请求。
SFSpeechRecognitionTask:这个类是语音识别服务请求任务类,每一个语音识别请求都可以抽象为一个SFSpeechRecognitionTask实例,其中SFSpeechRecognitionTaskDelegate协议中约定了许多请求任务过程中的监听方法。
SFSpeechRecognitionRequest:语音识别请求类,需要通过其子类来进行实例化。
SFSpeechURLRecognitionRequest:通过音频URL来创建语音识别请求。
SFSpeechAudioBufferRecognitionRequest:通过音频流来创建语音识别请求。
SFSpeechRecognitionResult:语音识别请求结果类。
SFTranscription:语音转换后的信息类。
SFTranscriptionSegment:语音转换中的音频节点类。
三、申请用户语音识别权限与进行语音识别请求
开发者若要在自己的App中使用语音识别功能,需要获取用户的同意。首先需要在工程的Info.plist文件中添加一个Privacy-Speech Recognition Usage Description键,其实需要对应一个String类型的值,这个值将会在系统获取权限的警告框中显示,Info.plist文件如下图所示:
使用SFSpeechRecognize类的requestAuthorization方法来进行用户权限的申请,用户的反馈结果会在这个方法的回调block中传入,如下:
//申请用户语音识别权限
[SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
}];
SFSpeechRecognizerAuthorzationStatus枚举中定义了用户的反馈结果,如下:
typedef NS_ENUM(NSInteger, SFSpeechRecognizerAuthorizationStatus) {
//结果未知 用户尚未进行选择
SFSpeechRecognizerAuthorizationStatusNotDetermined,
//用户拒绝授权语音识别
SFSpeechRecognizerAuthorizationStatusDenied,
//设备不支持语音识别功能
SFSpeechRecognizerAuthorizationStatusRestricted,
//用户授权语音识别
SFSpeechRecognizerAuthorizationStatusAuthorized,
};
如果申请用户语音识别权限成功,开发者可以通过SFSpeechRecognizer操作类来进行语音识别请求,示例如下:
//创建语音识别操作类对象
SFSpeechRecognizer * rec = [[SFSpeechRecognizer alloc]init];
//通过一个音频路径创建音频识别请求
SFSpeechRecognitionRequest * request = [[SFSpeechURLRecognitionRequest alloc]initWithURL:[[NSBundle mainBundle] URLForResource:@"7011" withExtension:@"m4a"]];
//进行请求
[rec recognitionTaskWithRequest:request resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
//打印语音识别的结果字符串
NSLog(@"%@",result.bestTranscription.formattedString);
}];
四、深入SFSpeechRecognizer类
SFSpeechRecognizer类的主要作用是申请权限,配置参数与进行语音识别请求。其中比较重要的属性与方法如下:
//获取当前用户权限状态
+ (SFSpeechRecognizerAuthorizationStatus)authorizationStatus;
//申请语音识别用户权限
+ (void)requestAuthorization:(void(^)(SFSpeechRecognizerAuthorizationStatus status))handler;
//获取所支持的所有语言环境
+ (NSSetNSLocale * *)supportedLocales;
//初始化方法 需要注意 这个初始化方法将默认以设备当前的语言环境作为语音识别的语言环境
- (nullable instancetype)init;
//初始化方法 设置一个特定的语言环境
- (nullable instancetype)initWithLocale:(NSLocale *)locale NS_DESIGNATED_INITIALIZER;
//语音识别是否可用
@property (nonatomic, readonly, getter=isAvailable) BOOL available;
//语音识别操作类协议代理
@property (nonatomic, weak) idSFSpeechRecognizerDelegate delegate;
//设置语音识别的配置参数 需要注意 在每个语音识别请求中也有这样一个属性 这里设置将作为默认值
//如果SFSpeechRecognitionRequest对象中也进行了设置 则会覆盖这里的值
/*
typedef NS_ENUM(NSInteger, SFSpeechRecognitionTaskHint) {
SFSpeechRecognitionTaskHintUnspecified = 0, // 无定义
SFSpeechRecognitionTaskHintDictation = 1, // 正常的听写风格
SFSpeechRecognitionTaskHintSearch = 2, // 搜索风格
SFSpeechRecognitionTaskHintConfirmation = 3, // 短语风格
};
*/
@property (nonatomic) SFSpeechRecognitionTaskHint defaultTaskHint;
//使用回调Block的方式进行语音识别请求 请求结果会在Block中传入
- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
resultHandler:(void (^)(SFSpeechRecognitionResult * __nullable result, NSError * __nullable error))resultHandler;
//使用代理回调的方式进行语音识别请求
- (SFSpeechRecognitionTask *)recognitionTaskWithRequest:(SFSpeechRecognitionRequest *)request
delegate:(id SFSpeechRecognitionTaskDelegate)delegate;
//设置请求所占用的任务队列
@property (nonatomic, strong) NSOperationQueue *queue;
SFSpeechRecognizerDelegate协议中只约定了一个方法,如下:
//当语音识别操作可用性发生改变时会被调用
- (void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available;
通过Block回调的方式进行语音识别请求十分简单,如果使用代理回调的方式,开发者需要实现SFSpeechRecognitionTaskDelegate协议中的相关方法,如下:
//当开始检测音频源中的语音时首先调用此方法
- (void)speechRecognitionDidDetectSpeech:(SFSpeechRecognitionTask *)task;
//当识别出一条可用的信息后 会调用
/*
需要注意,apple的语音识别服务会根据提供的音频源识别出多个可能的结果 每有一条结果可用 都会调用此方法
*/
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didHypothesizeTranscription:(SFTranscription *)transcription;
//当识别完成所有可用的结果后调用
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishRecognition:(SFSpeechRecognitionResult *)recognitionResult;
//当不再接受音频输入时调用 即开始处理语音识别任务时调用
- (void)speechRecognitionTaskFinishedReadingAudio:(SFSpeechRecognitionTask *)task;
//当语音识别任务被取消时调用
- (void)speechRecognitionTaskWasCancelled:(SFSpeechRecognitionTask *)task;
//语音识别任务完成时被调用
- (void)speechRecognitionTask:(SFSpeechRecognitionTask *)task didFinishSuccessfully:(BOOL)successfully;
SFSpeechRecognitionTask类中封装了属性和方法如下:
//此任务的当前状态
/*
typedef NS_ENUM(NSInteger, SFSpeechRecognitionTaskState) {
SFSpeechRecognitionTaskStateStarting = 0, // 任务开始
SFSpeechRecognitionTaskStateRunning = 1, // 任务正在运行
SFSpeechRecognitionTaskStateFinishing = 2, // 不在进行音频读入 即将返回识别结果
SFSpeechRecognitionTaskStateCanceling = 3, // 任务取消
SFSpeechRecognitionTaskStateCompleted = 4, // 所有结果返回完成
};
*/
@property (nonatomic, readonly) SFSpeechRecognitionTaskState state;
//音频输入是否完成
@property (nonatomic, readonly, getter=isFinishing) BOOL finishing;
//手动完成音频输入 不再接收音频
- (void)finish;
//任务是否被取消
@property (nonatomic, readonly, getter=isCancelled) BOOL cancelled;
//手动取消任务
- (void)cancel;
关于音频识别请求类,除了可以使用SFSpeechURLRecognitionRequest类来进行创建外,还可以使用SFSpeechAudioBufferRecognitionRequest类来进行创建:
@interface SFSpeechAudioBufferRecognitionRequest : SFSpeechRecognitionRequest
@property (nonatomic, readonly) AVAudioFormat *nativeAudioFormat;
//拼接音频流
- (void)appendAudioPCMBuffer:(AVAudioPCMBuffer *)audioPCMBuffer;
- (void)appendAudioSampleBuffer:(CMSampleBufferRef)sampleBuffer;
//完成输入
- (void)endAudio;
@end
五、语音识别结果类SFSpeechRecognitionResult
SFSpeechRecognitionResult类是语音识别结果的封装,其中包含了许多套平行的识别信息,其每一份识别信息都有可信度属性来描述其准确程度。SFSpeechRecognitionResult类中属性如下:
//识别到的多套语音转换信息数组 其会按照准确度进行排序
@property (nonatomic, readonly, copy) NSArraySFTranscription * *transcriptions;
//准确性最高的识别实例
@property (nonatomic, readonly, copy) SFTranscription *bestTranscription;
//是否已经完成 如果YES 则所有所有识别信息都已经获取完成
@property (nonatomic, readonly, getter=isFinal) BOOL final;
SFSpeechRecognitionResult类只是语音识别结果的一个封装,真正的识别信息定义在SFTranscription类中,SFTranscription类中属性如下:
//完整的语音识别准换后的文本信息字符串
@property (nonatomic, readonly, copy) NSString *formattedString;
//语音识别节点数组
@property (nonatomic, readonly, copy) NSArraySFTranscriptionSegment * *segments;
当对一句完整的话进行识别时,Apple的语音识别服务实际上会把这句语音拆分成若干个音频节点,每个节点可能为一个单词,SFTranscription类中的segments属性就存放这些节点。SFTranscriptionSegment类中定义的属性如下:
//当前节点识别后的文本信息
@property (nonatomic, readonly, copy) NSString *substring;
//当前节点识别后的文本信息在整体识别语句中的位置
@property (nonatomic, readonly) NSRange substringRange;
//当前节点的音频时间戳
@property (nonatomic, readonly) NSTimeInterval timestamp;
//当前节点音频的持续时间
@property (nonatomic, readonly) NSTimeInterval duration;
//可信度/准确度 0-1之间
@property (nonatomic, readonly) float confidence;
//关于此节点的其他可能的识别结果
@property (nonatomic, readonly) NSArrayNSString * *alternativeSubstrings;
温馨提示:SpeechFramework框架在模拟器上运行会出现异常情况,无法进行语音识别请求。会报出kAFAssistantErrorDomain的错误,还望有知道解决方案的朋友,给些建议,Thanks。
下载和安装,现在我们使用的最新版本是ibm viavoice9.1简体中文版,很多网站都有下载,大家可以用百度搜索,下载来的文件格式一般为iso镜像,所以要用虚拟光驱安装。软件的安装没有什么特别之处,一路下一步就行了,当然也可以在安装向导里修改安装信息,要注意的是一定要关闭杀毒软件,由于软件在安装过程中需要重起电脑,重起后还要继续安装,所以最好将杀毒软件的自动运行也暂时关闭。语音训练:这是使用viavoice最关键的一步,对于盲人来说也是难度最大的环节,如果顺利过了这一关,我们的工作也就完成了七八成了,剩下的软件操作其实并不复杂。程序安装完成后,程序自动开始运行,首先会出现一段语音提示,紧接着探出用户向导。要求输入用户名和选择音频设备,采用默认即可,如果有两块声卡就要选择其中之一。点下一步,探出音频设置向导,点击测试按钮,出现一段回放音乐,系统音量测试成功,下一步进入麦克风设置。选择头戴式麦克风,下一步,在音频输出设备的列表里仍然要选择头戴式麦克风。下一步,要求连接好麦克风,不用管它,继续下一步。开始测试麦克风,点测试即开始测试环境噪音,完成后在点下一步。这一部系统询问你是否有信号适配器,一定要选是,继续下一步。这时系统要调整麦克风音量。在测试过程中环境要保持安静,关闭音箱,带好耳麦,让读屏的声音从耳麦里发出,并且要将读屏的语速调到最慢,因为下面要跟随读屏朗读系统给出的语句。点击开始,读出系统给出的语句即可,这段文字可以用四六件切换来找到,其内容如下:"这里有一小段文章,您必须用正常、轻松的语调将其读出。请在段落与语句之间自然停顿。计算机将利用这一过程调整其音量。当这一过程完成以后,您会听到一小段结束提示音,系统将显示声音的品质。在听到这一小段提示音之前,您必须不断地重复这段文章。"这时可以用小键盘的加减号及点号[暂停]来控制跟读的速度及停顿。待出现声音提示在点下一步。现在就要开始创建个人语音模型了。这一步至关重要,会直接影响将来语音识别的效果。在点下一步语音模型的创建就真正开始了。系统要求你读出下面的文字,四六键切换到六可编辑文字处,tab键切换到开始按钮,点击及开始,用加减号配合点号跟随读屏朗读。如果系统跟不上你的朗读速度,便发出声音提示,此时就点击暂停,在点继续重复朗读。读完后系统提示正在处理请稍候。系统会进行语音训练,训练完毕后,最简单的语音模型就建立完毕了,当然可以想像得到,这样轻松建立起来的模型效果并不是很好。稍等片刻在点下一步。这一部是分析你的语音,以便让系统了解你的说话方式。选择开始录音单选按钮,继续下一步。在列表里选择一篇文章,四六键切换到十二可编辑文字处,tab键切换到开始按钮,点击开始,还是用加减号配合点号跟读,如果我们的说话没有被系统识别出来,屏幕上的文字就不会往下滚动,并发出声音提示。这时可以按加减号重复朗读,直到出现新的文字,才可以继续往下朗读。为了提高识别率,建议将列表中的四篇文章全部读完。读完文章以后点下一步。系统提示正在处理请稍候,等几分钟后点完成。到此,个人用户(语音模型)建立完毕,我们可以正式开始使用语音输入了。语音输入:语音训练及语音模型的建立虽然比较繁琐,但是软件的使用却非常简单。其功能只有声控命令和语音听写。在程序组中启动ibm viavoice语音中心,程序运行后在通知区域工具栏里出现viavoice的图标。我们首先要设置麦克风开关状态的热键,在停止语音输入时要立刻官麦,否则会出现大量的乱码、或发出错误命令导致不必要的麻烦。右键单击通知区域里的viavoice图标,在探出菜单里选用户选项,右光标,点viavoice选项。在探出的对话框中选启动选项卡,选中麦克风状态和发现问题时启动识别向导程序复选矿,要不老有识别向导跳出来捣乱。在21热键域无处加入快捷键。如果创建了几个用户,就要在用户选项卡里选择你自己创建的用户,否则识别效果会很差。其它选项涉及到高级设置,采用默认设置即可,带操作熟练后可在作改动。点确定关闭对话框。此时按下刚才设置的快捷键打开麦克风,[当然在菜单里也有这个命令],就进入了语音输入状态了。第一次使用会有语音提示。此时你就可以向计算机下达任何语音命令,让它为你做你想做的任何事情。想要了解当前有什么命令可用,只要说出当前命令及,就会调出当前可用命令。要了解当前帮助,就说学习内容,就会调出当前帮助。要想启动某个程序就说出启动某程序,例如想要启动大智慧,就说启动大智慧,大智慧就随即启动了。又如在ie里面,只要说出某个链接的名称即可进入该页面,说出任何菜单和按钮名称即可执行相应的命令,你说出收藏夹,收藏夹就立刻打开了,在说出收藏夹中网站的名称,就会打开该网站。viavoice支持几乎所有的已安装的或将要安装的应用程序的声控操作和直接听写。只要应用程序有文本编辑框就可以进行语音听写,但要先说直接听写,进入文字听写模式,结束听写后要说停止直接听写,回到命令输入模式。如在qq的聊天界面上,激活文本输入框,说出要输入的内容,即可在编辑框中自动写出相应的文字。不过初期使用识别的准确率不可能达到很高,需要进行一些手工修改,但是它有自学习功能,随着使用的增多,识别的准确率会越来越高。在进行听写时,请您使用连续语音,并注意同时口述标点符号和编排命令,比如句号,逗号和另起一段。尽量使用正常的节奏讲话,不要太快,也不要太慢。尽量不要吞音或者滑音,也不要故意拉长或者略读某些词语。尽量不要连读,也没有必要故意对某些音进行重读。开始时您会可能会讲话比较快。请耐心一点,放慢速度。过了一段时间之后,您就会发现完全可以在不损失准确率的情况下提高讲话速率。不要对着麦克风大声讲话,请使用尽量平和的语音。正确佩戴麦克风对语音识别率非常重要。请确认麦克风接收头(在海绵套的里面)离您的嘴角大约一个拇指的距离,并检查麦克风上的白点正对着您的嘴部。不要将海绵套拿走,它可以起过滤作用。 不要将麦克风正对您的嘴部,以防受呼吸影响。每次使用麦克风时请不要变动麦克风的位置,例如麦克风的距离时远时近。如果进行大量文字录入,建议使用系统自带的字处理程序[语音板]。说出听写到语音板,语音板随即启动。这是一个类似写字板的编辑工具,语音板拥有写字板的所有功能而且增加了听写能力。语音听写与其他应用程序中的直接听写的注意事项基本一致,要想执行语音命令,在听写过程中稍作停顿,说出菜单命令即可。值得注意的是纠错窗口的使用。 在听写的过程中,ViaVoice可能会发生误识。您可以用纠错窗口对误识词进行纠错,以便ViaVoice以后提高识别率;或者让ViaVoice分析您已有的文档,以便让ViaVoice熟悉您的措辞和行文方式。在口述一段文字以后,查找误识的词。如果要对某个词或短语进行纠错,先选中该词,然后说出纠错就会探出纠错窗口。如果正确的词已经位于候选词列表中,念出该词的序号。这一动作将纠正所选的词或短语。如果正确的词不在候选词列表中,你可以单击纠错窗口的文本编辑框,输入正确的词/短语。念纠错或者按回车进行确定。z在听写完一篇文章以后,建议用文档分析程序对刚写的文章进行分析,从而修正语言模型,提高识别率。
Siri暂未对外开放。只有自带的输入法和系统语音助手可以语音识别就酱。听说这次开发者大会会开发Siri的API