iOS使用讯飞语音-语音识别(最新版)

引言

去年在一家公司实习,接触了一点人工智能。既然接触人工智能,那么语音识别、语音合成、人脸识别等等都是必不可少的。
本来已经是离开iOS开发这条路了,还剩下毕业设计要做,所以这段时间最后一次回来接触iOS了。
以后,估计没什么机会再接触iOS,都往着机器学习、深度学习方向去了。
废话不说了,记录一下,如何接入讯飞语音。


步骤

  • 一、官网下载SDK
    去讯飞语音开放平台下载iOS的SDK
    讯飞语音开放平台

当然,你需要创建一个应用,然后才能下载iOS的SDK,应用选择语音识别的类型。(这里只是演示语音识别类型的接入,其余语音合成、人脸识别等等自己可以试试)

  • 二、工程导入相应的包和文件

这里写图片描述
这里仅演示在线语音识别,离线的请按照文档来操作
iOS讯飞操作文档

  • 三、设置系统参数
    这里写图片描述
用户隐私权限配置

iOS 10发布以来,苹果为了用户信息安全,加入隐私权限设置机制,让用户来选择是否允许。
隐私权限配置可在info.plist 新增相关privacy字段,MSC SDK中需要用到的权限主要包括麦克风权限、联系人权限和地理位置权限:

<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>

这里写图片描述

  • 四、代码初始化
    //Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid。NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",xunfeiID];[IFlySpeechUtility createUtility:initString];

这里写图片描述

ID就是对应图片的ID。
建议把上面这段代码放在AppDelegate.m中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

方法里面初始化。

PS:要导入头文件#import "IFlyMSC/IFlyMSC.h"这个头文件,没有智能提示,文档里面我好像也没看到,还有我去年写的时候有备份(下面我会狠狠吐槽讯飞)

示例代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid。NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",xunfeiID];[IFlySpeechUtility createUtility:initString];
}
//
//  MMusicViewController.m
//  MusicPlayer
//
//  Created by HZhenF on 2018/2/18.
//  Copyright © 2018年 LiuZhu. All rights reserved.
//#import "MMusicViewController.h"
#import "IFlyMSC/IFlyMSC.h"
#import "ISRDataHelper.h"@interface MMusicViewController ()<IFlySpeechRecognizerDelegate>
//不带界面的识别对象
@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;
/**生成的字符*/
@property(nonatomic,strong) NSString *resultStringFromJson;
/**当前是否可以进行录音*/
@property(nonatomic,assign) BOOL isStartRecord;
/**是否已经开始播放*/
@property(nonatomic,assign) BOOL ishadStart;@end@implementation MMusicViewController#pragma mark - 懒加载-(IFlySpeechRecognizer *)iFlySpeechRecognizer
{if (!_iFlySpeechRecognizer) {//创建语音识别对象_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];//设置识别参数//设置为听写模式[_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];//asr_audio_path 是录音文件名,设置 value 为 nil 或者为空取消保存,默认保存目录在 Library/cache 下。[_iFlySpeechRecognizer setParameter:@"iat.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];//设置最长录音时间:60秒[_iFlySpeechRecognizer setParameter:@"-1" forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];//设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音[_iFlySpeechRecognizer setParameter:@"10000" forKey:[IFlySpeechConstant VAD_EOS]];//设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理[_iFlySpeechRecognizer setParameter:@"5000" forKey:[IFlySpeechConstant VAD_BOS]];//网络等待时间[_iFlySpeechRecognizer setParameter:@"2000" forKey:[IFlySpeechConstant NET_TIMEOUT]];//设置采样率,推荐使用16K[_iFlySpeechRecognizer setParameter:@"16000" forKey:[IFlySpeechConstant SAMPLE_RATE]];//设置语言[_iFlySpeechRecognizer setParameter:@"zh_cn" forKey:[IFlySpeechConstant LANGUAGE]];//设置方言[_iFlySpeechRecognizer setParameter:@"mandarin" forKey:[IFlySpeechConstant ACCENT]];//设置是否返回标点符号[_iFlySpeechRecognizer setParameter:@"0" forKey:[IFlySpeechConstant ASR_PTT]];//设置代理_iFlySpeechRecognizer.delegate = self;}return _iFlySpeechRecognizer;
}#pragma mark - 系统方法- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];self.isStartRecord = YES;//初始化字符串,否则无法拼接self.resultStringFromJson = @"";CGRect btnRect = CGRectMake((ZFScreenW - 100)*0.5, 200, 100, 100);UIButton *btn = [[UIButton alloc] initWithFrame:btnRect];btn.backgroundColor = [UIColor orangeColor];[btn setTitle:@"语音" forState:UIControlStateNormal];[self.view addSubview:btn];UILongPressGestureRecognizer *longpress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressActionFromLongPressBtn:)];longpress.minimumPressDuration = 0.1;[btn addGestureRecognizer:longpress];
}#pragma mark - 自定义方法-(void)longPressActionFromLongPressBtn:(UILongPressGestureRecognizer *)longPress
{
//    NSLog(@"AIAction");CGPoint currentPoint = [longPress locationInView:longPress.view];if (self.isStartRecord) {self.resultStringFromJson = @"";//启动识别服务[self.iFlySpeechRecognizer startListening];self.isStartRecord = NO;self.ishadStart = YES;//开始声音动画
//        [self TipsViewShowWithType:@"start"];}//如果上移的距离大于60,就提示放弃本次录音if (currentPoint.y < -60) {//变成取消发送图片
//        [self TipsViewShowWithType:@"cancel"];self.ishadStart = NO;}else{if (self.ishadStart == NO) {//开始声音动画
//            [self TipsViewShowWithType:@"start"];self.ishadStart = YES;}}if (longPress.state == UIGestureRecognizerStateEnded) {self.isStartRecord = YES;if (currentPoint.y < -60) {[self.iFlySpeechRecognizer cancel];}else{[self.iFlySpeechRecognizer stopListening];}//让声音播放动画消失
//        [self TipsViewShowWithType:@"remove"];}}//IFlySpeechRecognizerDelegate协议实现
//识别结果返回代理
- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{NSMutableString *resultString = [[NSMutableString alloc] init];NSDictionary *dic = results[0];for (NSString *key in dic) {[resultString appendFormat:@"%@",key];}//持续拼接语音内容self.resultStringFromJson = [self.resultStringFromJson stringByAppendingString:[ISRDataHelper stringFromJson:resultString]];NSLog(@"self.resultStringFromJson = %@",self.resultStringFromJson);
}
//识别会话结束返回代理
- (void)onError: (IFlySpeechError *) error{NSLog(@"error = %@",[error description]);
}//停止录音回调
-(void)onEndOfSpeech
{self.isStartRecord = YES;
}//开始录音回调
-(void)onBeginOfSpeech
{//    NSLog(@"onbeginofspeech");
}//音量回调函数
-(void)onVolumeChanged:(int)volume
{}//会话取消回调
-(void)onCancel
{//    NSLog(@"取消本次录音");
}@end
//
//  ISRDataHelper.h
//  HYAIRobotSDK
//
//  Created by HZhenF on 2017/9/7.
//  Copyright © 2017年 GZHYTechnology. All rights reserved.
//#import <Foundation/Foundation.h>@interface ISRDataHelper : NSObject// 解析命令词返回的结果
+ (NSString*)stringFromAsr:(NSString*)params;/**解析JSON数据****/
+ (NSString *)stringFromJson:(NSString*)params;///**解析语法识别返回的结果****/
+ (NSString *)stringFromABNFJson:(NSString*)params;@end
//
//  ISRDataHelper.m
//  HYAIRobotSDK
//
//  Created by HZhenF on 2017/9/7.
//  Copyright © 2017年 GZHYTechnology. All rights reserved.
//#import "ISRDataHelper.h"@implementation ISRDataHelper/**解析命令词返回的结果****/
+ (NSString*)stringFromAsr:(NSString*)params;
{NSMutableString * resultString = [[NSMutableString alloc]init];NSString *inputString = nil;NSArray *array = [params componentsSeparatedByString:@"\n"];for (int  index = 0; index < array.count; index++){NSRange range;NSString *line = [array objectAtIndex:index];NSRange idRange = [line rangeOfString:@"id="];NSRange nameRange = [line rangeOfString:@"name="];NSRange confidenceRange = [line rangeOfString:@"confidence="];NSRange grammarRange = [line rangeOfString:@" grammar="];NSRange inputRange = [line rangeOfString:@"input="];if (confidenceRange.length == 0 || grammarRange.length == 0 || inputRange.length == 0 ){continue;}//check nomatchif (idRange.length!=0) {NSUInteger idPosX = idRange.location + idRange.length;NSUInteger idLength = nameRange.location - idPosX;range = NSMakeRange(idPosX,idLength);NSString *idValue = [[line substringWithRange:range]stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet] ];if ([idValue isEqualToString:@"nomatch"]) {return @"";}}//Get Confidence ValueNSUInteger confidencePosX = confidenceRange.location + confidenceRange.length;NSUInteger confidenceLength = grammarRange.location - confidencePosX;range = NSMakeRange(confidencePosX,confidenceLength);NSString *score = [line substringWithRange:range];NSUInteger inputStringPosX = inputRange.location + inputRange.length;NSUInteger inputStringLength = line.length - inputStringPosX;range = NSMakeRange(inputStringPosX , inputStringLength);inputString = [line substringWithRange:range];[resultString appendFormat:@"%@ 置信度%@\n",inputString, score];}return resultString;}/**解析听写json格式的数据params例如:{"sn":1,"ls":true,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"w":"白日","sc":0}]},{"bg":0,"cw":[{"w":"依山","sc":0}]},{"bg":0,"cw":[{"w":"尽","sc":0}]},{"bg":0,"cw":[{"w":"黄河入海流","sc":0}]},{"bg":0,"cw":[{"w":"。","sc":0}]}]}****/
+ (NSString *)stringFromJson:(NSString*)params
{if (params == NULL) {return nil;}NSMutableString *tempStr = [[NSMutableString alloc] init];NSDictionary *resultDic  = [NSJSONSerialization JSONObjectWithData:    //返回的格式必须为utf8的,否则发生未知错误[params dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];if (resultDic!= nil) {NSArray *wordArray = [resultDic objectForKey:@"ws"];for (int i = 0; i < [wordArray count]; i++) {NSDictionary *wsDic = [wordArray objectAtIndex: i];NSArray *cwArray = [wsDic objectForKey:@"cw"];for (int j = 0; j < [cwArray count]; j++) {NSDictionary *wDic = [cwArray objectAtIndex:j];NSString *str = [wDic objectForKey:@"w"];[tempStr appendString: str];}}}return tempStr;
}/**解析语法识别返回的结果****/
+ (NSString *)stringFromABNFJson:(NSString*)params
{if (params == NULL) {return nil;}NSMutableString *tempStr = [[NSMutableString alloc] init];NSDictionary *resultDic  = [NSJSONSerialization JSONObjectWithData:[params dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil];NSArray *wordArray = [resultDic objectForKey:@"ws"];for (int i = 0; i < [wordArray count]; i++) {NSDictionary *wsDic = [wordArray objectAtIndex: i];NSArray *cwArray = [wsDic objectForKey:@"cw"];for (int j = 0; j < [cwArray count]; j++) {NSDictionary *wDic = [cwArray objectAtIndex:j];NSString *str = [wDic objectForKey:@"w"];NSString *score = [wDic objectForKey:@"sc"];[tempStr appendString: str];[tempStr appendFormat:@" 置信度:%@",score];[tempStr appendString: @"\n"];}}return tempStr;
}@end

小吐槽

在这里,我要狠狠地吐槽一番讯飞语音开放平台,产品功能怎么样我不说,单单是开发文档的说明我就很想骂人了。以前的开发文档还会有详细的说明,现在SDK也更新了,对应的接口也少了,连Demo也很简单了。但是!能不能别告诉我,我要设置其他的东西,好歹也说明现在不对外开放了。还有,现在下载版的docsets文档,我知道你们的本意是方便iOS开发者导入Document目录下,直接方便开发者查看文档,呵呵,我还不如看以前你们给的文档,要啥有啥。早知如此,我还不如直接去用百度的。本来是想抱着尝试的态度,对你们更新的SDK摸索研究一下,现在,我彻底失望了。虽然是完成了任务,成功使用了语音听写功能,老实说,我太失望了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/65809.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS 10:用 Speech 框架创建語音輸入 App

原文&#xff1a;http://www.appcoda.com.tw/siri-speech-framework/ 在 2016 WWDC 大會上&#xff0c;蘋果推出了可以用於語音識別的 Speech Kit 框架。實際上&#xff0c;Siri 就是用 Speech Kit 框架來進行語音識別的。其實現在已經有一些語音識別框架了&#xff0c;但它們…

android 讯飞语音评测,非同凡响的语音输入法——讯飞Android输入法评测

Android平台上的输入法实在是多得数不过来了&#xff0c;除了谷歌官方的输入法&#xff0c;还有老牌的搜狗等输入法以及后来的百度输入法等同样也在移动平台上大放异彩&#xff0c;可以说&#xff0c;如果再有人去开发输入法&#xff0c;如果不做出点差异化&#xff0c;那么几乎…

ios手机输入字母重复问题

今天写项目遇到一个奇葩问题&#xff0c;测试告诉我说&#xff0c;ios输入字母都是双份的&#xff0c;安卓没有这个问题。 刚开始我是这样写的&#xff0c;使用的oninput原生事件&#xff0c;身份证号只允许输入数字和字母&#xff0c;可是测试测完就说ios输入字母总是双份的&a…

苹果11微信表格服务器地址怎么填,苹果实用技巧:iPhone11手机微信打字怎么换行...

我们购买了苹果产品之后&#xff0c;我们未必就一定全部都了解苹果产品当中的一些功能如何去使用&#xff0c;那么这个时候如果我们不知道使用这些功能&#xff0c;那么产品的价值也就大打折扣了&#xff0c;所以我们务必是要了解到这些功能的使用&#xff0c;那么今天小编就给…

iphone之使用讯飞语音sdk实现语音识别功能

1、首先下载讯飞sdk及文档&#xff1a;http://open.voicecloud.cn/ 2、学习里面的demo简单实现了一个小的语音识别功能 先做一个简单demo&#xff0c;看看识别效果。注&#xff1a;语音识别必须联网。 所有接口必需在联网状态下才能正常使用。 效果图: #import <UIKit/UIK…

使用nodeJS中的WebSocket实现简单的聊天功能

思路整理 webSocket是服务器向客户端发送信息的一种手段 这里是 更多关于 webSocket 的内容 如果想要了解更多关于 nodeJS 中的webSocket内容&#xff0c;点击这里 开始之前&#xff0c;我们需要新建两个客户端和一个服务端&#xff0c; 服务端负责保存与客户端的连接并且在双…

node.js连接mysql出现错误

node.js连接mysql出现错误&#xff1a; ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client 目前是因为版本较高&#xff0c;最新的加密方式node还不支持 解决办法&#xff1a; 1、登录m…

GeneGPT:用领域工具增强大型语言模型,以改善对生物医学信息的访问

文章目录 一、论文关键信息二、主要内容1. Motivations2. 解决方案关键3. 实验和结果 三、总结与讨论 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、论文关键信息 论文标题&#xff1a;GeneGPT: Augmenting Large Language Models with Domain …

怎么禁止计算机共享磁盘,访问限制,分享如何禁止别人访问你电脑的本地磁盘...

随着科技的快速发展&#xff0c;现在的小学生都用上手机了&#xff0c;更是有不少小孩子都会在电脑上玩游戏了&#xff0c;小学生玩LOL可是不少见。在小孩子玩电脑时&#xff0c;除了害怕他沉迷游戏&#xff0c;无心向学&#xff0c;还有就是担心熊孩子乱删电脑文件。如果误删了…

hosts配置 kentrl 网络禁止 访问

hosts禁止联网的工具 127.0.0.1 activate.navicat.com 127.0.0.1 syntevo.com www.syntevo.com #smartgit 127.0.0.1 release.gitkraken.com api.gitkraken.com GitKraken – 超好用的 Git 可视化工具 - 免费版本 “version”: “6.5.1”, “url_deb”: “https://release.axo…

QQ/微信里被禁止访问的网页怎么处理 被屏蔽的域名如何正常访问

最近越来越多的网站被微信的检测系统封杀&#xff0c;有的是确实违规&#xff0c;有的则是被误报了。出现这样的问题&#xff0c;网站的流量瞬间就清零了&#xff0c;对站长来说是天塌一样的打击&#xff0c;那我们有没有办法能够有效的防止域名被微信封杀呢&#xff1f; 一、先…

禁止访问某文件

1.web.config文件配置&#xff1a; 在Web.config文件 <system.web> <httpHandlers>添加一个节点 <system.web><httpHandlers><!--禁止访问IPData目录下的文本文件--><add path"IPData/*.txt" verb"*" type"System.…

用户登录 默认 计算机 用户文件,guest登录系统默认禁止guest访问本地计算机(组图)...

Win10共享文件夹&#xff0c;创建(启用)用户和共享文件&#xff0c;修改特定用户访问权限 内容 一、以访客身份登录 默认情况下&#xff0c;系统禁止访客访问本地计算机。如果允许访客用户访问&#xff0c;则需要进行以下设置&#xff1a; 1.打开访客账户。 图1.1 打开Guest用户…

禁止外部网络访问公司内网

PC0所在网段模拟公司内网&#xff0c;Server0模拟外部网络。 要求内网可以访问外部网络&#xff0c;但是外网不能连接内网 Router1 配置如下&#xff1a; interface FastEthernet0/0 ip address 192.168.10.254 255.255.255.0 duplex auto speed auto ! interface Serial2/0…

微信内链接已禁止访问是什么情况?微信链接防封细节

有时候我们在微信上浏览一些网址的时候会出现这样的情况,比如提示已停止访问该网页,其实提示这个也是为了广大用户的安全着想,毕竟有很多不法网址存在的,但是也由于错杀等原因导致打不开,点击链接提示已禁止访问几种原因是什么呢?那么碰到这种情况我们应该怎么做呢? 一…

为什么公司内部服务禁止访问外网?

文章目录 什么是访问外网&#xff1f;访问外网的风险什么业务场景需要申请外连公网&#xff1f; 上图网络访问分为两个方向&#xff1a; Internet&#xff08;外网&#xff09;访问公司网络 www.taobao.com&#xff1a;请求经路由转发后会到公司负载均衡服务器上&#xff0c;负…

手动禁止访问某些网页,告别摸鱼

手动禁止访问某些网页 开端解题思路逆向思维实现效果总结 开端 有一个不自觉地朋友&#xff0c;告诉我有了新电脑后很烦恼&#xff1a;速度快了&#xff0c;访问网页也快了&#xff0c;管不住自己的手……总在该专心学习工作的时候忍不住刷微博&#xff0c;或者追剧停不下来。…

GoogleChrome禁止访问端口解决

由于系统的版本迭代&#xff0c;从weblogic10.3.6升级到最新的weblogic14.1.1.0&#xff0c;在本地环境搭建创建weblogic域的时候&#xff0c;由于个人风采定义了一个端口为6666的端口&#xff0c;在一起部署完成&#xff0c;通过Google Chrome浏览器访问访问不到&#xff0c;提…

chatgpt赋能python:Python如何利用GPU加速

Python如何利用GPU加速 在大数据时代&#xff0c;数据处理和分析的速度越来越成为企业和个人必备的能力。然而&#xff0c;随着数据集的不断增大&#xff0c;计算机处理速度的瓶颈逐渐暴露出来。为此&#xff0c;GPU加速成为了解决这一问题的有效途径。 什么是GPU加速 GPU即…

国产Gpt究竟该如何使用?

说实话&#xff0c;当初ChatGPT横空出世我是不相信它可以进行专业知识的解答的&#xff0c;毕竟只是人为写出来的一个程序而已&#xff0c;但是当使用了一段时间以后&#xff0c;发现人工智能真的不是说说而已。发展到现在gpt3.5已经很可怕了&#xff0c;4.0又出了~~ 由于一些不…