1 简介

之前在《搜狗语音云开发入门--移动端轻松添加高大上的语音识别》中介绍了使用搜狗语音云为客户端程序添加在线语音识别服务。在线语音服务需要联网使用,但是你不能指望用户拥有完美的环境,事实上大多数情况下用户的外围环境都会有所限制。有的时候没有Wi-Fi、没有流量,还想使用语音识别,如果你给用户一个提示“您没开流量...”只能说你的程序弱爆了。有条件情况下给用户提供完美的服务,没有条件创造条件服务质量依然完美,并且清风徐来了无痕迹,这才是完美应用的体现。你不是用户的亲戚朋友同学战友,不是武藤苍井上原结衣小子玛利亚,不是黎明郭富城刘德华梁朝伟,也不是王朔海岩郭敬明韩寒,这些你统统不是。但你做的应用还是能让人喜欢用,赶都赶不走,那就是能力。不好意思扯远了。

2 提供的服务

离线语音识别服务由两部分组成:搜狗离线语音识别引擎和开发API。不能联网,语音引擎就转到你本地了。而通过调用API,可以操作离线语音识别Service,对离线语音识别Service执行start、bind和unbind等操作。还可以获取结果,通过向Service发请求,获取离线语音识别结果或者出错信息。

3 如何使用

3.1 使用步骤

离线语音识别服务没有快速体验,所以需要使用必须进行服务的常规申请。

登陆搜狗语音云开放平台:

如图,首先点击“开发者专区”,选择“离线识别”,然后填写详细的应用信息与开发者信息。这里要注意的是,一定要准确填写你的“应用包名”,否则识别有问题。

申请之后,语音云官方会进行审核,不过这个审核是需要一点时间的,一般是4天左右。有需要的朋友们,还等什么,赶快先申请着再说!

审核过程中,你随时可以点击右上角:账号 - 我的应用,查看审核结果。成功之后会有:

可以看到基本信息列出来了,然后点击“应用信息”:

关键是“appId”与“access-key”这两项,程序调用的时候需要用到,记得保存好。

3.2 调用服务

在调用服务之前,需要先将SDK服务和服务文档下载下来:

分别点击“SDK下载”中的“下载SDK”和“开发文档”,将两份文件下载:

将SDK压缩文件解压后,里面有一个libs文件夹,进入后可以看到里面的文件:

将它们放入你的Android工程的libs里面,并在工程中将sogou-speechapi-offline-v1.0.jar引入Build Path。

下载搜狗离线语音识别引擎。程序中的API正是调用的该引擎中的服务。注意,首次使用或者使用次数达到上限时,需要进行联网认证,其它时候离线即可提供服务。

接下来关注我们的Android工程。修改AndroidManifest.xml,需要确保app具有以下权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><span style="font-family: 宋体; background-color: rgb(255, 255, 255);"> </span>

在Android中添加布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.testyuyinoffline.MainActivity" ><RelativeLayout android:id="@id/textLayout"android:layout_width="wrap_content"android:layout_height="wrap_content" ><TextViewandroid:id="@id/statusLabel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dip"android:layout_marginLeft="30dip"android:layout_alignParentLeft="true"android:text="@string/statusLabel" /><TextViewandroid:id="@id/statusTextTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dip"android:layout_marginRight="20dip"android:layout_alignParentRight="true"android:text="@string/statusText" /><TextViewandroid:id="@id/toSayLabelTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dip"android:layout_marginLeft="30dip"android:layout_alignParentLeft="true"android:layout_below="@id/statusLabel"android:text="@string/toSayLabel" /><TextViewandroid:id="@id/toSayTextTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dip"android:layout_marginRight="20dip"android:layout_alignParentRight="true"android:layout_below="@id/statusTextTv"android:text="@string/toSayText" /></RelativeLayout><Buttonandroid:id="@id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="100dip"android:layout_centerHorizontal="true"android:text="@string/clickMe" /></RelativeLayout>

布局中,我们放入4个TextView,分别用来标记和显示服务请求的状态、识别内容,然后再放置一个按钮,用来启动识别服务。

下面我们来看看activity中的调用代码:

package com.example.testyuyinoffline;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;import com.sogou.speech.offlinelistener.OutsideCallListener;
import com.sogou.speech.offlineutility.CoreControl;public class MainActivity extends Activity {public static final String MSG_TEXT = "MSG_TEXT";CoreControl coreControl;TextView statusTextTView;TextView toSayTextTvTextView;Runnable regThread = new Runnable() {@Overridepublic void run() {coreControl.startListening();}};Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {System.out.println("what=" + msg.what);switch (msg.what) {// 1.开始识别case 0x1:statusTextTView.setText("开始识别!");break;// 2.认证成功case 0x2:statusTextTView.setText("认证成功,请说话!");break;// 3.录音结束case 0x3:statusTextTView.setText("录音结束!");break;// 4.说话内容case 0x4:String text = msg.getData().getString(MSG_TEXT);toSayTextTvTextView.setText(text);break;default:break;}}};@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();if (coreControl != null) {coreControl.onDestroyService();System.out.println("断开语音service");}}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.button);statusTextTView = (TextView) findViewById(R.id.statusTextTv);toSayTextTvTextView = (TextView)findViewById(R.id.toSayTextTv);coreControl = new CoreControl(this.getApplicationContext(),(TelephonyManager) this.getSystemService(TELEPHONY_SERVICE),"<span style="background-color: rgb(255, 0, 0);">appId</span>", "<span style="background-color: rgb(255, 0, 0);">access-key</span>");coreControl.setmListener(new OutsideCallListener() {@Overridepublic void onUpdateVolume(int arg0) {// TODO Auto-generated method stub}// 3.录音结束@Overridepublic void onSpeechEnd() {// TODO Auto-generated method stubBundle bundle = new Bundle();bundle.putString(MSG_TEXT, "录音结束");Message msg = handler.obtainMessage();msg.what = 0x3;msg.setData(bundle);msg.sendToTarget();System.out.println("3.录音结束");}@Overridepublic void onServiceConnected(String arg0) {// TODO Auto-generated method stub}// 4.说话内容@Overridepublic void onResults(String arg0, boolean arg1) {Bundle bundle = new Bundle();bundle.putString(MSG_TEXT, arg0);Message msg = handler.obtainMessage();msg.what = 0x4;msg.setData(bundle);msg.sendToTarget();System.out.println("4.说话内容:" + arg0);}// 1.开始识别@Overridepublic void onRecognitionStart() {Bundle bundle = new Bundle();bundle.putString(MSG_TEXT, "开始识别!");Message msg = handler.obtainMessage();msg.what = 0x1;msg.setData(bundle);msg.sendToTarget();System.out.println("1.开始识别!");}// 2.认证成功@Overridepublic void onPassedValidation() {Bundle bundle = new Bundle();bundle.putString(MSG_TEXT, "认证成功!");Message msg = handler.obtainMessage();msg.what = 0x2;msg.setData(bundle);msg.sendToTarget();System.out.println("2.认证成功,请说话!");}@Overridepublic void onFinishInit() {// TODO Auto-generated method stub}@Overridepublic void onError(int arg0) {System.err.println("错误代码:" + arg0);}});coreControl.onInitializeService();button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (coreControl != null) {
//                  coreControl.startListening();handler.post(regThread);}}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

注意将其中的“appId”和“access-key”换成你申请下来的信息值。

我们的思路是,点击按钮的时候,启动语音识别服务;语音识别的不同状态过程中,将状态情况显示在界面上;识别出说话内容之后,将内容显示在界面上。

在activity中,创建一个线程,线程开启识别服务。

在程序创建的过程中,首先新建一个CoreControl对象,将程序环境信息、appId、access-key等传进去。然后给CoreControl对象设置OutsideCallListener监听。监听中有几个比较重要的回调函数:

1.开始识别

public void onRecognitionStart()

2.认证成功

public void onPassedValidation()

3.录音结束

public void onSpeechEnd()

4.得到说话内容

public void onResults(String arg0, boolean arg1)

在这几个回调函数中,均使用handler向主线程传递状态参数。主线程的handler在其:

public void handleMessage(android.os.Message msg)

这个函数中更改界面状态,并将识别内容显示出来。当退出App时,调用onDestroyService()方法断开与Service的连接:

protected void onDestroy()

在出现异常的回调函数中:

public void onError(int arg0)

可以错误码打印到后台或返回到前端,以便分析错误种类。错误码定义:

很简单不是吗!

3.3 客户端使用

启动后界面:

点击“我要说话”:

对着麦克风说话后:

更详细的内容可以参考搜狗的示例程序及SDK文档。赶快试一试吧!

搜狗语音云开发入门(二)——使用离线语音识别服务相关推荐

  1. 搜狗语音云开发入门--移动端轻松添加高大上的语音识别

    1 简介 搜狗语音云基于自主开发.领先业内的语音技术,力求为广大开发者提供最优质的语音服务,开发者只需简单集成语音云控件, 就可以通过API调用搜狗语音云服务,获得搜狗强大的语音技术支持,更加专注于业 ...

  2. 微信小程序云开发入门(二)-数据库详解

    微信小程序云开发入门(二)-数据库详解 接上一篇:微信小程序云开发入门(一) 摘要: 因为微信小程序云数据库有点类似传统的关系型数据库,但又有所不同.所以刚入手的时候会有点困扰,经过一段时间的学习和摸 ...

  3. html5语音云,搜狗语音云开放平台

    · 什么是语音云 作为人机交互最自然便捷的方式之一,语音普遍被认为将引领下一代人机交互革命. 今天,在移动互联网以及云计算等相关产业的推动下,语音技术和应用环境逐步成熟, 语音交互逐渐被用户接受和使用 ...

  4. Pascal游戏开发入门(二):渲染图片

    Pascal游戏开发入门(二):渲染图片 渲染静态图片 新增一个Texture,然后Render出来 创建Texture,并获取尺寸 procedure TGame.Init(title: strin ...

  5. 微信小程序云开发入门(图文详解)

    以下内容是我第一次微信小程序云开发的一次记录,从真正的0基础入门,到基本掌握一些内容. 其中遇到的一些问题,和根据网上 的一些资料,整理出来真正可用的,实测可行的源代码. 以下放出我的github源码 ...

  6. java游戏开发入门(二) - 菜单

    java游戏开发入门(二) - 菜单 前言 编码 主菜单 游戏内菜单(按下ESC后出现,并会暂停游戏) 效果展示 主菜单 游戏内菜单 完整代码 完整项目 前言   上一章我们创建了一个600x600的 ...

  7. 微信小程序云开发入门(一)

    微信小程序云开发入门(一) 摘要:微信小程序云开发是包含了服务器以及数据库的运行环境,而且只需要开发者进行简单的管理,关键是不用服务器进行权限验证,步骤简单不少,非常适合个人开发者和创业者使用.虽然云 ...

  8. linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)

    linux内核开发入门二(内核KO模块介绍.开发流程以及注意事项) 一.什么是内核模块 内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核 ...

  9. u8 api开发报类型不匹配错误_小程序云开发入门学习,小程序支付功能常见错误汇总及解决方案...

    近期有比较多的同学反映,使用云开发调取微信支付时,老是提示订单不存在.今天就把这几天大家遇到的问题统一汇总到这里. 一,订单不存在的错误 如下图所示的错误. 通常看到这个错误时,最好去看下上面看下,有 ...

  10. ebs开发入门 oracle 知乎_微信小程序云开发入门第一篇---开发准备事项

    在开始本文的正式内容之前,先允许我做一个简单的自我介绍,我是一名嵌入式软件开发人员,目前在一家音视频处理芯片公司做linux系统下音视频开发的相关工作,算是嵌入式软件开发行业的老人了,如果您对嵌入式行 ...

最新文章

  1. 深度丨AlphaGo Zero的启示:监督学习和无监督学习的利弊
  2. 围剿Sci-Hub力度升级!全球最大学术出版商:网址你也不要提,不然就发律师函...
  3. 弹出窗口, 不显示工具栏等。
  4. 怎么查看笔记本内存条型号_笔记本配置参数怎么看 笔记本配置参数查看方法【详解】...
  5. Java服务CPU飙到99%问题排查
  6. 不显示参数名_非参数检验 之 非参数卡方检验
  7. 10.用好远程联机服务器
  8. Windows 8 各个版本区别对比
  9. 190507每日一句
  10. 西门子、三菱、台达PLC手机组态软件,支持modbus协议的ModbusTesla手机组态软件 只支持modbus tcp,只要下位机支持标准的modbus协议就可以
  11. 电工模拟接线软件 app_老电工教你家装线路接线
  12. Xshell免密登录
  13. mac上如何官网下载安装virtualbox
  14. python循环次数教程_Python基础教程-循环
  15. 云数据库 RDS for PostgreSQL的优势和应用
  16. Multisim调幅和解调电路仿真实验
  17. ojdbc8.jar 官网下载地址
  18. word/wps 插入图片变糊
  19. 图解 | JavaScript的作用域和作用域链
  20. 如何用源生js做出淘宝放大镜效果?

热门文章

  1. What is Drilldown configuration
  2. 职业发展的明线与暗线
  3. php文字下划线,如何在文字下面添加下划线
  4. Unity 查找资源引用
  5. 计算机获取信息的过程是,“获取信息的过程与方法”的教学案例
  6. Ramda 函数库参考教程
  7. 记录一下工作中常用的ramda处理数据方法
  8. 用python写问答机器人_问答机器人
  9. C# wpf确认取消MessageBox选择按钮
  10. 国外云服务器有哪些?国外云服务器大全