专栏首页AI科技大本营的专栏教你用Android做二次开发,识别率达到科大讯飞语音输入水平 | 原力计划

教你用Android做二次开发,识别率达到科大讯飞语音输入水平 | 原力计划

作者 | Pek_KuaiJia

责编 | 夕颜

头图 | CSDN 下载自视觉中国

出品 | CSDN(ID:CSDNnews)

随着目前用户需求的精细化和智能化,很多时候我们需要在App内集成语音输入模块,为用户提供语音输入的功能。而科大讯飞语音作为行业内翘楚,识别结果相对准确,且讯飞自带一套识别动画,适合快速搭建模块,废话不多说,先看下效果图。

下面开始具体步骤

申请key

百度搜索讯飞开放平台,注册账号并实名认证,然后在产品中找到语音听写,可以领取90天试用包,商用需付费。接着打开控制台,添加你需要使用讯飞SDK的应用,注意保存这里的APPID,这个就是之后需要配置到APP中。

下载SDK

在官网中找到资料库,选择你刚才添加的应用,下载在线语音识别SDK

将加压所得文件夹中libs下的Msc.jar文件复制到项目中的libs下

如果没有就新建一个,复制完成后,右击Msc.jar文件,选择add as library,这里后面获取语音识别结果需要解析json,由于我使用的是gson,所以一并导入了;接着将下载下来的文件夹libs下两个文件夹复制到你项目目录的src/main/jniLibs,如果没有该文件夹就新建一个;最后在你项目app目录下新建assets文件夹,将下载下来的文件夹中assets中文件夹复制进去,至此,文件全部导入完成,放个整体项目文件结构图。

为语音听写添加权限

在mainfest.xml添加即可,注意Android6.0以上,读取麦克风和获取手机识别码权限需要动态申请。

 1  <uses-permission android:name="android.permission.INTERNET" />
 2    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
 3    <uses-permission android:name="android.permission.RECORD_AUDIO" />
 4    <!--读取网络信息状态 -->
 5    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 6    <!--获取当前wifi状态 -->
 7    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 8    <!--允许程序改变网络连接状态 -->
 9    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
10    <!--读取手机信息权限 -->
11    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

配置APPID

在APP的Application的onCreate()配置如下代码,如果没有application,也可以在需要用到这个功能的Activity的onCreate()添加,注意“=”不能少

 1public class MyApplication extends Application{
 2
 3    @Override
 4    public void onCreate() {
 5        super.onCreate();
 6        //注意这里的“=”不能少
 7        SpeechUtility.createUtility(getApplicationContext();, SpeechConstant.APPID + "=你的APPID");
 8
 9    }
10
11}

在启动语音识别模块添加代码

这里的result就是语音转换的结果字符串,可以通过iatDialog.setParameter()配置语言,间隔时间(即多长时间不说话时视为结束)等,具体可参考官网文档。

 1private void changeIntoText() {
 2
 3        // ②初始化有交互动画的语音识别器
 4        iatDialog = new RecognizerDialog(SearchMusicActivity.this, mInitListener);
 5        //③设置监听,实现听写结果的回调
 6        int a = 1+2;
 7
 8        iatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
 9        iatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
10
11        iatDialog.setListener(new RecognizerDialogListener() {
12            String resultJson = "[";//放置在外边做类的变量则报错,会造成json格式不对(?)
13
14            @Override
15            public void onResult(RecognizerResult recognizerResult, boolean isLast) {
16                System.out.println("-----------------   onResult   -----------------");
17                if (!isLast) {
18                    resultJson += recognizerResult.getResultString() + ",";
19                } else {
20                    resultJson += recognizerResult.getResultString() + "]";
21                }
22
23                if (isLast) {
24                    //解析语音识别后返回的json格式的结果
25                    Gson gson = new Gson();
26                    List<DictationResult> resultList = gson.fromJson(resultJson,
27                            new TypeToken<List<DictationResult>>() {
28                            }.getType());
29                    String result = "";
30                    for (int i = 0; i < resultList.size() - 1; i++) {
31                        result += resultList.get(i).toString();
32                    }
33
34                    et_content.setText(result);
35                    //获取焦点
36                    et_content.requestFocus();
37                    //将光标定位到文字最后,以便修改
38                    et_content.setSelection(result.length());
39                }
40            }
41
42            @Override
43            public void onError(SpeechError speechError) {
44                //自动生成的方法存根
45                speechError.getPlainDescription(true);
46            }
47        });
48        //开始听写,需将sdk中的assets文件下的文件夹拷入项目的assets文件夹下(没有的话自己新建)
49        iatDialog.show();
50    }
51
52    private InitListener mInitListener = new InitListener() {
53        @Override
54        public void onInit(int code) {
55            Log.d(TAG, "SpeechRecognizer init() code = " + code);
56            if (code != ErrorCode.SUCCESS) {
57                Toast.makeText(SearchMusicActivity.this, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
58            }
59        }
60    };
【end】

◆有奖征文◆
推荐阅读2020年,5种将死的编程语言检测、量化、追踪新冠病毒,基于深度学习的自动CT图像分析有多靠谱?GitHub 接连封杀开源项目惹众怒,CEO 亲自道歉!智能合约编写之 Solidity 的设计模式低学历、文科出身,我如何从月薪不到 3000 逆袭为大厂高薪程序员?从提取层、处理层、基础结构入手,带你了解Spark和Kafka!你点的每个“在看”,我都认真当成了AI

本文分享自微信公众号 - AI科技大本营(rgznai100)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微软语音AI技术与微软听听文档小程序实践 | AI ProCon 2019

    【导语】9 月 7 日,在CSDN主办的「AI ProCon 2019」上,微软(亚洲)互联网工程院人工智能语音团队首席研发总监赵晟、微软(亚洲)互联网工程院 ...

    AI科技大本营
  • 英伟达发布史上最强GPU,却叫停了自动驾驶车路测

    作者 | DavidZh 当地时间 3 月 27 日,英伟达在美国圣克拉的 GTC 大会上推出多款产品。 ▌显卡扩容,史上最强的 DGX-2 发布 打头阵的是搭...

    AI科技大本营
  • 华尔街失算!从英伟达财报看AI芯片市场的狂奔之路

    英伟达今天发布的Q1财报,实实在在打脸了华尔街此前的唱衰之声。 对于英伟达 AI 业务和自动驾驶的潜力,大家往好的一面预测的话,能乐观到什么程度? 对于老黄...

    AI科技大本营
  • 速读原著-Android应用开发入门教程(使用Tab组织UI)

    Tab 用于在一个屏幕中将不同的子屏幕组织到一起,用不同的 Tab 区分。 参考示例程序:Content By Intent(ApiDemo=>Views=>...

    cwl_java
  • 22-ESP8266 SDK开发基础入门篇--编写Android TCP客户端 , 连接和断开

    https://www.cnblogs.com/yangfengwu/p/11192618.html

    杨奉武
  • Android项目开发全程(一)--创建工程

      每个程序员都知道,项目工程的整体架构对开发有着决定性的影响,在后续的开发工作中,能不能有效的减少代码的重复量和有效的人员分工取决于前期工程整体的架构。刚参加...

    codingblock
  • android环境搭建

    今天看了一下android编程方面的知识,开始以为很麻烦,可是仔细一看,全是java方面的知识,对于搞了这么多年的我来说简直就是小菜一碟,简单至极,下面一步一步...

    cloudskyme
  • Navigation 详解一

    Navigation 是 JetPack 中的一个组件,用于方便的实现页面的导航,所以抽象出了一个 destination 的概念,大部分情况一个 destin...

    七适散人
  • 让你的App有声音

    coderZhen
  • Android开发(9) 选项卡的切换

    我们想实现的效果是点击切换的选项卡卡部分,主显示区的内容随之改变。那么我们看下页面布局代码

    zhangyunfeiVir

扫码关注云+社区

领取腾讯云代金券