博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
搜狗语音云开发入门(二)——使用离线语音识别服务
阅读量:5159 次
发布时间:2019-06-13

本文共 6435 字,大约阅读时间需要 21 分钟。

1 简单介绍

    之前在中介绍了使用为client程序加入在线语音识别服务。

在线语音服务须要联网使用,可是你不能指望用户拥有完美的环境,其实大多数情况下用户的外围环境都会有所限制。

有的时候没有Wi-Fi、没有流量,还想使用语音识别,假设你给用户一个提示“您没开流量...”仅仅能说你的程序弱爆了。有条件情况下给用户提供完美的服务,没有条件创造条件服务质量依旧完美。而且清风徐来了无痕迹,这才是完美应用的体现。你不是用户的亲戚朋友同学战友,不是武藤苍井上原结衣小子玛利亚。不是黎明郭富城刘德华梁朝伟,也不是王朔海岩郭敬明韩寒,这些你统统不是。但你做的应用还是能让人喜欢用,赶都赶不走,那就是能力。不好意思扯远了。

 

2 提供的服务

    离线语音识别服务由两部分组成:和开发API

不能联网,语音引擎就转到你本地了。

而通过调用API,能够操作离线语音识别Service,对离线语音识别Service运行startbindunbind等操作。还能够获取结果,通过向Service发请求。获取离线语音识别结果或者出错信息。

 

3 怎样使用

 

3.1 使用步骤

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

    登陆

    

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

    申请之后,语音云官方会进行审核。只是这个审核是须要一点时间的,通常是4天左右

有须要的朋友们,还等什么。赶快先申请着再说!

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

    

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

    

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

3.2 调用服务

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

    

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

    

    将SDK压缩文件解压后。里面有一个libs目录,进入后能够看到里面的文件:

    

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

    

    下载

程序中的API正是调用的该引擎中的服务。注意,首次使用或者使用次数达到上限时,须要进行联网认证,其他时候离线就可以提供服务。

    

    接下来关注我们的Androidproject。

改动AndroidManifest.xml。须要确保app具有下面权限:    

 

    

    Android中加入布局:

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

    以下我们来看看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() {		@Override		public void run() {			coreControl.startListening();		}	};	Handler handler = new Handler() {		@Override		public 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; } } }; @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if (coreControl != null) { coreControl.onDestroyService(); System.out.println("断开语音service"); } } @Override protected 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() { @Override public void onUpdateVolume(int arg0) { // TODO Auto-generated method stub } // 3.录音结束 @Override public void onSpeechEnd() { // TODO Auto-generated method stub Bundle bundle = new Bundle(); bundle.putString(MSG_TEXT, "录音结束"); Message msg = handler.obtainMessage(); msg.what = 0x3; msg.setData(bundle); msg.sendToTarget(); System.out.println("3.录音结束"); } @Override public void onServiceConnected(String arg0) { // TODO Auto-generated method stub } // 4.说话内容 @Override public 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.開始识别 @Override public 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.认证成功 @Override public 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.认证成功。请说话!"); } @Override public void onFinishInit() { // TODO Auto-generated method stub } @Override public void onError(int arg0) { System.err.println("错误代码:" + arg0); } }); coreControl.onInitializeService(); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (coreControl != null) { // coreControl.startListening(); handler.post(regThread); } } }); } @Override public 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; } @Override public 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”换成你申请下来的信息值。

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

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

    在程序创建的过程中。首先新建一个CoreControl对象。将程序环境信息、appIdaccess-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)

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

    

    非常easy不是吗!

3.3 client使用

    启动后界面:

    

    点击“我要说话”:

    

    对着麦克风说话后:

    

    更具体的内容能够參考搜狗的演示样例程序及SDK文档。

赶快试一试吧!

转载于:https://www.cnblogs.com/brucemengbm/p/6800049.html

你可能感兴趣的文章
Apache-ab 接口性能测试
查看>>
EF 4.1 Code First Walkthrough
查看>>
常用MySQL语法
查看>>
bzoj 2600: [Ioi2011]ricehub
查看>>
创建数据库,表
查看>>
工厂模式
查看>>
计算机网络基础知识
查看>>
C#里如何遍历枚举所有的项
查看>>
如何在键盘出现时滚动表格,以适应输入框的显示
查看>>
超级强大的鼠标手势工具
查看>>
常用Dockerfile举例
查看>>
jquery的ajax用法
查看>>
设计模式-策略模式(Strategy)
查看>>
django orm 数据查询详解
查看>>
JarvisOJ Basic 熟悉的声音
查看>>
C# list导出Excel(二)
查看>>
CAS 单点登录模块学习
查看>>
跟着辛星用PHP的反射机制来实现插件
查看>>
Android应用开发-网络编程①
查看>>
input中的name,value以及label中的for
查看>>