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

相关文章

  • java获取本周一及周日的日期

    以下是关于“Java获取本周一及周日的日期”的完整攻略,过程中包含两个示例。 背景 在Java中,我们经常需要获取日期和时间。有时候,我们需要本周的日期,例如本周一和本周日的日期。本攻略将介绍如何使用Java获取本一和本周日的日期。 基本原理 在Java中,我们可以使用Calendar类来获取日期和时间。我们可以使用Calendar类的get()方法来获取当…

    other 2023年5月9日
    00
  • 手机不能开机怎么办?手机突然无法开机6种解决方法介绍

    手机不能开机怎么办?手机突然无法开机6种解决方法介绍 问题描述 手机突然不能开机,屏幕无任何反应,该怎么办? 解决方法 方法一:充电检查 先检查手机是否有电,可以将手机插上充电器,观察是否有充电指示灯亮起,如有,则说明电池充电正常,也许手机是出现系统故障或其它问题。反之则说明手机电量耗尽,需要等待充电后再开机。 方法二:强制重启 有时候手机出现死机或卡顿等问…

    other 2023年6月27日
    00
  • Win2008下载 中文版、英文版官方下载地址

    Win2008下载攻略 1. 中文版官方下载地址 要下载Windows Server 2008的中文版,您可以按照以下步骤进行操作: 打开您的网络浏览器,访问微软官方网站。 在微软官方网站的搜索栏中输入\”Windows Server 2008 中文版下载\”。 在搜索结果中,找到微软官方提供的下载页面。 点击下载页面上的链接,以开始下载中文版的Window…

    other 2023年8月4日
    00
  • Android获取应用程序名称(ApplicationName)示例

    下面我将为你详细讲解“Android获取应用程序名称(ApplicationName)示例”的完整攻略。 什么是应用程序名称? 在 Android 系统中,应用程序就像一个个小箱子,可以在其中存放各种代码逻辑、图片和数据等,每个应用程序都有自己的名称,比如“微信”、“淘宝”、“QQ”等。 获取应用程序名称的方法 方法一:通过 PackageManager 获…

    other 2023年6月25日
    00
  • Android 欢迎全屏图片详解及实例代码

    Android 欢迎全屏图片详解及实例代码攻略 在Android应用中,欢迎页面通常会展示一个全屏的图片,以吸引用户的注意并提供良好的用户体验。本攻略将详细讲解如何实现这样的欢迎页面,并提供两个示例说明。 步骤一:准备图片资源 首先,我们需要准备一张高质量的图片作为欢迎页面的背景。确保图片的分辨率适配不同的设备,并将其放置在项目的资源文件夹中。 步骤二:创建…

    other 2023年8月26日
    00
  • java-如何使用catalina.jar

    Java – 如何使用catalina.jar 在Java中,catalina.jar是Tomcat服务器的核心库文件,包含了Tomcat服务器的核心功能。本文将介绍如何使用catalina.jar库文件,包括下载、导入、和示例说明。 下载catalina.jar 要使用catalina.jar库文件,首先需要它。可以从Tomcat官网下载最新版本catal…

    other 2023年5月8日
    00
  • java递归设置层级菜单的实现

    Java递归设置层级菜单的实现,可以通过以下几个步骤来完成: 设计数据模型 首先需要设计数据模型,以便存储菜单的信息。这里我们可以使用一个Menu类来表示菜单,它包含以下几个属性: id:菜单的唯一标识符。 name:菜单名称。 parentId:菜单的父节点标识符,如果为0表示该菜单是顶级菜单。 children:菜单的子节点列表,如果没有子节点则为nul…

    other 2023年6月27日
    00
  • 深入聊聊MySQL中各种对象的大小长度限制

    MySQL中各种对象的大小长度限制 MySQL中的各种对象都有其自身的大小和长度限制,了解这些限制可以帮助开发人员更好地规划数据库结构和存储数据。本文将深入探讨MySQL中常见对象的大小长度限制。 字符串类型 字符串类型是MySQL中最常用的数据类型之一,以下是各个字符串类型的大小限制: CHAR: 最长可达255个字节,为定长类型,所以占用空间为固定长度。…

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