热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

iOS之简单语音听写功能

我用到的语音听写功能主要是集成讯飞的sdk完成功能,现在主要写一下步骤,以防自己以后会忘记主要的步骤就是:在讯飞开发者网站注册一个账号——创建iOS应用——获取一个appID——下载SDK,http:

我用到的语音听写功能主要是集成讯飞的sdk完成功能,现在主要写一下步骤,以防自己以后会忘记

主要的步骤就是:在讯飞开发者网站注册一个账号——创建iOS应用——获取一个appID——下载SDK,http://www.xfyun.cn/doccenter/iOS demo:http://download.csdn.net/detail/tuwanli125/9470364 根据开发文档的描写添加辅助库  demo的下载地址:https://github.com/tuwanli/VoiceIdentify

注:添加 iflyMSC.framework 时,请注意工程 BuildSetting中的framwork path的设置,如果出现找不到framework的情况,可以将path清空,在 xcode 中删除 framework,然后重新添加。
如果使用了离线识别,还需要增加 libc++.dylib。 

如果你出现找不到头文件的错误那大概就是因为sdk的路径出现了问题

看主要代码: ViewController.h
//
// ViewController.h
// VoiceIdentify
//
// Created by 涂婉丽 on 16/1/22.
// Copyright © 2016年 涂婉丽. All rights reserved.
//

#import
#import "iflyMSC/iflyMSC.h"
@class IFlyDataUploader;
@class IFlySpeechRecognizer;
@interface ViewController : UIViewController
@property (nonatomic, strong) NSString *pcmFilePath;//音频文件路径
@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;//不带界面的识别对象
@property (nonatomic, strong) IFlyRecognizerView *iflyRecognizerView;//带界面的识别对象
@property (nonatomic, strong) IFlyDataUploader *uploader;//数据上传对象
- (IBAction)resignizeAction;
@property (unsafe_unretained, nonatomic) IBOutlet UITextView *textView;
@property (nonatomic, strong) NSString * result;
@end

ViewController.m

//  ViewController.m
// VoiceIdentify
//
// Created by 涂婉丽 on 16/1/22.
// Copyright © 2016年 涂婉丽. All rights reserved.
//

#import "ViewController.h"
#import
#import "ISRDataHelper.h"
#define APPID_VALUE @"56a1b495"
#define TIMEOUT_VALUE @"20000"

#import "iflyMSC/IFlyMSC.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

self.uploader = [[IFlyDataUploader alloc] init];

//demo录音文件保存路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
_pcmFilePath = [[NSString alloc] initWithFormat:@"%@",[cachePath stringByAppendingPathComponent:@"asr.pcm"]];
_textView.clipsToBounds = YES;
_textView.layer.cornerRadius = 5;
_textView.layer.borderColor=[UIColor lightGrayColor].CGColor;
_textView.layer.borderWidth = 0.5;
}
- (void)viewWillAppear:(BOOL)animated
{

[super viewWillAppear:animated];
[self initRecognizer ];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (IBAction)resignizeAction {
// if(_iflyRecognizerView == nil)
// {
// [self initRecognizer ];
// }

[_textView setText:@""];
[_textView resignFirstResponder];

//设置音频来源为麦克风
[_iflyRecognizerView setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_source"];

//设置听写结果格式为json
[_iflyRecognizerView setParameter:@"plain" forKey:[IFlySpeechConstant RESULT_TYPE]];

//保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下
[_iflyRecognizerView setParameter:@"asr.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];

[_iflyRecognizerView start];
}
- (void)initRecognizer
{
NSLog(@"%s",__func__);

_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]];

_iflyRecognizerView.delegate = self;



//设置最长录音时间
[_iflyRecognizerView setParameter:@"30000" forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
//设置后端点
[_iflyRecognizerView setParameter:@"3000" forKey:[IFlySpeechConstant VAD_EOS]];
//设置前端点
[_iflyRecognizerView setParameter:@"3000" forKey:[IFlySpeechConstant VAD_BOS]];
//网络等待时间
[_iflyRecognizerView setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];

//设置采样率,推荐使用16K
[_iflyRecognizerView setParameter:@"16000" forKey:[IFlySpeechConstant SAMPLE_RATE]];
//设置语言
[_iflyRecognizerView setParameter:@"zh_cn" forKey:[IFlySpeechConstant LANGUAGE]];
//设置是否返回标点符号
[_iflyRecognizerView setParameter:@"1" forKey:[IFlySpeechConstant ASR_PTT]];

}
/**
无界面,听写结果回调
results:听写结果
isLast:表示最后一次
****/
- (void) onResults:(NSArray *) results isLast:(BOOL)isLast
{

NSMutableString *resultString = [[NSMutableString alloc] init];
NSDictionary *dic = results[0];
for (NSString *key in dic) {
[resultString appendFormat:@"%@",key];
}
_result =[NSString stringWithFormat:@"%@%@", _textView.text,resultString];
NSString * resultFromJson = [ISRDataHelper stringFromJson:resultString];
_textView.text = [NSString stringWithFormat:@"%@%@", _textView.text,resultFromJson];

if (isLast){
NSLog(@"听写结果(json):%@测试", self.result);
}
NSLog(@"_result=%@",_result);
NSLog(@"resultFromJson=%@",resultFromJson);
NSLog(@"isLast=%d,_textView.text=%@",isLast,_textView.text);
}
/**
有界面,听写结果回调
resultArray:听写结果
isLast:表示最后一次
****/
- (void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast
{
NSLog(@"---------------%@",resultArray);
NSLog(@"bbbbbbbbbbbbb%d",isLast);
NSMutableString *result = [[NSMutableString alloc] init];
NSDictionary *dic = [resultArray objectAtIndex:0];
NSLog(@"==============%@",dic);
for (NSString *key in dic) {
[result appendFormat:@"%@",key];
}
_textView.text = [NSString stringWithFormat:@"%@%@",_textView.text,result];
}
/**
开始识别回调
****/
- (void) onBeginOfSpeech
{
NSLog(@"onBeginOfSpeech");
}

/**
停止录音回调
****/
- (void) onEndOfSpeech
{
NSLog(@"onEndOfSpeech");

}
/**
听写结束回调(注:无论听写是否正确都会回调)
error.errorCode =
0 听写正确
other 听写出错
****/
- (void) onError:(IFlySpeechError *) error
{
NSLog(@"%s",__func__);

NSLog(@"errorCode:%d",[error errorCode]);

}
@end


ISRDataHelper.h

#import 

@interface ISRDataHelper : NSObject


// 解析命令词返回的结果
+ (NSString*)stringFromAsr:(NSString*)params;

/**
解析JSON数据
****/
+ (NSString *)stringFromJson:(NSString*)params;//


/**
解析语法识别返回的结果
****/
+ (NSString *)stringFromABNFJson:(NSString*)params;

@end

ISRDataHelper.m

#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 {
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 nomatch
if (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 Value
NSUInteger 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


好想睡觉-----------睡觉



推荐阅读
  • 本文介绍了 Vue 开发的入门指南,重点讲解了开发环境的配置与项目的基本搭建。推荐使用 WebStorm 作为 IDE,其下载地址为 。安装时请选择适合您操作系统的版本,并通过 获取激活码。WebStorm 是前端开发者的理想选择,提供了丰富的功能和强大的代码编辑能力。 ... [详细]
  • iOS 设备唯一标识获取的高效解决方案与实践
    在iOS 7中,苹果公司再次禁止了对MAC地址的访问,使得开发者无法直接获取设备的物理地址。为了在开发过程中实现设备的唯一标识,苹果推荐使用Keychain服务来存储和管理唯一的标识符。此外,还可以结合其他技术手段,如UUID和广告标识符(IDFA),以确保设备的唯一性和安全性。这些方法不仅能够满足应用的需求,还能保护用户的隐私。 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 如何在任意浏览器中轻松安装并使用VSCode——Codeserver简易指南
    code-server 是一款强大的工具,允许用户在任何服务器上部署 VSCode,并通过浏览器进行访问和使用。这一解决方案不仅简化了开发环境的搭建过程,还提供了高度灵活的工作方式。用户只需访问 GitHub 上的官方仓库(GitHub-coder/code-server),即可获取详细的安装和配置指南,快速启动并运行 code-server。无论是个人开发者还是团队协作,code-server 都能提供高效、便捷的代码编辑体验。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • 深入解析HTTP网络请求API:从基础到进阶的全面指南
    本文全面解析了HTTP网络请求API,从基础到进阶,详细介绍了Android平台上的两种原生API——HttpUrlConnection和HttpClient。这两种API通过对底层Socket的封装,提供了高效、灵活的网络通信功能。文章不仅涵盖了基本的使用方法,还深入探讨了性能优化、错误处理和安全性等方面的高级主题,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 微信平台通过盛派SDK(sdk.weixin.senparc.com)允许服务号和订阅号使用appId和token读取关注用户的个人信息。然而,这一过程需严格遵守隐私保护和数据安全的相关规定,确保用户数据的安全性和隐私性。 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • 提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南
    提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
author-avatar
warcraft04
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有