讯飞语音识别

使用讯飞开放平台实现语音识别合成

社会和产品的发展总是向着便利和智能的方法发展,对于手机的App来说也是如此.所以,现在的App都在缩减流程,优化使用体验,为的就是让用户用起来更加便利,提高App的入手度和用户粘性.那么另一方面的智能呢?

一个比较简单智能的实现方法就是在输入的地方加上语音识别,在输出显示的时候加上语音合成,直接进行语音播报,那么是不是对于司机等来说就是一个智能的体现呢?

现在做语音识别有一些不错的开放平台可以给我们直接提供使用,一家是科大讯飞开放平台,一家是百度语音开放平台.我个人比较喜欢讯飞,因为讯飞的优
势是在大段文字的识别上,准确率比较高.这正好符合我的需求,这篇博客也主要讲的是讯飞语音SDK的使用.

讯飞开发步骤

讯飞开发教程上写的比较清楚也比较啰嗦,并不是一个最简洁的Demo.所以我在这篇博客里进行了一些适当的删减,争取做一个最简单的demo.

1 申请账号ID

登陆到讯飞开放平台上,在用户菜单栏里就有创建我的应用.这里的登陆也可以采用第三方的方式.在创建应用的界面填写相关的信息即可.然后就会有一个SDK下载的链接.如果没有,直接去SDK下载中心按照三步选项去进行新的下载即可.这里不做过多的描述.

2 导入讯飞SDK框架

下载下来的SDK包解压出来有三个文件夹,第一个市doc文件夹,不多说,肯定是开发文档,还有
相关的作者信息什么的.最重要的是剩下的两个文件夹,一个是lib文件夹,这里存放的是讯飞SDK的类库文件,我们导入SDK就是导入的这里的文件.第三
个文件夹是一个IOS的Demo演示工程.
1 添加静态库
新建一个IOS工程,将lib文件夹下的”iflyMSC.framework”文件拷贝到工程目录下,然后在工程配置文件的[Build Phases]-[Link Binary With Libraries]中通过[AddOther]
2 确认SDK路径
在配置文件中搜索”head”找到[Framework Search Paths],点开查看SDK的路径是不是绝对路径,如果是如下图的样子,那就没问题了.这一步主要是确保SDK的路径为相对路径,防止工程换了文件夹位置就无法运行的情况的发生.

3 添加框架
按照下图依次将图中的所有的框架添加到工程里面.讯飞官网API中给出的截图是XCode7以前的,XCode7之后一些动态链接库的后缀名发生了改变,Xcode7中添加完毕之后如下图:

语音识别

语音识别分两种,分别用在不同的场合,一个是界面提示的语音识别,一个是无界面提示的语音识别,这里以有界面提示的语音识别为例子.

有界面提示的语音识别

1 导入头文件

//将讯飞SDK中的所有类都导入进来
#import < iflyMSC/iflyMSC.h >

2 登陆讯飞服务器
在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"565e4dd9"];
[IFlySpeechUtility createUtility:initString];

3 创建有界面提示的语音识别对象
创建一个讯飞语音识别对象,可以对他进行一系列的调用

@property (nonatomic, strong) IFlyRecognizerView *iflyRecognizerView;//带界面的识别对象

4 初始化带界面的识别对象
前面声明了一个带界面的语音识别对象,现在需要对这个识别对象进行初始化,同样是在ViewDidLoad()方法中进行就行.

#pragma mark ------ 进行有界面的语音识别的初始化
_iflyRecognizerView = [[IFlyRecognizerView alloc] initWithCenter:self.view.center];
_iflyRecognizerView.delegate = self;
[_iflyRecognizerView setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]];
//asr_audio_path保存录音文件名,如不再需要,设置value为nil表示取消,默认目录是documents
[_iflyRecognizerView setParameter:@"asrview.pcm " forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];

5 实现代理方法
讯飞对识别结果的处理采用的代理回调的方法,实现IFlySpeechSynthesizerDelegate协议的onResult:isLast:方法.
注意!!!!这里的是onResult,不是onResults,后者是无界面提示的语音解析的结果回调函数.

- (void)onResult: (NSArray *)resultArray isLast:(BOOL) isLast
{
    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [resultArray objectAtIndex:0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
//这里需要在下载的demo里面拖入ISRDataHelper.h和ISRDataHelper.m文件然背后引入头文件
    NSString * resu = [ISRDataHelper stringFromJson:result];
    //将结果显示在界面的Label上
    _text.text = [NSString stringWithFormat:@"%@%@",_text.text,resu];
}

这里默认的传回来的是Json字符串,需要对字符串进行解析.当然,讯飞还是比较良心的,在demo中给提供了一个解析类,就是上面用到的ISRDataHelper.用它来进行解析就可以了. 6 触发开始语音识别 拖动一个Button,给一个响应事件,用于开始监听语音识别

//启动识别服务
[_iflyRecognizerView start];

这个时候运行App,就可以进行语音识别了,运行的结果应该如下图:

无界面提示的语音识别

无界面提示的语音识别适合将语音识别放在后台,这个看具体的使用场景.无界面的方式相对来说简洁大方,可制定性高.
1 导入头文件

//将讯飞SDK中的所有类都导入进来
#import < iflyMSC/iflyMSC.h >

2 登陆讯飞服务器
在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"565e4dd9"];
[IFlySpeechUtility createUtility:initString];

3 创建无界面提示的语音识别对象
创建一个讯飞语音识别对象,可以对他进行一系列的调用

@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;//不带界面的识别对象

4 对象初始化
前面声明了一些在语音合成的时候会用到的对象,现在需要对前面的对象进行初始化.还是在ViewDidLoad()里面进行就可以了.这里的初始化内容比较多,是进行一些语音的设置,所以单独做成了一个方法,在ViewDidLoad()中进行调用即可.

-(void)initRecognizer{
//单例模式,无UI的实例
if (_iFlySpeechRecognizer == nil) {
   _iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];            [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
   //设置听写模式
   [_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
}
_iFlySpeechRecognizer.delegate = self;
if (_iFlySpeechRecognizer != nil) {
   IATConfig *instance = [IATConfig sharedInstance];
   //设置最长录音时间
   [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
   //设置后端点
   [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];
    //设置前端点
    [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];
    //网络等待时间
    [_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];
    //设置采样率,推荐使用16K
    [_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
    if ([instance.language isEqualToString:[IATConfig chinese]]) {
        //设置语言
        [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
        //设置方言
        [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];
    }else if ([instance.language isEqualToString:[IATConfig english]]) {
        [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
    }
    //设置是否返回标点符号
    [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];
}
}

5 实现代理方法
讯飞对识别结果的处理采用的代理回调的方法,实现IFlySpeechSynthesizerDelegate协议的onResult:isLast:方法.
注意!!!!这里的是onResults,不是onResult,前者是有界面提示的语音识别的结果回调函数.

- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{
    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [results objectAtIndex:0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    NSString * resu = [ISRDataHelper stringFromJson:result];
    _text.text = [NSString stringWithFormat:@"%@%@",_text.text,resu];
}

6 触发语音合成
添加一个输入框,一个button,button的响应时间是将输入框中的文本内容读出来.

if(_iFlySpeechRecognizer == nil)
{
    [self initRecognizer];
}
[_iFlySpeechRecognizer cancel];
//设置音频来源为麦克风
[_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_source"];
//设置听写结果格式为json
[_iFlySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
//保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下
[_iFlySpeechRecognizer setParameter:@"asr.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
[_iFlySpeechRecognizer setDelegate:self];
BOOL ret = [_iFlySpeechRecognizer startListening];

语音合成

语音合成和语音识别的过程差不多
1 导入头文件

//将讯飞SDK中的所有类都导入进来
#import < iflyMSC/iflyMSC.h >
#import "PcmPlayer.h"
#import "TTSConfig.h"

2 登陆讯飞服务器
在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"565e4dd9"];
[IFlySpeechUtility createUtility:initString];

3 创建有界面提示的语音识别对象
创建一个讯飞语音识别对象,可以对他进行一系列的调用

typedef NS_OPTIONS(NSInteger, SynthesizeType) {
    NomalType           = 5,//普通合成
    UriType             = 6, //uri合成
};
@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;//语音合成对象
@property (nonatomic, strong) PcmPlayer *audioPlayer;//用于播放音频的
@property (nonatomic, assign) SynthesizeType synType;//是何种合成方式
@property (nonatomic, assign) BOOL hasError;//解析过程中是否出现错误

4 对象初始化
前面声明了一些在语音合成的时候会用到的对象,现在需要对前面的对象进行初始化.还是在ViewDidLoad()里面进行就可以了.

TTSConfig *instance = [TTSConfig sharedInstance];
if (instance == nil) {
    return;
}
//合成服务单例
if (_iFlySpeechSynthesizer == nil) {
    _iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
}
_iFlySpeechSynthesizer.delegate = self;
//设置语速1-100
[_iFlySpeechSynthesizer setParameter:instance.speed forKey:[IFlySpeechConstant SPEED]];
//设置音量1-100
[_iFlySpeechSynthesizer setParameter:instance.volume forKey:[IFlySpeechConstant VOLUME]];
//设置音调1-100
[_iFlySpeechSynthesizer setParameter:instance.pitch forKey:[IFlySpeechConstant PITCH]];
 //设置采样率
 [_iFlySpeechSynthesizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
//设置发音人
 [_iFlySpeechSynthesizer setParameter:instance.vcnName forKey:[IFlySpeechConstant VOICE_NAME]];

5 触发语音合成
添加一个输入框,一个button,button的响应时间是将输入框中的文本内容读出来.

if ([self.VoiceText.text isEqualToString:@""]) {
    return;
}
if (_audioPlayer != nil && _audioPlayer.isPlaying == YES) {
    [_audioPlayer stop];
    }
_synType = NomalType;
self.hasError = NO;
[NSThread sleepForTimeInterval:0.05];
_iFlySpeechSynthesizer.delegate = self;
[_iFlySpeechSynthesizer startSpeaking:self.VoiceText.text];
时间: 2024-08-10 17:55:48

讯飞语音识别的相关文章

android 讯飞语音识别(离线)注意事项

讯飞语音识别:使用注意事项:mainfest.xml中一定要记得权限写进去21001:我的情况是没有写SpeechApp类,并且需要在application中注册:20005:无匹配结果23300:本地引擎错误,,我的问题是在于语法错误,少了一个分号,,,尼玛,调试好久才找到,而且不会有提示. 一般情况下引擎错误的原因: 1.java代码检查你的语法文件路径.语法ID等相关配置: 2.语法文件语法是否正确,可能多了分号,少了分号,等等,必须严格按照BNF语法(最常出现):

Unity3D5.3.5 PC x64讯飞语音识别测试

星期天掉了一天头发,晚上终于写完了,移植的讯飞官方C++例子的代码,测试环境Win7 64位,64位Unity5.3.5,32位应该同理,换个32位的讯飞dll就行,没测试但是理论上应该能行 程序必需在网络环境运行,因为要网络通信 有麦克风点左上角录音,可以对着麦克录音,停止,自动识别,没麦点右上角识别硬盘音频文件 语言0中文,1英文,想识别鸟语I used to be an advanture like you的别忘了切换 默认录音10秒,要录长时间音频自己设置,因为Unity用的不熟,不能自

iOS-Senior23-科大讯飞语音识别1

科大讯飞语音识别 随着当今社会的高速发展,我们所使用的产品也向着遍历和智能的方面发展着,当然了手机端的App也不例外.现在的App都在缩减用户操作的流程,优化用户的体验,为了更加便利用户.提高用户的DAU(日活),增加用户的粘性一般我们都会想出比较新颖的招式. 如果现在有这样一个需求:用户需求:用户需要绑定银行卡输入银行卡号,手动输入增加用户的操作度,所以用户可以通过语音读取银行卡号码,是不是既方便又只能,现在做语音识别的有一些不错的开放平台供我们使用,一家是科大讯飞平台,一家是百度语音平台.我

iOS-Senior23-科大讯飞语音识别2

将文字转成语音,步骤和什么类似,直接上代码 //第一步:引入头文件 //文字识别的回调方法接口 #import <iflyMSC/IFlySpeechSynthesizerDelegate.h> //文字识别对象 #import <iflyMSC/IFlySpeechSynthesizer.h> //科大讯飞语音框架定义的常量 #import <iflyMSC/IFlySpeechConstant.h> //延展 @interface SecondViewControl

讯飞语音识别Android-Demo

import java.io.UnsupportedEncodingException; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.View; import andr

讯飞语音 使用步骤(针对androidStudio):语音转文字:

前言:最近做项目用到了讯飞语音,遂搞了一个简单的教程,供大家使用. 讯飞语音  使用步骤:语音转文字:   1,首先去讯飞开放平台( http://www.xfyun.cn/)注册,账号:   2,注册后登录: 3,点击选择我的语音云:   4,点击左侧边栏,创建新的应用: 5,创建好应用后:如图:复制appid: 6,下载sdk:  点击边栏左侧sdk下载中心: 选择我们所需要的功能和平台: 7,点击下载sdk,保存文件,并打开. //-----------------------------

ios语音识别(讯飞)

语音识别系统 为了方便人们的生活,许多的方面都可以通过语音指令来代替手动输入来执行想要的指令.现在做语音识别的有一些不错的开放平台供我们使用,一家是科大讯飞平台,一家是百度语音平台.我个人比较偏爱科大讯飞,因为科大讯飞的优势在于大 段大段的文字识别上,准确率较高.这正好能符合我输入银行卡号准确无误的需求.这篇博客也主要讲的是讯飞语音SDK的使用.下面我们来详细看一下科大讯飞. 1.科大讯飞开放平台 2.科大讯飞iOS - API开放平台 科大讯飞的操作步骤 1.注册ID 正常的注册步骤,一步一步

Android 通过调用系统接口使用如 谷歌语音、百度语音、讯飞语音等语音识别对话框的方法

现在app的开发进程会集成一些语音识别功能,而一般开发者是不具备自己开发一套语音识别引擎的,因此大多数情况是选择一个已经成熟的语音识别引擎SDK集成到自己的app中. 通常情况下,这种集成分两种,一种是直接调用SDK为开发者设计好的弹出框,开发者不需要开发识别交互界面:还有一种是开发者只利用SDK提供的语音识别服务,自己开发一个属于自己的交互设计. 本文介绍最简单直接调起弹出框的方法. 首先,测试机需要安装如谷歌语音.百度语音.讯飞语音等产品的语音软件,这时可以在系统设置界面的语言与输入处找到相

一段讯飞、百度等语音识别API无法识别的语音最终解决办法

最近在做语音识别.字幕扒词相关的工作,遇到了一段录音(https://download.csdn.net/download/u014220286/12169183,各位有兴趣的可以下载下来试试),音质什么的和其他处理过的无二异,也是普通话,照常理说应该能识别出来,可为了类似这样的语音丢了工作机会(前一次没重视人工速录交了,后来又遇到了,琢磨了好长时间解决了,过了交稿时间,产生信任危机了,没有机会合作了.)记录下这次的解决过程,希望给你有需要的人帮助. 首先用ffmpeg查看该音频,发现是32是浮