为textView添加语音输入功能的实例代码(集成讯飞语音识别)

下面是详细讲解“为textView添加语音输入功能的实例代码(集成讯飞语音识别)”的完整攻略。

步骤一:添加讯飞语音识别SDK

首先,你需要先下载并添加讯飞语音识别SDK到你的工程中。你可以进入讯飞官网,注册一个账号,然后下载需要的SDK。添加SDK的方式有两种:

1.使用CocoaPods

在你的工程目录下添加Podfile文件,内容如下:

platform :ios,'10.0'
#注意:因为本例引入了AFNetworking,需要在podfile文件里额外添加关于AFNetworking的声明
inhibit_all_warnings!
target 'Your Target' do
pod 'MSCoreTextView'
pod 'IFlyMSC'

end

你需要将Your Target替换成你的工程target的名称。然后,在终端中执行以下命令:

pod install

2.手动添加SDK

将你下载的SDK文件夹拖入你的工程中。如果使用手动添加SDK,你需要在你的工程属性下的Build Settings里找到Header Search Paths选项,在其值中添加SDK的头文件目录,例如:${PROJECT_DIR}/YourSDKFolder/headers/

步骤二:添加头文件

在需要使用语音输入功能的文件中添加以下头文件:

#import <IFlyMSC/IFlyMSC.h>
#import <IFlySpeechRecognizerDelegate.h>
#import <IFlySpeechRecognizer.h>
#import <IFlySpeechConstant.h>

步骤三:初始化语音识别对象

在你需要使用语音识别功能的时候,你需要初始化一个IFlySpeechRecognizer对象,如下所示:

IFlySpeechRecognizer *_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];
_iFlySpeechRecognizer.delegate = self;
[_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
[_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
//设置是否返回标点符号,默认为NO
[_iFlySpeechRecognizer setParameter:@"0" forKey:[IFlySpeechConstant ASR_PTT]];

注意:IFlySpeechRecognizerDelegate是语音识别回调的代理对象。

步骤四:在textView中添加语音输入功能

在textView中添加语音输入功能的实现,有多种方式可以选择,这里提供一种常用的方式:

//textView初始化之后,设置它的inputView为语音识别的输入视图
- (void)viewDidLoad {
    [super viewDidLoad];
    self.textView.inputView = [self addVoiceInputView];
}

//添加语音识别输入视图
-(UIView *)addVoiceInputView{
    UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreen_WIDTH, 40)];
    view.backgroundColor = [UIColor lightGrayColor];

    UIButton *voiceButton = [[UIButton alloc]initWithFrame:CGRectMake(10, 5, 30, 30)];
    [voiceButton setImage:[UIImage imageNamed:@"voice"] forState:UIControlStateNormal];
    [voiceButton addTarget:self action:@selector(tapVoiceButton:) forControlEvents:UIControlEventTouchUpInside];
    [view addSubview:voiceButton];

    return view;
}

//点击语音输入按钮
-(void)tapVoiceButton:(id)sender {
    [self.textView resignFirstResponder];
    [_iFlySpeechRecognizer startListening];
}

在上述代码中,我们将textView的inputView设置为一个UIView,然后在这个UIView中添加了一个语音输入按钮。当点击语音输入按钮时,我们调用startListening方法开始语音识别。

步骤五:实现IFlySpeechRecognizerDelegate回调方法

当语音识别开始或结束时,IFlySpeechRecognizerDelegate协议的代理方法会被调用。你可以在这些方法中实现语音识别的逻辑。以下代码是一个简单的实现,用于将识别结果显示在textView 中:

#pragma mark - IFlySpeechRecognizerDelegate
//结果返回代理
- (void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast {
    NSMutableString *result = [[NSMutableString alloc]init];
    NSDictionary *dic = resultArray[0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    NSString * resultFromJson =  [self stringFromJson:result];
    resultFromJson = [resultFromJson stringByReplacingOccurrencesOfString:@"。" withString:@""];
//    NSLog(@"%@",resultFromJson);
    self.textView.text = [NSString stringWithFormat:@"%@%@",self.textView.text,resultFromJson];
}

//识别结束回调
-(void)onError:(IFlySpeechError *)errorCode{
    NSLog(@"%s",__func__);
}

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

//开始录音回调
- (void)onBeginOfSpeech{
    NSLog(@"开始录音");
}

#pragma mark - json解析
- (NSString *)stringFromJson:(NSString *)params
{
    NSData  * data = [params dataUsingEncoding:NSUTF8StringEncoding];
    NSError * error;
    NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
    if(error) {
        NSLog(@"json解析失败:%@",error);
        return nil;
    }
    NSLog(@"%@",dic);
    return [dic objectForKey:@"content"];
}

在上述代码中,我们实现了IFlySpeechRecognizerDelegate协议的代理方法,对结果进行处理,并用NSJSONSerialization将结果转化成NSString类型。

示例一:将语音输入结果保存到本地

我们可以将语音结果保存到本地,使得用户在下次编辑时可以方便地进行编辑。

#pragma mark - IFlySpeechRecognizerDelegate
//结果返回代理
- (void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast {
    NSMutableString *result = [[NSMutableString alloc]init];
    NSDictionary *dic = resultArray[0];
    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    NSString * resultFromJson =  [self stringFromJson:result];
    resultFromJson = [resultFromJson stringByReplacingOccurrencesOfString:@"。" withString:@""];
    NSLog(@"%@",resultFromJson);

    //将语音识别结果保存到本地
    NSString *documentDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *path = [documentDirectory stringByAppendingPathComponent:@"voiceResult.txt"];
    NSString *resultString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    if (!resultString) {
        resultString = @"";
    }
    NSString *newResultString = [NSString stringWithFormat:@"%@\n%@",resultString,resultFromJson];
    [newResultString writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

    self.textView.text = [NSString stringWithFormat:@"%@%@",self.textView.text,resultFromJson];
}

示例二:语音输入和键盘输入进行切换

我们可以添加一个切换按钮,在语音输入和键盘输入之间进行切换。

//添加语音识别输入视图
-(UIView *)addVoiceInputView{
    self.voiceInputView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreen_WIDTH, 40)];
    self.voiceInputView.backgroundColor = [UIColor lightGrayColor];

    UIButton *voiceButton = [[UIButton alloc]initWithFrame:CGRectMake(10, 5, 30, 30)];
    [voiceButton setImage:[UIImage imageNamed:@"voice"] forState:UIControlStateNormal];
    [voiceButton addTarget:self action:@selector(tapVoiceButton:) forControlEvents:UIControlEventTouchUpInside];
    [self.voiceInputView addSubview:voiceButton];

    UIButton *keyboardButton = [[UIButton alloc]initWithFrame:CGRectMake(kScreen_WIDTH - 40, 5, 30, 30)];
    [keyboardButton setImage:[UIImage imageNamed:@"keyboard"] forState:UIControlStateNormal];
    [keyboardButton addTarget:self action:@selector(tapKeyboardButton:) forControlEvents:UIControlEventTouchUpInside];
    [self.voiceInputView addSubview:keyboardButton];

    return self.voiceInputView;
}

//点击语音输入按钮
-(void)tapVoiceButton:(id)sender {
    [self.textView resignFirstResponder];
    _isVoiceInput = YES;
    [_iFlySpeechRecognizer startListening];
}

//点击键盘输入按钮
-(void)tapKeyboardButton:(id)sender {
    [self.textView becomeFirstResponder];
    _isVoiceInput = NO;
}

#pragma mark - UITextFieldDelegate

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    if (_isVoiceInput) {
        return NO;
    }
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

在上述代码中,我们在语音输入视图中添加了一个切换按钮keyboardButton。当语音输入结束时,我们将_isVoiceInput变量设置为YES,然后在UITextFieldDelegate代理方法中返回NO,禁用键盘输入;当点击切换按钮时,调用tapKeyboardButton方法切换到键盘输入,这时候再将_isVoiceInput变量值设为NO,以启用键盘输入。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:为textView添加语音输入功能的实例代码(集成讯飞语音识别) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 1.5java的高并发编程

    1.5 Java的高并发编程 在当今互联网时代,高并发已经成为了很多应用程序的标配,而Java作为广泛采用的编程语言之一,也必须要学会如何进行高并发编程,以满足现代应用对于性能和响应速度的要求。 下面我们来探讨Java的高并发编程技术: 1. 多线程编程 多线程编程是实现高并发的一种基本方式。Java提供了多种方式来实现多线程编程,例如继承Thread类、实…

    其他 2023年3月28日
    00
  • IETester 网站在多IE版本兼容性测试工具使用方法

    IETester 网站在多IE版本兼容性测试工具使用方法攻略 简介 IETester 是一款用于测试网站在多个 Internet Explorer(IE)版本上的兼容性的工具。它允许用户在同一界面中同时运行多个 IE 版本,以便快速检查网站在不同版本的 IE 上的表现。 步骤 步骤 1:下载和安装 IETester 打开浏览器,访问 IETester 的官方…

    other 2023年7月27日
    00
  • 浅谈PHP变量作用域以及地址引用问题

    浅谈PHP变量作用域以及地址引用问题 1. 变量作用域 在PHP中,变量的作用域决定了变量在程序中的可见性和访问范围。PHP中有四种变量作用域:全局作用域、局部作用域、静态作用域和超全局作用域。 1.1 全局作用域 全局作用域中定义的变量可以在整个程序中访问。在函数内部可以使用global关键字来引用全局变量。 示例代码: $globalVar = 10; …

    other 2023年7月29日
    00
  • androidstudio更新升级方法

    以下是“Android Studio更新升级方法”的完整攻略: Android Studio更新升级方法 Android Studio是一款用于开发Android应用程序的集成开发环境。为了保持最新的功能和复程序,您需要定期更新Android Studio。本攻略将介绍如何更新Android Studio。 步骤1:检查更新 在Android Studio中…

    other 2023年5月7日
    00
  • Android贝塞尔曲线初步学习第二课 仿QQ未读消息气泡拖拽黏连效果

    Android贝塞尔曲线初步学习第二课 仿QQ未读消息气泡拖拽黏连效果攻略 简介 本攻略将详细讲解如何实现仿QQ未读消息气泡拖拽黏连效果,使用Android贝塞尔曲线进行绘制。在这个效果中,用户可以通过拖拽气泡来改变其形状,并且气泡与手指之间会有黏连效果。 步骤 步骤一:创建项目和布局 首先,创建一个新的Android项目,并在布局文件中添加一个初始的气泡视…

    other 2023年8月24日
    00
  • iOS 15/iPadOS 15 开发者预览版 Beta3 正式发布(附更新内容)

    iOS 15/iPadOS 15 开发者预览版 Beta3 正式发布(附更新内容) 最新消息:苹果公司于6月23日正式推送了 iOS 15/iPadOS 15 开发者预览版 Beta3,开发者可以在苹果开发者网站下载该版本进行测试。 更新内容 iOS 15/iPadOS 15 开发者预览版 Beta3 主要包含以下更新内容: 1. 新增功能 人像模式下拍摄照…

    other 2023年6月26日
    00
  • vue页面传参方法

    以下是关于Vue页面传参方法的完整攻略,包括基本知识和两个示例。 基本知识 在Vue中,页面传参可以通过路由参数、props属性、Vuex状态等方式实现。其中,路由参数和属性是最常用的两种方式。路由参数通过URL传递参数,而props属性是通过组件属性传递参数。在Vue中实现传参需要以下步骤: 使用路由参数传递参数 使用props属性传递参数 示例说明 以下…

    other 2023年5月7日
    00
  • Java tomcat中的类加载器和安全机制你了解吗

    Java Tomcat中的类加载器和安全机制 Tomcat是一个流行的Java Web服务器,它使用类加载器和安全机制来管理和保护应用程序的运行环境。下面是关于Tomcat中类加载器和安全机制的详细讲解: 类加载器 Tomcat使用了一种层次化的类加载器结构,以支持在同一个服务器上运行多个独立的Web应用程序。以下是Tomcat中常见的类加载器: Boots…

    other 2023年10月17日
    00
合作推广
合作推广
分享本页
返回顶部