ios开发-语音识别(科大讯飞)

2023-05-16

在记录事件的时候,用户在不方便手写的时候,我们可以利用语音录入,转成文字的形式记录时间,是不是既方便又只能,现在做语音识别的有一些不错的开放平台供我们使用,科大讯飞平台,百度语音平台。科大讯飞的优势在于大段大段的文字识别上,准确率较高。这篇博客也主要讲的是是讯飞语音SDK的使用。下面我们详细看一下科大讯飞。

1.科大讯飞开放平台

http://www.xfyun.cn
2.科大讯飞iOS-API开放平台

第一步:申请账号ID
创建新应用(获得后续的appid以及开通服务)
登录到讯飞开放平台上,在用户菜单栏里创建应用,这里的登录也可以采用第三方方式,在创建应用的界面填写相关的信息即可,然后就会有一个SDK的下载链接,,如果没有直接去SDK选项下载即可。

第二步:导入讯飞SDK框架

下载下来SDK解压后有三个文件夹:doc文件夹:不用多说肯定是开发文档;重要的是接下来的那两个文件夹:一个是lib文件夹:存放科大讯飞SDK类库,这就是我们要导入的SDK;一个是sample的科大讯飞demo演示工程。

下面我们创建一个工程,将lib文件夹下的”iflyMSC.framework”拷贝到工程目录,然后在工程中添加依赖库,如下图所示:
这里写图片描述

第三步:开始进行语音识别

语音识别分两种,分别用在不同场合,一个是界面提示的语音识别,一个是无界面提示的语音识别,这里以有界面提示的语音识别为例先进性讲解。

3.1导入头文件

#import "iflyMSC/IFlyMSC.h"

这里写图片描述

#import "IFlyContact.h"
#import "IFlyDataUploader.h"
#import "IFlyDebugLog.h"
#import "IFlyISVDelegate.h"
#import "IFlyISVRecognizer.h"
#import "IFlyRecognizerView.h"
#import "IFlyRecognizerViewDelegate.h"
#import "IFlyResourceUtil.h"
#import "IFlySetting.h"
#import "IFlySpeechConstant.h"
#import "IFlySpeechError.h"
#import "IFlySpeechEvaluator.h"
#import "IFlySpeechEvaluatorDelegate.h"
#import "IFlySpeechEvent.h"
#import "IFlySpeechRecognizer.h"
#import "IFlySpeechRecognizerDelegate.h"
#import "IFlySpeechSynthesizer.h"
#import "IFlySpeechSynthesizerDelegate.h"
#import "IFlySpeechUnderstander.h"
#import "IFlySpeechUtility.h"
#import "IFlyTextUnderstander.h"
#import "IFlyUserWords.h"
#import "IFlyPcmRecorder.h"
#import "IFlySpeechEvaluator.h"
#import "IFlySpeechEvaluatorDelegate.h"

#import "IFlyVoiceWakeuper.h"
#import "IFlyVoiceWakeuperDelegate.h"

3.2登录讯飞服务器

在使用讯飞的语音解析之前,需要进行用户身份验证,即登录讯飞服务器,即讯飞服务器需要根据你当前用户的APPID才能同意你登录。代码如下:

//登陆语音平台
    NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"57e08eb8"];
    [IFlySpeechUtility createUtility:initString];

3.3创建有界面提示语音识别对象

//  Speech-JiKe
//
//  Created by rimi on 16/9/22.
//  Copyright © 2016年 LucioSui. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "iflyMSC/iflyMSC.h"
@class IFlySpeechRecognizer;

@interface ViewController : UIViewController<IFlySpeechRecognizerDelegate,IFlyRecognizerViewDelegate>

@property (nonatomic, strong) NSString *filePath;//音频文件路径

@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;//不带界面的识别对象

@property (nonatomic, strong) IFlyRecognizerView *iflyRecognizerView;//带界面的识别对象

@property (nonatomic, strong) NSString * result;

@property (nonatomic, assign) BOOL isCanceled;

@end

3.4初始化带界面的识别对象

// 设置识别参数
-(void)initRecognizer
{
    NSLog(@"%s",__func__);

    if ([IATConfig sharedInstance].haveView == NO) {//无界面

        //单例模式,无UI的实例
        if (_iFlySpeechRecognizer == nil) {
            _iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];

            [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];

            //设置听写模式
            [_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
        }
        _iFlySpeechRecognizer.delegate = self;

        if (_iFlySpeechRecognizer != nil) {
            IATConfig *instance = [IATConfig sharedInstance];

            //设置最长录音时间
            [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
            //设置后端点
            [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];
            //设置前端点
            [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];
            //网络等待时间
            [_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];

            //设置采样率,推荐使用16K
            [_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];

            if ([instance.language isEqualToString:[IATConfig chinese]]) {
                //设置语言
                [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
                //设置方言
                [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];
            }else if ([instance.language isEqualToString:[IATConfig english]]) {
                [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
            }
            //设置是否返回标点符号
            [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];

        }
    }else  {//有界面

        //单例模式,UI的实例
        if (_iflyRecognizerView == nil) {
            //UI显示剧中
            _iflyRecognizerView= [[IFlyRecognizerView alloc] initWithCenter:self.view.center];

            [_iflyRecognizerView setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];

            //设置听写模式
            [_iflyRecognizerView setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];

        }
        _iflyRecognizerView.delegate = self;

        if (_iflyRecognizerView != nil) {
            IATConfig *instance = [IATConfig sharedInstance];
            //设置最长录音时间
            [_iflyRecognizerView setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
            //设置后端点
            [_iflyRecognizerView setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];
            //设置前端点
            [_iflyRecognizerView setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];
            //网络等待时间
            [_iflyRecognizerView setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];

            //设置采样率,推荐使用16K
            [_iflyRecognizerView setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
            if ([instance.language isEqualToString:[IATConfig chinese]]) {
                //设置语言
                [_iflyRecognizerView setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
                //设置方言
                [_iflyRecognizerView setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];
            }else if ([instance.language isEqualToString:[IATConfig english]]) {
                //设置语言
                [_iflyRecognizerView setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
            }
            //设置是否返回标点符号
            [_iflyRecognizerView setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];

        }
    }
}

3.5实现代理方法

#pragma mark 错误的回调函数
- (void) onError:(IFlySpeechError *) error
{
    NSLog(@"%s",__func__);

    if ([IATConfig sharedInstance].haveView == NO ) {
        NSString *text ;

        if (self.isCanceled) {
            text = @"识别取消";

        } else if (error.errorCode == 0 ) {
            if (_result.length == 0) {
                text = @"无识别结果";
            }else {
                text = @"识别成功";
            }
        }else {
            text = [NSString stringWithFormat:@"发生错误:%d %@", error.errorCode,error.errorDesc];
            NSLog(@"%@",text);
        }

    }else {

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


//无界面,听写结果回调
// results:听写结果
// isLast:表示最后一次

- (void)onResults:(NSArray *) results isLast:(BOOL)isLast
{

    _volumLabel.alpha = 0.0;

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

    if (isLast){
        NSLog(@"听写结果(json):%@测试", self.result);
    }
    NSLog(@"_result=%@",_result);

}

// 有界面,听写结果回调
// resultArray:听写结果
// isLast:表示最后一次

- (void)onResult:(NSArray *)resultArray isLast:(BOOL)isLast
{
    _volumLabel.alpha = 0.0;

    NSMutableString *result = [[NSMutableString alloc] init];
    NSDictionary *dic = [resultArray objectAtIndex:0];

    for (NSString *key in dic) {
        [result appendFormat:@"%@",key];
    }
    _textLabel.text = [NSString stringWithFormat:@"%@",result];
}

3.6开始识别语音

音频文件保存地址

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cachePath = [paths objectAtIndex:0];
    _filePath = [[NSString alloc] initWithFormat:@"%@",[cachePath stringByAppendingPathComponent:@"asr.pcm"]];

只提取了一部分代码,持续更新,后期上DEMO。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ios开发-语音识别(科大讯飞) 的相关文章

  • Ubuntu上CUDNN下载及安装过程详细介绍

    前言 显卡驱动以及CUDA安装好后 xff08 https blog csdn net avideointerfaces article details 100558457 xff09 xff0c 就可以根据cuda的版本以及平台类型 xf
  • 苹果开发者账号续费不成功?提示你的支付授权失败?看这里...

    苹果开发者账号续费失败 xff0c 提示 xff1a 你的支付授权失败 请核对你的信息并重试 或尝试其他支付方式 请联系你的银行了 公司开发者账号即将到期 xff0c 一年一度续费的重任又落到我肩膀上了 xff0c 那么我们就进入正题吧 一
  • WPF 开发 —— 几何图形(PathGeometry)

    参考资料 xff1a WPF 2D绘图 3 PathGeometry WPF 2D绘图 2 Geometry WPF 2D绘图 1 Shape WPF Geometry Transformation Tool
  • C++ 求三个数的乘积

    编程实现输入任意三个整数a b c xff0c 将这三个数的乘积输出 xff1b Input 三个整数 xff0c 每个数字空格隔开 分别表示a b c三个变量的值 xff08 1 lt a lt 100 1 lt b lt 1000 1
  • 中文Cookie导致Session丢失的问题

    在网络上 xff0c 已经有无数的文章讨论Session丢失问题 xff0c 其中的原因有非常多的种类 xff0c 在此不再赘述 下面我们描述一种特殊的Session丢失现象 xff1a 1 在绝大多数客户端上 xff0c Session都
  • Access.Image Decoder

    版本 xff1a V0 41 系统要求 xff1a Access 2000及以上版本 软件介绍 xff1a Access中的Image控件将所有图形数据保存在PictureData属性数组中 xff0c 通过修改PictureData xf
  • 直接粘贴剪贴版的位图数据到Image控件

    调用范例 xff1a Private Sub Command1 Click PasteToImage Me Image0 End Sub 模块段代码 xff1a Option Compare Database Option Explicit
  • Access.Image BMP图像高速切割函数

    本函数可以在你自己的程序中调用 xff0c 从已有BMP中切割任意一个矩形块 使用本函数 xff0c 即使你对BMP格式一窍不通 xff0c 也可以在自己的程序中自由地切割BMP xff08 比方说拼图游戏程序 xff09 附件包含 xff
  • 优化Microsoft Access提高速度

    压缩 压缩 要保证经常性的压缩你的程序代码 当你在开发和使用Microsoft Access数据库时 xff0c 你要经常性地增加和删除数据 代码等等 现在的问题是Microsoft Access并不能有效地释放已分配的但被删除的对象空间
  • LINUX Shell 下求两个文件交集和差集的办法

    假设两个文件FILE1和FILE2用集合A和B表示 xff0c FILE1内容如下 xff1a a b c e d a FILE2内容如下 xff1a c d a c 基本上有两个方法 xff0c 一个是comm命令 xff0c 一个是gr
  • 安装ensp 图文详解(超详细)

    文章目录 ensp的详细安装步骤 xff1a 分享安装包 xff08 在下载ensp之前需要安装好该三个应用 xff09 Virtualbox下载地址 xff1a https www virtualbox org wireshark下载 h
  • Microsoft Access秘密、技巧和陷阱

    摘要 这篇文章概括了当使用Microsoft Access 时 xff0c 通过使用Access Basic可以增加应用程序的执行速度 xff0c 减少编码量 xff0c 同时也减少在为Microsoft Windows应用程序接口编程时
  • 浅析Windows编程的剪贴板机制

    摘要 xff1a 本文对Windows剪贴板机制作了深入 全面的阐述 xff0c 具体内容包括 xff1a 文本 位图 DSP 自定义格式剪贴板的使用和多数据项和延迟提交技术 关键词 xff1a VC 43 43 6 0 xff1b 剪贴板
  • Matthew Curland的VB函数指针调用

    Matthew Curland简介 xff1a Visual Studio开发小组成员 xff0c 参与开发了VB的IntelliSense和Object Browser 他是VB资深专家 xff0c 对VB有非常深入的研究 xff0c 堪
  • Access中神秘的Criteria(上)

    看到这个标题 xff0c 很多读者可能会迷惑 xff0c 什么是Criteria xff1f 我用了这么久Access xff0c 怎么从来没听说国 我猜想很多读者都是怀着好奇的心情点击的这个主题 但是也许你不知道 xff0c Access
  • Access多条件格式研究笔记(上)

    之前见过论坛好几个帖子讨论过超过三个的条件格式 xff0c 当时因为没有用过条件格式 xff08 通常遇到类似需求我就直接用VBA写代码了 xff09 xff0c 所以也无法加入讨论 xff0c 但是开始留意条件这个这个功能 适逢周末有点空
  • Access 窗体控件事件集线器(EventsHub)V 1.1

    模块名称 xff1a EventsHub 模块版本 xff1a V 1 1 模块介绍 xff1a 很多时候我们在窗体中会有很多类似的控件 xff08 比方说40多个TextBox xff09 xff0c 对于这些类似的控件我们需要编制类似的
  • 窗体类中慎用Option Explicit

    今天遇到一个怪病 xff0c 困扰了我几个小时 xff0c 我有一段程序读取窗体上的切换按钮状态 xff0c 在一个新文件中运行得很好 xff0c 但是同样一个按钮 xff0c 同样代码 xff0c 贴到另外一个窗体 xff0c 却怎么也无
  • 窗体控件绑定数据库字段后的Value类型

    下面三张图展示了各种数据类型的字段绑定到窗体控件后的控件值类型 需要注意的是 xff0c 窗体类中是否使用Option Explicit xff0c 对于空值类型影响很大 xff0c 具体请看本人的另一篇文章 窗体类中慎用Option Ex
  • Dim 的陷阱

    代码一 xff1a Dim x 100 y 100 As Byte Call ReadBytes x Public Sub ReadBytes ByRef z As Byte 39 Do Nothing End Sub 对以上代码进行编译

随机推荐

  • 谨慎使用单精度/双精度数值类型

    前言 在近日几个帖子里面 xff0c 和QQ群的讨论里面 xff0c 我发现很多网友都遇到的问题都是因为不恰当地使用了单精度 双精度数值 因此想专门就这个话题谈一下 单精度和双精度数值类型最早出现在C语言中 xff08 比较通用的语言里面
  • Java的内存结构(Memory Structure)和垃圾收集(Garbage Collection)图解

    JVM 内存包含如下几个部分 xff1a Heap Memory 存放Java对象 Non Heap Memory 存放类加载信息和其它meta dataOther 存放JVM 自身代码等 在JVM启动时 xff0c 就已经保留了固定的内存
  • MD5加密的VB类模块源码

    在窗体中调用时如下 set c1 61 new class 39 class 为你存的类模快名 text1 text 61 md5 string calc sourcestring 类模块源码如下 Option Explicit 39 Vi
  • 四种整数数据类型的性能对比

    在我们写VBA程序的时候 xff0c 我们经常要面对数据类型定义的选择 xff0c 有的情况下 xff0c 业务本身对于数据类型有要求和限制 xff0c 那么我们并不难以选择 xff0c 有些时候却没有限制 xff0c 我们可以任意选用四种
  • VBA/VB获取硬盘序列号

    Private Declare Function GetVolumeInformation Lib 34 kernel32 dll 34 Alias 34 GetVolumeInformationA 34 ByVal lpRootPathN
  • .NET 4 on Windows7 / Mono 2.10.8.1 on Ubuntu 12.04 差异记录

    环境A xff1a NET 4 on Windows 7 环境B xff1a Mono 2 10 8 1 on Ubuntu 12 04 1 Socket Receive byte 当远程连接被断开时 xff1a A xff1a 立即返回0
  • 计算机视觉学习知识框架体系总结整理

    计算机视觉的三个基本任务 xff1a 1 xff09 对象检测 object detection 2 xff09 对象跟踪 object tracking 3 xff09 对象分割 object segmentation 一 xff1a F
  • VS Code 配置Java环境问题解决方式

    1 问题 1 1 改变插件的储存位置 1 2 Java环境变量配置 1 3 VS Code Java 工作区建立 1 4 code runner 运行输出为乱码 2 解决方法 2 1 储存位置更改 xff08 1 xff09 改变vs桌面快
  • YOLOv4-pytorch训练自己的数据集

    YOLOv4 pytorch训练自己的数据集 YOLOv4 pytorch介绍环境配置运行环境安装依赖包 准备工作Git clone YOLOv4准备数据集下载PascalVOC MSCOCO 2017数据集准备自己的数据集 下载权重文件
  • 【DEBUG日记】cannot import name ‘amp‘

    问题描述 xff1a 在使用WongKinYiu PyTorch YOLOv4进行训练时 xff0c 报错 xff1a Traceback span class token punctuation span most recent call
  • 【DUBUG日记】subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1.

    项目场景 xff1a 这是在编译FCOS 主要是其中基于maskrcnn benchmark部分 时报的错误 问题描述 xff1a 在执行 python setup py build develop no deps 时 xff0c 会Run
  • YOLOv5部署到Windows的C++(使用LibTorch)

    YOLOv5部署到Windows的C 43 43 xff08 使用LibTorch xff09 前言准备内容配置环境编译YOLOv5 检测可能遇到的问题 前言 由于项目需要 xff0c 我们要将YOLOv5部署到Windows上的C 43
  • 如何在Java中选择Map/List/Set

    很实用 xff0c 分享一下 简单版本 复杂版本 参考 xff1a http initbinder com articles cheat sheet for selecting maplistset in java html http ww
  • 一文搞定 Visual Studio 配置 OpenCV环境

    文章目录 前言准备工作系统环境变量配置VS项目环境配置检验补充 前言 在 Visual Studio 上配置 OpenCV 环境是极其恼人的事情 xff0c 尤其是对于初学者 xff0c 经常几个小时过去了都配不好 xff0c 将我们对代码
  • PyTorch 轻松节省显存的小技巧

    文章目录 前言一 大幅减少显存占用方法1 模型2 数据 二 小幅减少显存占用方法1 使用inplace2 加载 存储等能用CPU就绝不用GPU3 低精度计算4 torch no grad5 及时清理不用的变量6 分段计算 总结 前言 如今的
  • 【OpenCV经验总结】——视频篇

    文章目录 前言一 视频读写二 视频参数的获取和设置 前言 本篇汇总了本人在OpenCV使用过程中总结的关于视频处理的一些函数使用经验及Bug处理经验 xff0c 会根据后续使用情况逐步更新 一 视频读写 span class token k
  • 【OpenCV经验总结】——图片预处理篇

    文章目录 前言一 图片读写二 调整大小和填充三 滤波四 边缘提取五 腐蚀和膨胀 xff0c 开闭运算 前言 本篇汇总了本人在OpenCV使用过程中总结的关于图片的一些函数使用经验及Bug处理经验 xff0c 会根据后续使用情况逐步更新 一
  • 【DEBUG日记】torch.unique() 报错

    问题描述 在模型输出数据的后处理中 xff0c 在使用torch unique 时报以下错误 xff1a RuntimeError isDifferentiableType variable scalar type INTERNAL ASS
  • 如何在go中执行python3代码

    go python3使用指南与踩坑记录 简介 在开发工作中有时候会有需要和其他语言进行交互的需求 xff0c 笔者前段时间就接到了需要在go中调用python3的需求 xff0c 这种需求笔者想到了两种解法 xff0c 一是直接在代码中调用
  • ios开发-语音识别(科大讯飞)

    在记录事件的时候 xff0c 用户在不方便手写的时候 xff0c 我们可以利用语音录入 xff0c 转成文字的形式记录时间 xff0c 是不是既方便又只能 xff0c 现在做语音识别的有一些不错的开放平台供我们使用 xff0c 科大讯飞平台