【从零单排】利用科大讯飞语音包实现Android语音识别Demo

来源:互联网 发布:知善恶树pdf巴罗哈 编辑:程序博客网 时间:2024/04/23 21:34

我对Android可以说是完全零基础,因为老师要求做口语对话系统,所以开始从头一点点看。目前完成了一个非常简单界面很粗糙的语音识别Demo,因为网上现有的代码都太老了,或者问题很多,给像我这样的新手带来很大的困扰,所以决定写个从零开始的心得体会,大酒神不是有从零单排嘛,咱也来个从零单排(愚笨想不出好名来。。)先晒一下我最简单的代码,后续会贴出性能更好界面更完善的来。

利用科大讯飞语音包的话还是比较简单的,网上有个iflyDemo的例子,但是他用的MSC的jar包太老了,现在都不能使用,所以还是得自己去科大讯飞的官网上注册下载。

这里是网址:http://open.voicecloud.cn/

1.点开发入口后完成注册,注册完填一下个人信息,项目介绍什么的,它会给你一个appid,这个很有用必须要有。然后进sdk下载,android有两个包,都下下来。这次我们主要用的是Msc.jar包,就是那个较小的压缩文件。

2.解压缩后里面有个sample,那个就是个demo,但不能直接用打开全是错,估计就是做个示范教你怎么用的。还有一个apk文件下到adt中竟然是个闹铃、秒表的app,太坑爹了吧!比较有用的是doc下的开发手册,好好看看那个。

3.开发手册里写的很清楚怎么搭建自己的工程,并添加它给的jar包,还有插图,我就不赘述了

4.它的mscdemo中又很多java文件,因为它能实现语音识别,合成,语义理解等多种功能,我们这次只演示语音听写

5.先把一下内容添加到自己的Manifest.xml文件中

<uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

6.布局很简单,一个edittext框显示内容,一个button点击开始说话。main.xml如下

</pre><pre code_snippet_id="228905" snippet_file_name="blog_20140311_2_5248216" name="code" class="html"><?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <EditText        android:id="@+id/editText"        android:layout_width="fill_parent"        android:layout_height="300dp"        android:gravity="top"        android:inputType="textMultiLine" >        <requestFocus />    </EditText>    <Button        android:id="@+id/button_start"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="点击开始说话" /></LinearLayout>
7.string也很简单,就几句话,要注意app_id填你自己的id

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="hello">Hello World, MainActivity!</string>    <string name="app_name">_iflyDemo</string>    <string name="app_id">1234567</string><string name="text_login_fail">登录失败</string></resources>

8.最后是Activity.java。要完成这个主要用了它封装好的SpeechRecognizer这个类,导入的包基本都在他的Msc.jar包里面,只有一个JsonParser的需要手动将他demo里的那个JsonParser复制到自己的新建的package里面来,如图



9.activity代码如下

package barry.android.ifly.ui;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import android.text.TextUtils;import com.iflytek.cloud.speech.RecognizerResult;import com.iflytek.cloud.speech.SpeechError;import com.iflytek.cloud.speech.SpeechListener;import com.iflytek.cloud.speech.SpeechRecognizer;import com.iflytek.cloud.speech.SpeechConstant;import com.iflytek.cloud.speech.RecognizerListener;import com.iflytek.cloud.speech.SpeechUser;import barry.android.ifly.utils.JsonParser;public class MainActivity extends Activity {private Button startButton = null;private SpeechRecognizer iatRecognizer;//set engine,iat means dictationprivate String engine="iat";//set frequency,8000 or 16000private String rate="16000";//识别结果显示private EditText mResultText = null;// Tipprivate Toast mToast;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mToast = Toast.makeText(this, "", Toast.LENGTH_LONG);//用户登录SpeechUser.getUser().login(MainActivity.this, null, null, "appid=" + getString(R.string.app_id), listener);mResultText = (EditText) findViewById(R.id.editText);startButton = (Button) findViewById(R.id.button_start);startButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {showIatinvisble();}});}protected void showIatinvisble() {iatRecognizer=SpeechRecognizer.createRecognizer(this);//获取引擎参数iatRecognizer.setParameter(SpeechConstant.DOMAIN, engine);iatRecognizer.setParameter(SpeechConstant.SAMPLE_RATE, rate);//clear myResulttextmResultText.setText(null);iatRecognizer.startListening(myrecognizerListener);}/* * 识别回调监听 */private RecognizerListener myrecognizerListener=new RecognizerListener(){@Overridepublic void onBeginOfSpeech() {showTip("开始说话");}@Overridepublic void onError(SpeechError err) {showTip(err.getPlainDescription(true));}@Overridepublic void onEndOfSpeech() {showTip("结束说话");}//扩展@Overridepublic void onEvent(int eventType, int arg1, int arg2, String msg) {}@Overridepublic void onResult(RecognizerResult results, boolean isLast) {String text = JsonParser.parseIatResult(results.getResultString());mResultText.append(text);mResultText.setSelection(mResultText.length());}@Overridepublic void onVolumeChanged(int volume) {showTip("当前正在说话,音量大小:" + volume);}};/** * 用户登录回调监听器. */private SpeechListener listener = new SpeechListener(){@Overridepublic void onData(byte[] arg0) {}@Overridepublic void onCompleted(SpeechError error) {if(error != null) {Toast.makeText(MainActivity.this, getString(R.string.text_login_fail), Toast.LENGTH_SHORT).show();}}@Overridepublic void onEvent(int arg0, Bundle arg1) {}};private void showTip(String str){if(!TextUtils.isEmpty(str)){mToast.setText(str);mToast.show();}}}

10.效果图。识别效果不算好是程序太简陋的问题,相信完善后会不错的!


后续会贴出改进版,敬请关注。
欢迎讨论交流,共同学习!

转载请注明出处:http://blog.csdn.net/monkeyduck   谢谢!


<pre code_snippet_id="228905" snippet_file_name="blog_20140311_3_1777852" name="code" class="html"><pre code_snippet_id="228905" snippet_file_name="blog_20140311_3_1777852" name="code" class="html"><pre code_snippet_id="228905" snippet_file_name="blog_20140311_3_1777852" name="code" class="html"><pre code_snippet_id="228905" snippet_file_name="blog_20140311_3_1777852" name="code" class="html">
                                             
2 0
原创粉丝点击