精华内容
下载资源
问答
  • 科大讯飞语音识别与深度学习
    千次阅读
    2022-03-31 11:03:24

    神经网络作为机器学习领域70%左右的用户都在选择的算法,展现出了强大的准确率。

    在这里插入图片描述

    常见的神经网络主要分为dnn,cnn,rnn三种,深度神经网络,卷积神经网络,循环神经网络。Dnn是基础,几乎哪个网络都有它的影子,卷积和循环是方法,各擅长不同领域。

    在这里插入图片描述

      Dnn,每一个神经把上一层所有的神经输出当作输入,乘以权重加上偏差再带入函数之后得到自己的输出。此外为提高模型效率,我们可以采用L2正则,归一化,drop out,动量梯度等算法。
    

    在这里插入图片描述

    Cnn,常见卷积层和池化层,卷积层使用正方形矩阵作为权重对上一层输出每个正方形切片进行加权加偏差加激活函数,形成下一层输出。权重矩阵数等于输出通道数。

    池化层常见平均和取最大值两种,对相邻几个元素进行求平均或取最大值来减小维数

    Rnn,前一个数据在dnn隐藏层的输出值和下一个数据共同作为输入值输入神经网络进行运算,所以每一次输出不仅和自身属性有关,也和之前元素有关,所以称之为序列模型,擅长nlp领域。

    传统的神经网络比如dnn和cnn适用于处理单一数据,比如一张图片或者某个球员的能力值。但是当研究的内容涉及到一组数据时,比如一句话的识别,如果还用之前那些模型的话一是会有输入长度不等的麻烦,二是大量重复的运算会增加内存和计算复杂度,所以并不擅长。所以这个时候序列模型出现了。
    
    
    
    在传统的dnn基础上,rnn的输入值除了此阶段数据之外还有上一时间段的数据信息。如果是两层网络的话,上一时段隐藏层输出和本阶段数据合并在一起成为模型的输入,乘以权重矩阵加上偏差再激活。
    
    
    
    这种模型的产生让深度学习开始步入自然语言处理领域,但和人类比,它还是有缺陷的,一是因为人会跳跃阅读,而是因为人有记忆和遗忘的能力。
    
    
    
    针对一,出现了brnn,双向传播循环神经网络。原理是输入句子,每一个单词识别一遍之后,隐藏层的输出再从后往前输入回来,重新运算,再输出。这样就可以很好的解决如判断Teddy bear中的Teddy是人命还是别的含义的情况。
    

    在这里插入图片描述

    针对二,出现了LSTM算法,长短记忆模型。它每次运算的输入值不仅是上一个词的信息和本阶段词语,还有一个储存的信息。此储存的信息的更新于否取决于遗忘门和更新门,两个门的值取决于各自权重矩阵,偏差和模型输入值。之后输出门的值乘以记忆细胞的数据sigmoid激活得到输出值。
    

    在这里插入图片描述


    输出值的个数是所有可能的数量,每个值对应的是这种可能的概率,所用的激活函数通常是softmax,这样就可以把各种可能的差距加大,之后再评概率随机采样,就可以得到识别结果。


    sigmoid是各个门常用的激活函数。

    现在的语音识别通常采用混合模型,比如kalid的gmm-hmm模型,常用的dnn-hmm,cnn-hmm,rnn-hmm模型,还有百度的deep speech模型。
    
    
    
    deep speech是cnn加上lstm,首先从原始的wav文件中提取出一段一段时间的测量值,比如采样率是44100的wav的一秒就可以提取出长度为44100的声学特征向量。这样一秒一秒叠加起来就是输入序列。
    
    
    
    之后将数据通过cnn卷积成初步数据,再输入lstm进行转路。
    


    双向LSTM对一个个序列进行识别输出一个个句子。


    卷积可以减少运算难度,长短记忆可以让前后文有关联,所以百度的语音识别达到了98.6%。

    如今,如果我们向自己进行语音识别的话,有很多选择,可以直接调用大公司语音识别模型的api,或是自己训练模型。当然也有很多已经训练好的模型,可以在各大网站下载。当然也可以自己设计模型,之后去下载训练集或是干脆自己录音自己听力。
    

    在这里插入图片描述
    在这里插入图片描述


    在这里插入图片描述

    在这里插入图片描述



    调用科大讯飞语音识别web api的python方式。

    更多相关内容
  • Unity中接入科大讯飞SDK的示例,包含语音识别与语音合成功能
  • 科大讯飞语音识别-最新接口(流式) C#语言的demo实现,非常完整,只需要改成自己申请的appid、apiKey、apiSecret就可以正常使用,绝对可运行。
  • 科大讯飞官方Demo中提取的语音识别部分代码加以修改,可实现在线与离线的语音识别,下载后需要填写自己的APPID以及修改成与ID相匹配的讯飞SDK,实测可运行。
  • unity接科大讯飞语音识别Windows平台(添加了录音功能) 文章链接:https://blog.csdn.net/hyy_sui_yuan/article/details/83307827
  • 科大讯飞语音识别demo

    2018-04-14 14:43:54
    基于科大讯飞平台android-sdk的语音识别demo。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • 具体请参考https://blog.csdn.net/weixin_41195786/article/details/80093356
  • 调用科大讯飞SDK包,语音识别java版本代码示例。示例包括语音听写、语音识别、语音组合三个功能,本人只用到语音听写(即把语音转成文字)
  • 科大讯飞语音识别

    2018-12-19 11:00:38
    科大讯飞android集成 功能识别语音转成文字并用语音播放,输入文本语音播报
  • 科大讯飞语音识别官网接口文档, 语音识别api ,
  • 科大讯飞语音转文字,文字转语音,集成类型为无界面类型
  • 科大讯飞语音识别自己写的demo,已经过自测没有问题; 1.使用前建议下载看科大讯飞的接口文档 http://doc.xfyun.cn/msc_java/299249; MSC Develop Manual for Java.pdf 2.必须添加语音识别的jar包
  • 基于科大讯飞语音识别demo(离线)

    热门讨论 2016-06-15 11:34:32
    基于科大讯飞语音识别的demo(离线版的)。源码是从官demo提取出来的,简单明了,项目可以直接运行。依赖讯飞语音的apk和离线语音包(demo中可直接下载)
  • 离线语音识别,树莓派语音识别科大讯飞语音识别离线包。
  • 到目前为止科大讯飞的javasdk不支持客户端和服务端分开的情况,也就是说,语音合成是在服务端的话筒的播放,语音识别需要服务端的麦克风录音,so,javasdk对于javaweb没有任何卵用。 下面是javase版本的dome的介绍:...

    o55g08d9dv.jpg广告关闭

    腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元!

    到目前为止科大讯飞的javasdk不支持客户端和服务端分开的情况,也就是说,语音合成是在服务端的话筒的播放,语音识别需要服务端的麦克风录音,so,javasdk对于javaweb没有任何卵用。 下面是javase版本的dome的介绍:** * created by mshu on 2017627. * 语音识别 * public class listening { private static final ...

    0jh4m0udj3.jpeg

    目前最好的语音识别系统采用双向长短时记忆网络(lstm,longshort term memory),但是,这一系统存在训练复杂度高、解码时延高的问题,尤其在工业界的实时识别系统中很难应用。 科大讯飞在今年提出了一种全新的语音识别框架——深度全序列卷积神经网络(dfcnn,deep fully convolutional neuralnetwork),更适合...

    、你需要android手机应用开发基础2、科大讯飞语音识别sdkandroid版3、科大讯飞语音识别开发api文档4、android手机关于科大讯飞sdk及api文档,请到科大语音官网下载:http:open.voicecloud.cn当然sdk和api有多个版本可选,按照你的需要下载,其次,下载需要填写资料申请注册,申请通过或可获得appid二、语音识别流程 1...

    前言最近刚换了三星的note9,深度体验了一下bixby的语音功能,觉得挺不错的,而且上周的人工智能大会上,分布屏幕两边的分别是科大讯飞和腾讯提供的服务:讯飞听见和腾讯同传。 两者的表现也都是让人眼前一亮。 我在自己的e码通中已经集成的讯飞语音识别《集成科大讯飞语音识别查找货品信息》,里面用的是讯飞语音...

    63kfpvpp96.jpeg

    其次,语音交互相对于文字交互,能够解放人们更多的感官; 第三,通过语音对app、浏览器进行操作和交互,将会开辟一个新入口、变革更多的产业。 对于广告而言,语音交互广告拥有着超越传统广告形式的巨大潜力。 众所周知科大讯飞的智能语音技术处于全球领先的水平,以讯飞输入法为例,今年语音识别的准确率提高到了98...

    a8stg2gdgb.bmp

    最近在做一个文本转语音tts(text to speech)的第三方软件封装,使用的是国内语音技术龙头安徽科大讯飞公司提供的离线引擎aisound5.0,主要用于汽车导航用途。 科大讯飞还提供了aitalk用于语音识别,aiwrite用于手写识别服务等。 另外还有针对6种平台的sdk和开发示例。 其中aisound5.0只提供tts接口(即将文本字符串...

    k2j078yy43.png

    新智元原创 编辑:白峰、鹏飞【新智元导读】刚刚,科大讯飞联合中科大又夺得权威赛事——国际多通道语音分离和识别大赛chime-6两个任务的冠军,并将语音识别错误率从46.1%降低到了30.5%,在「最嘈杂」的语音识别任务中取得三连冠。 三连冠! 科大讯飞又双叒夺「史上最嘈杂」语音识别任务chime-6冠军 5月4日,有着最难...

    目前,科大讯飞向华为提供的技术解决方案包括:科大讯飞智能语音呼叫导航解决方案在呼叫中心自动语音服务系统(ivr)基础上,应用科大讯飞语音识别技术,构建“自助语音服务系统”,帮助呼叫中心实现ivr的“菜单扁平化”,将智能语音技术应用于用户与ivr的全程交互中,提供智能化的语音交互界面。 科大讯飞voice...

    依托阿里云公司建设城市大脑国家新一代人工智能开放创新平台,依托腾讯公司建设医疗影像国家新一代人工智能开放创新平台,依托科大讯飞公司建设智能语音国家新一代人工智能开放创新平台。 从中选方向上,也不难看出各大厂在人工智能领域的发力方向:bat各自中选自动驾驶、智慧城市、医疗影像识别,科大讯飞中选语义...

    btisaguzu1.jpeg

    csdn(id:csdnnews)随着目前用户需求的精细化和智能化,很多时候我们需要在app内集成语音输入模块,为用户提供语音输入的功能。 而科大讯飞语音作为行业内翘楚,识别结果相对准确,且讯飞自带一套识别动画,适合快速搭建模块,废话不多说,先看下效果图。? 下面开始具体步骤? 申请key百度搜索讯飞开放平台,注册账号...

    ag5udz82ed.jpeg

    智能家居方面,科大讯飞以超脑魔盒为入口,打造了一个通过语音便捷控制家居设备的智能环境。 超脑魔盒集合了科大讯飞语音识别、自然语言理解等核心技术,包含全网影音、智能家居、遥控器k歌、英语翻译学习、生活百科问询等五大功能,并且包括切换、快进等设置全程语音操控,0.2秒的语音搜索速度,老人小孩都能轻松...

    中国语音巨头科大讯飞2014年8月20日在北京召开规模宏大的发布会,展示语音技术最新成果、发布科大讯飞一揽子软硬件产品、启动讯飞超级大脑计划、宣布科大讯飞1亿元创业基金,并对表现突出的讯飞开发者进行了表彰,以鼓励更多开发者进入讯飞生态。 科大讯飞董事长刘庆峰在会上做了近两个小时的演讲,并进行了大量的...

    iqz0ezo4nw.jpeg

    【新智元导读】 以语音起家的科大讯飞 2017年在计算机视觉上发力,接连获得自动驾驶领域权威评测集 cityscapes第一名和医学影像权威评测luna冠军两项突破,在视觉上展示出强大实力。 近日,科大讯飞在国际自动驾驶领域权威评测集 cityscapes 获得平均81.4%的精度,取得了该项评测的第一名,并刷新了世界记录。 这也是...

    (图为网络爆出的科大讯飞“空壳”合资公司)回溯这个秋天,因ai成名、号称“人工智能第一股” 的科大讯飞,两桩“恨事”竟都是由ai而起。 刚刚过去的9月,科大讯飞就因知乎上同传翻译者bell wang发的一篇指责文成为了众矢之的。 该同传者称,科大讯飞的同传是“假”的,是利用机器语音识别了他和搭档口译的内容...

    vdx2161e7s.jpeg

    北京时间 2018 年 9 月 7 日,国际多通道语音分离和识别大赛(chime)组委会在微软海得拉巴研发中心揭晓了最新一届chime-5 的比赛结果。 在本届比赛中,科大讯飞与中国科学技术大学杜俊教授、西北工业大学陈景东教授、佐治亚理工大学李锦辉教授等国内外知名专家团队再度携手。 最终在单麦克风阵列任务、分布式麦克风...

    我们solution proposal的文档里打算用科大讯飞的service,但是他无法满足3和4这两个requirement。 我对可达讯飞的service做了简单的测试:其工作原理是通过...2)如voc文本质检可与语音文字进行匹配,自动判断是否合格; 3)新媒体文本可自动质检4)可识别异常录音(指定标准外); 5)诉求记录与语音内容是否可...

    nl0ho34lc1.jpeg

    我们solution proposal的文档里打算用科大讯飞的service,但是他无法满足3和4这两个requirement。 我对可达讯飞的service做了简单的测试:其工作原理是通过...2)如voc文本质检可与语音文字进行匹配,自动判断是否合格; 3)新媒体文本可自动质检4)可识别异常录音(指定标准外); 5)诉求记录与语音内容是否可...

    urq0aah0ym.jpeg

    这就是科大讯飞在618年中大促中交出的答卷,也是这家ai公司如何深挖价值红利的初步回答。 在6月1日至6月18日的618销售榜单出炉后,讯飞披露战绩如下:讯飞...讯飞当时就有介绍,这些变化直接让离线语音识别训练模型规模扩大5倍,中英文识别率超95%; 翻译模型容量增加105%,涵盖词库规模扩大1倍。 而这些技术能力...

    在移动互联网的风口,兼具软件和互联网公司特征的讯飞,站在了2b和2c市场的十字路口,前途看上去机会重重但又充满凶险。 近期,受科大讯飞邀请,笔者与一些媒体人前往合肥,对讯飞的技术、处境,以及讯飞怎么看待语音市场的竞争态势与格局,做了采访与了解。 一、移动语音市场要爆发了! 是真的吗? 今年是中国语音...

    下面是科大讯飞语音识别的运行截图: ? 下面是科大讯飞语音识别的代码例子: import java.util.hashmap; import java.util.linkedhashmap; import org.json.jsonexception; import org.json.jsonobject; import android.app.activity; import android.content.intent; import android.content.sharedpreferences...

    展开全文
  • 科大讯飞语音识别SDK,用于树莓派3代,使用环境:RaspberryPi3,Linux c, Ubuntu16.04。
  • 科大讯飞语音识别实例1
  • 一个Android开发集成科大讯飞语音识别+语音合成功能的小Demo
  • 本demo测试时运行的环境为:Windows + Python3.7 ...语音听写流式 WebAPI 接口调用示例 接口文档(必看):https://doc.xfyun.cn/rest_api/语音听写(流式版).html webapi 听写服务参考帖子(必看):http://bb
  • 语音识别与语音听写的源码,精心测试,绝对好用,开源代码。
  • C# 科大讯飞语音识别

    2018-03-12 17:16:48
    SpeechWindows.CS窗体 直接运行就好了
  • 科大讯飞语音引擎 jar包 demo,科大讯飞语音合成引擎3.0,支持4.0系统以上,文字转语音输出。demo是Android studio 的代码。注意1.0的引擎安装基本都会失败,本人亲测这个3.0的可以使用,据说是支持4.0以上的。安装完...
  • Android 科大讯飞语音识别(详细步骤+源码)

    万次阅读 多人点赞 2020-06-23 17:55:52
    语音识别在现在的APP中是常见的,但是通常小的项目中我们不会去费心思自己去做这一块的业务功能开发,常规的是接入第三方的SDK快速实现功能,比如百度、讯飞之类的,百度语音识别之前我已经写过了,本着雨露均沾的...

    前言

    语音识别在现在的APP中是常见的,但是通常小的项目中我们不会去费心思自己去做这一块的业务功能开发,常规的是接入第三方的SDK快速实现功能,比如百度、讯飞之类的,百度语音识别之前我已经写过了,本着雨露均沾的原则的,写这篇讯飞的SDK对接步骤,开始吧~
    效果图
    在这里插入图片描述
    点击
    在这里插入图片描述
    识别中,识别到之后
    在这里插入图片描述
    源码在文章最后面

    正文

    首先呢,你先去注册讯飞的开发者账号,点击讯飞开放平台前往注册,
    在这里插入图片描述
    注册好之后你可以选择实名认证或者不认证都可以,然后登录进入控制台或者我的应用
    在这里插入图片描述创建一个应用

    在这里插入图片描述
    填写信息然后提交
    在这里插入图片描述
    点击这个应用名称查看详细信息
    在这里插入图片描述
    右边的是对接过程需要用到的值,APPID用SDK中,APIKey或APISecret适用于WebAPI调用方式,这两者有什么区别呢?SDK的话很好理解,复制一些文件到你的项目中,然后添加依赖,你就可以使用讯飞的SDK中的语音识别功能了,而WebAPI调用顾名思义是通过网络接口携带参数的方式去实现的,需要自己去做网络请求,本文中目前使用SDK的方式进行对接实现功能,如果有想看WebAPI调用方式的请在评论区留言,

    OK,现在滑动到下面下载Android SDK
    在这里插入图片描述
    下载到本地,然后解压,打开文件目录如下:
    在这里插入图片描述
    然后就是创建你自己项目了,打开AS
    在这里插入图片描述

    ① 配置资源文件

    我取名是XFASRDemo,然后Finish,等待项目创建好之后,复制文件中libs里面的三个文件,到项目的libs中
    在这里插入图片描述
    在这里插入图片描述
    右键Mac.jar添加Add As Library
    在这里插入图片描述
    在这里插入图片描述
    点击OK添加,添加好之后你的jar包就会有一个三角箭头,可以展开,这个时候你就可以使用里面的方法了。
    在这里插入图片描述
    然后复制资源文件到main下面
    在这里插入图片描述

    ② 配置项目

    创建SpeechApplication.java
    在这里插入图片描述

    package com.llw.xfasrdemo;
    
    import android.app.Application;
    
    import com.iflytek.cloud.SpeechUtility;
    
    public class SpeechApplication extends Application {
    
        @Override
        public void onCreate() {
    
            //   5ef048e1  为在开放平台注册的APPID  注意没有空格,直接替换即可
            SpeechUtility.createUtility(SpeechApplication.this, "appid=5ef048e1");
    
            super.onCreate();
        }
    }
    
    

    打开AndroidManifest.xml,增加权限配置

    	<!--连接网络权限,用于执行云端语音能力 -->
        <uses-permission android:name="android.permission.INTERNET"/>
        <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
        <uses-permission android:name="android.permission.RECORD_AUDIO"/>
        <!--读取网络信息状态 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <!--获取当前wifi状态 -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    

    配置SpeechApplication和注册权限

    在这里插入图片描述
    然后修改app模块下面的build.gradle
    在这里插入图片描述

    	sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }
    
    implementation files('libs/Msc.jar')
    

    改完记得Sync一下

    然后修改布局activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="识别到的内容"
            android:textColor="#000" />
    
        <Button
            android:id="@+id/btn_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="开始识别" />
    </LinearLayout>
    

    接下来就是MainActivity了

    ③ 编码

    一、声明变量和初始化

    	private static final String TAG = "MainActivity";
    
        private SpeechRecognizer mIat;// 语音听写对象
        private RecognizerDialog mIatDialog;// 语音听写UI
    
        // 用HashMap存储听写结果
        private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    
        private SharedPreferences mSharedPreferences;//缓存
    
        private String mEngineType = SpeechConstant.TYPE_CLOUD;// 引擎类型
        private String language = "zh_cn";//识别语言
    
        private TextView tvResult;//识别结果
        private Button btnStart;//开始识别
        private String resultType = "json";//结果内容数据格式
    

    同时你要实现这个点击事件的监听

    在这里插入图片描述
    实现一个方法

    	@Override
        public void onClick(View v) {
    		//写入点击之后处理逻辑
    	}
    
    	@Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tvResult = findViewById(R.id.tv_result);
            btnStart = findViewById(R.id.btn_start);
            btnStart.setOnClickListener(this);//实现点击监听
        }
    

    二、动态权限请求

    	/**
         * android 6.0 以上需要动态申请权限
         */
        private void initPermission() {
            String permissions[] = {Manifest.permission.RECORD_AUDIO,
                    Manifest.permission.ACCESS_NETWORK_STATE,
                    Manifest.permission.INTERNET,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };
    
            ArrayList<String> toApplyList = new ArrayList<String>();
    
            for (String perm : permissions) {
                if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
                    toApplyList.add(perm);
                }
            }
            String tmpList[] = new String[toApplyList.size()];
            if (!toApplyList.isEmpty()) {
                ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
            }
    
        }
    
        /**
         * 权限申请回调,可以作进一步处理
         *
         * @param requestCode
         * @param permissions
         * @param grantResults
         */
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            // 此处为android 6.0以上动态授权的回调,用户自行实现。
        }
    

    在onCreate方法中调用

    initPermission();//权限请求
    

    三、语音监听

    	/**
         * 初始化监听器。
         */
        private InitListener mInitListener = new InitListener() {
    
            @Override
            public void onInit(int code) {
                Log.d(TAG, "SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    showMsg("初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");
                }
            }
        };
    
    
        /**
         * 听写UI监听器
         */
        private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
            public void onResult(RecognizerResult results, boolean isLast) {
    
                printResult(results);//结果数据解析
    
            }
    
            /**
             * 识别回调错误.
             */
            public void onError(SpeechError error) {
                showMsg(error.getPlainDescription(true));
            }
    
        };
        
    	/**
         * 提示消息
         * @param msg
         */
        private void showMsg(String msg) {
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    

    里面用到一个方法,用于解析监听到的结果

    四、数据解析

    	/**
         * 数据解析
         *
         * @param results
         */
        private void printResult(RecognizerResult results) {
            String text = JsonParser.parseIatResult(results.getResultString());
    
            String sn = null;
            // 读取json结果中的sn字段
            try {
                JSONObject resultJson = new JSONObject(results.getResultString());
                sn = resultJson.optString("sn");
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            mIatResults.put(sn, text);
    
            StringBuffer resultBuffer = new StringBuffer();
            for (String key : mIatResults.keySet()) {
                resultBuffer.append(mIatResults.get(key));
            }
    
            tvResult.setText(resultBuffer.toString());//听写结果显示
    
        }
    

    里面用到一个JsonParser的工具类,需要手动去创建一个
    在这里插入图片描述
    代码如下:

    package com.llw.xfasrdemo;
    
    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.json.JSONTokener;
    
    /**
     * Json结果解析类
     */
    public class JsonParser {
    
    	public static String parseIatResult(String json) {
    		StringBuffer ret = new StringBuffer();
    		try {
    			JSONTokener tokener = new JSONTokener(json);
    			JSONObject joResult = new JSONObject(tokener);
    
    			JSONArray words = joResult.getJSONArray("ws");
    			for (int i = 0; i < words.length(); i++) {
    				// 转写结果词,默认使用第一个结果
    				JSONArray items = words.getJSONObject(i).getJSONArray("cw");
    				JSONObject obj = items.getJSONObject(0);
    				ret.append(obj.getString("w"));
    //				如果需要多候选结果,解析数组其他字段
    //				for(int j = 0; j < items.length(); j++)
    //				{
    //					JSONObject obj = items.getJSONObject(j);
    //					ret.append(obj.getString("w"));
    //				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} 
    		return ret.toString();
    	}
    	
    	public static String parseGrammarResult(String json) {
    		StringBuffer ret = new StringBuffer();
    		try {
    			JSONTokener tokener = new JSONTokener(json);
    			JSONObject joResult = new JSONObject(tokener);
    
    			JSONArray words = joResult.getJSONArray("ws");
    			for (int i = 0; i < words.length(); i++) {
    				JSONArray items = words.getJSONObject(i).getJSONArray("cw");
    				for(int j = 0; j < items.length(); j++)
    				{
    					JSONObject obj = items.getJSONObject(j);
    					if(obj.getString("w").contains("nomatch"))
    					{
    						ret.append("没有匹配结果.");
    						return ret.toString();
    					}
    					ret.append("【结果】" + obj.getString("w"));
    					ret.append("【置信度】" + obj.getInt("sc"));
    					ret.append("\n");
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			ret.append("没有匹配结果.");
    		} 
    		return ret.toString();
    	}
    	
    	public static String parseLocalGrammarResult(String json) {
    		StringBuffer ret = new StringBuffer();
    		try {
    			JSONTokener tokener = new JSONTokener(json);
    			JSONObject joResult = new JSONObject(tokener);
    
    			JSONArray words = joResult.getJSONArray("ws");
    			for (int i = 0; i < words.length(); i++) {
    				JSONArray items = words.getJSONObject(i).getJSONArray("cw");
    				for(int j = 0; j < items.length(); j++)
    				{
    					JSONObject obj = items.getJSONObject(j);
    					if(obj.getString("w").contains("nomatch"))
    					{
    						ret.append("没有匹配结果.");
    						return ret.toString();
    					}
    					ret.append("【结果】" + obj.getString("w"));
    					ret.append("\n");
    				}
    			}
    			ret.append("【置信度】" + joResult.optInt("sc"));
    
    		} catch (Exception e) {
    			e.printStackTrace();
    			ret.append("没有匹配结果.");
    		} 
    		return ret.toString();
    	}
    
    	public static String parseTransResult(String json,String key) {
    		StringBuffer ret = new StringBuffer();
    		try {
    			JSONTokener tokener = new JSONTokener(json);
    			JSONObject joResult = new JSONObject(tokener);
    			String errorCode = joResult.optString("ret");
    			if(!errorCode.equals("0")) {
    				return joResult.optString("errmsg");
    			}
    			JSONObject transResult = joResult.optJSONObject("trans_result");
    			ret.append(transResult.optString(key));
    			/*JSONArray words = joResult.getJSONArray("results");
    			for (int i = 0; i < words.length(); i++) {
    				JSONObject obj = words.getJSONObject(i);
    				ret.append(obj.getString(key));
    			}*/
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return ret.toString();
    	}
    }
    
    

    五、参数配置

    	/**
         * 参数设置
         *
         * @return
         */
        public void setParam() {
            // 清空参数
            mIat.setParameter(SpeechConstant.PARAMS, null);
            // 设置听写引擎
            mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
            // 设置返回结果格式
            mIat.setParameter(SpeechConstant.RESULT_TYPE, resultType);
    
            if (language.equals("zh_cn")) {
                String lag = mSharedPreferences.getString("iat_language_preference",
                        "mandarin");
                Log.e(TAG, "language:" + language);// 设置语言
                mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
                // 设置语言区域
                mIat.setParameter(SpeechConstant.ACCENT, lag);
            } else {
    
                mIat.setParameter(SpeechConstant.LANGUAGE, language);
            }
            Log.e(TAG, "last language:" + mIat.getParameter(SpeechConstant.LANGUAGE));
    
            //此处用于设置dialog中不显示错误码信息
            //mIat.setParameter("view_tips_plain","false");
    
            // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            mIat.setParameter(SpeechConstant.VAD_BOS, mSharedPreferences.getString("iat_vadbos_preference", "4000"));
    
            // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            mIat.setParameter(SpeechConstant.VAD_EOS, mSharedPreferences.getString("iat_vadeos_preference", "1000"));
    
            // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", "1"));
    
            // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
            mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
            mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");
        }
    

    六、代码组装

    在onCreate中增加如下代码,进行初始化

    		// 使用SpeechRecognizer对象,可根据回调消息自定义界面;
            mIat = SpeechRecognizer.createRecognizer(MainActivity.this, mInitListener);
            // 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源
            mIatDialog = new RecognizerDialog(MainActivity.this, mInitListener);
            mSharedPreferences = getSharedPreferences("ASR",
                    Activity.MODE_PRIVATE);
    

    然后再onClick中

    	@Override
        public void onClick(View v) {
            if( null == mIat ){
                // 创建单例失败,与 21001 错误为同样原因,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
                showMsg( "创建对象失败,请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化" );
                return;
            }
    
            mIatResults.clear();//清除数据
            setParam(); // 设置参数
            mIatDialog.setListener(mRecognizerDialogListener);//设置监听
            mIatDialog.show();// 显示对话框
        }
    

    最后在onDestory中

    	@Override
        protected void onDestroy() {
            super.onDestroy();
    
            if (null != mIat) {
                // 退出时释放连接
                mIat.cancel();
                mIat.destroy();
            }
        }
    

    这样逻辑就很清楚了

    七、运行效果图

    在这里插入图片描述
    点击
    在这里插入图片描述
    识别中,识别到之后
    在这里插入图片描述

    APK下载二维码
    在这里插入图片描述

    ④ 梳理

    从平台创建应用之后的到一个appid,然后新建一个项目,先配置AndroidManifest.xml,配置了静态权限和Application,在Application中对讯飞语音插件进行初始化,这样就可以影响到全局,而不是在某一个Activity的中onCreate进行初始化,当然你也可以这样做。然后初始化控件和讯飞的一些工具类,并实现点击监听,之后进行动态权限的获取,成功之后,进行语音监听(包括UI对话框)的接口实现,在返回值中做数据解析,得到需要的数据显示在页面的TextView上,然后再配置一些需要在调用语音识别之前需要的参数,比如语言类型和结果类型之类的,之后就是点击出现语音识别的UI对话框,当你说完之后会消失,并识别到你说的内容解析显示在页面上。至此,语音识别完成。

    尾声

    这里无非就是一些感想而已,其实实现功能的方法有很多,文章中只是其中之一而已,欢迎留言讨论,我是初学者-Study,山高水长,后会有期~

    项目源码:XFASRDemo

    温馨提示:请在自己的手机(真机)上运行,别用Android的虚拟器或者任何其他的模拟器,你会出现如评论区的朋友所遇到相同的问题:“创建对象失败,请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化”。原因就是虚拟机cpu是x86的,在讯飞的SDK中没有x86对应的libmsc.so。所以你会报错。但是如果你用真机还是报这个错的话,那你可以理直气壮的去讯飞的官网上提问。让他们开发人员给你解决。

    展开全文
  • qt实现科大讯飞在线语音识别功能,可以实现语音文字的转换。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,566
精华内容 2,626
关键字:

科大讯飞语音识别

友情链接: sgudy-with.rar