为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日

相关文章

  • Win7系统的快捷键大全 Win7键盘快捷键汇总

    《Win7系统的快捷键大全 Win7键盘快捷键汇总》是一篇介绍Windows 7系统快捷键的文章,下面是它的完整攻略: 引言 在 Windows 7系统 中,快捷键是提高操作效率的一种最简单又最有效的方式。如果您掌握了 Windows 7系统 的常用快捷键,不仅可以让您的工作更加高效,还可以改善您的操作体验。本篇文章将为您介绍 Windows 7系统 的常用…

    other 2023年6月27日
    00
  • 基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息

    基于MVC+EasyUI的Web开发框架使用C-Lodop打印控件打印页面或套打报关运单信息 1. 简介 C-Lodop是一款免费的打印控件,可以实现Web页面的高级打印功能和套打功能。在MVC+EasyUI的Web开发框架中使用C-Lodop可以实现打印发票、报告、运单和标签等功能,是Web开发常用的技术之一。 2. 安装C-Lodop 首先需要到官网(h…

    other 2023年6月27日
    00
  • 通过实例解析Java类初始化和实例初始化

    通过实例解析Java类初始化和实例初始化的攻略 在Java中,类初始化和实例初始化是非常重要的概念。本篇攻略将通过具体的示例来讲解它们的作用和区别。 什么是类初始化 类初始化是当一个类被加载到内存中时所进行的一系列操作,主要包括两个方面:类本身的初始化操作和对类中静态成员变量的初始化。 类本身的初始化操作通常指对类的静态成员变量的赋值操作,以及静态代码块的执…

    other 2023年6月20日
    00
  • vue学习笔记之作用域插槽实例分析

    Vue学习笔记之作用域插槽实例分析 什么是作用域插槽? 作用域插槽是Vue.js中一种强大的特性,它允许我们在父组件中定义模板,并将子组件的内容插入到模板中的特定位置。通过作用域插槽,我们可以在父组件中访问子组件的数据,并在模板中进行处理。 示例1:基本用法 下面是一个简单的示例,展示了作用域插槽的基本用法: <template> <div…

    other 2023年8月19日
    00
  • php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例

    PHP使用mysqli和pdo扩展,测试对比MySQL数据库的执行效率完整示例攻略 1. 准备工作 在开始测试之前,确保您已经安装了PHP、MySQL数据库,并且已经启用了mysqli和pdo扩展。 2. 创建测试数据库和表 首先,创建一个名为testdb的数据库,并在其中创建一个名为users的表,用于测试。 CREATE DATABASE testdb;…

    other 2023年10月18日
    00
  • 麒麟操作系统怎么样

    麒麟操作系统是中国华为公司开发的一种基于Linux的操作系统,提供了一系列的软件应用和服务平台,适用于桌面、服务器和云计算等领域。麒麟操作系统具有良好的稳定性、安全性和易用性,并且支持多语言和多国家地区配置。下面将详细讲解麒麟操作系统的特点和使用攻略。 麒麟操作系统的特点 稳定性强:麒麟操作系统的内核基于Linux,使用了华为自主开发的技术和算法,弥补了Li…

    其他 2023年4月16日
    00
  • 详解Vue中过度动画效果应用

    详解Vue中过渡动画效果应用 介绍 Vue提供了使用过渡动画效果的能力,通过在组件的状态变化过程中添加 CSS 过渡/动画类名来实现。本文将详细讲解Vue中过渡动画效果的应用方法。 步骤 步骤一:定义过渡效果类名 首先,我们需要在CSS中定义过渡效果的类名。我们可以使用Vue提供的四个类名来控制不同的过渡阶段,分别是:- v-enter:进入之前的样式,在元…

    other 2023年6月28日
    00
  • 什么是物联网?

    物联网(IoT)是指互连的物理设备、车辆、家庭用品、工具等等通过互联网实现相互通信、数据传输、智能化操作的系统。为了实现物联网的完整攻略,我们需要遵循以下步骤: 1. 设计物联网架构 首先,我们需要设计一套物联网架构,包括硬件和软件方面的设计。此步骤的目标是建立一个可拓展、稳定和高效的系统。 硬件层面,我们需要考虑使用哪些设备,如何连接它们,以及如何收集和处…

    其他 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部