讯飞语音识别android
2014-04-09 11:28:03 xiaoluoli88 阅读数 1403

讯飞的语音sdk是需要申请的,地址是:http://open.voicecloud.cn/。申请一个讯飞的开发者账号,然后申请一个appid,申请的时候需要填写开发者信息和你的应用的信息。

申请之后经过审核通过,会得到一个appid。





例子中,点击最下面的button可以开始说话,说完之后,屏幕中的TextView会显示刚才说过的话。



     

   

二、准备工作

     首先当然是新建一个Android项目,然后按照文档说的添加库.

1.在Eclipse中 选 中 工 程 , 通 过 工 具 栏Project->Properties->Java BuildPath->Libraries->Add JARS 或 ADD External JARS 引入 Msc.jar;

2.将 SDK.\lib 目录下 libs 文件夹拷贝到工程根目录,确保.\libs\armeabi\libmsc.so 文件存在。

3.在工程 AndroidManifest.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"/>


三、主要代码:

  1. package com.example.meclisener;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import com.iflytek.speech.RecognizerResult;  
  6. import com.iflytek.speech.SpeechError;  
  7. import com.iflytek.ui.RecognizerDialog;  
  8. import com.iflytek.ui.RecognizerDialogListener;  
  9.   
  10. import android.os.Bundle;  
  11. import android.app.Activity;  
  12. import android.view.Menu;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.TextView;  
  17. import android.widget.Toast;  
  18.   
  19. public class MainActivity extends Activity implements RecognizerDialogListener {  
  20.   
  21.     private RecognizerDialog isrDialog;  
  22.     private TextView myTextView;  
  23.     private String text;  
  24.     private Button myButton;  
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_main);  
  29.         myTextView=(TextView)findViewById(R.id.myTextView);  
  30.         myButton=(Button)findViewById(R.id.StartButton);  
  31.         myButton.setOnClickListener(new ButtonListener());  
  32.     }  
  33.   
  34.   
  35.     @Override  
  36.     protected void onStart() {  
  37.         super.onStart();  
  38.         text="";  
  1. //appid 需要自己去申请  
  2.         isrDialog = new RecognizerDialog(this,"appid=XXXXXXXX");  
  3.         isrDialog.setEngine("sms",null,null);  
  4.         isrDialog.setListener(this);  
  5.           
  6.     }  
  7.     @Override  
  8.     public void onResults(ArrayList<RecognizerResult> results,boolean  
  9.             isLast){  
  10.         text += results.get(0).text;  
  11.         System.out.println("OnResult");  
  12.         Toast.makeText(getApplicationContext(),"You say"+text,Toast.LENGTH_SHORT).show();   
  13.     }  
  14.     @Override  
  15.     public void onEnd(SpeechError error) {  
  16.         if(error != null)  
  17.             System.out.println("Error");  
  18.         myTextView.setText(text);  
  19.   
  20.     }  
  21.     public void showisrDialog()  
  22.     {  
  23.   
  24.     }  
  25.     @Override  
  26.     public boolean onCreateOptionsMenu(Menu menu) {  
  27.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  28.         return true;  
  29.     }  
  30.   
  31.     class ButtonListener implements OnClickListener    
  32.     {    
  33.         @Override  
  34.         public void onClick(View v) {  
  35.             // TODO Auto-generated method stub  
  36.             isrDialog.show();  
  37.         }    
  38.             
  39.     }    
  40. }  

布局文件

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5. a  
  6.     <TextView  
  7.         android:id="@+id/myTextView"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_centerHorizontal="true"  
  11.         android:layout_marginTop="20dp"  
  12.         android:text="@string/hello_world"  
  13.         android:textSize="20dp"  
  14.         tools:context=".MainActivity" />  
  15.   
  16.    <LinearLayout  
  17.         android:id="@+id/bottom"  
  18.         android:layout_width="fill_parent"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_alignParentBottom="true"  
  21.         android:orientation="horizontal" >  
  22.   
  23.         <Button  
  24.             android:id="@+id/StartButton"  
  25.             android:layout_width="match_parent"  
  26.             android:layout_height="wrap_content"  
  27.             android:layout_marginTop="2dip"  
  28.             android:layout_weight="1"  
  29.             android:text="Speak"/>  
  30.     </LinearLayout>  
  31.   
  32. </RelativeLayout> 
2015-04-15 20:33:00 weixin_33895016 阅读数 17

讯飞语音识别:
使用注意事项:mainfest.xml中一定要记得权限写进去
21001:我的情况是没有写SpeechApp类,并且需要在application中注册;
20005:无匹配结果
23300:本地引擎错误,,我的问题是在于语法错误,少了一个分号,,,尼玛,调试好久才找到,而且不会有提示。

 

一般情况下引擎错误的原因:

1、java代码检查你的语法文件路径、语法ID等相关配置;

2、语法文件语法是否正确,可能多了分号,少了分号,等等,必须严格按照BNF语法(最常出现);

2014-08-25 13:42:39 mengzhengjie 阅读数 797

http://www.myexception.cn/android/1166876.html

android 语音识别 之 讯飞语音移植

一、简介

    语音识别现在应用越来越广泛了 比如语音写短信、语音搜索商品、语音搜索关键字等等,这遍我们就简单的谈谈国内比较流行的讯飞语音在android平台上的实现。

   笔者认为:

           google语音识别并不是十分符合中国人的习惯,且google语音识别一个重要弊端的是,需要用户手机上必须有google语音应用。

    一般的国行android手机并没有,比如笔记手机小米就没有。需要下载单独google语音apk。所以用户体现自然不如讯飞。

          但讯飞笔者认为,也有一定风险。讯飞应用协议中,他们是具有任何时候,停掉你语音识别服务的权限的,而且还不用和你商量。

      一旦你的应用达到了百万级了,那么讯飞是要收取你一定的服务费的,所以一般大公司的项目基本上不会用讯飞语音或与讯飞语音合作比如小米,

      Android4.0以上版本语音小助手就有小米与讯飞语音合作开发出来的。

二、讯飞Android小示例

     先看看效果图:

 

   嗯,看到效果图后下面就谈谈如何去实现效果:

   2.1 到讯飞官网开发者专区中注册用户并获取appid  地址:http://open.voicecloud.cn/developer.php

   2.2 新建android工程,并在清单文件中声明好相应的权限

  

    <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" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2.3 下载libmsc.so与Msc.jar,并分别放在android工程的libs/armeabi与libs文件夹中,如图
   

  3.4 使用示例如下,代码中都带有相应的注释了:

  

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

import com.iflytek.speech.RecognizerResult;
import com.iflytek.speech.SpeechConfig.RATE;
import com.iflytek.speech.SpeechError;
import com.iflytek.ui.RecognizerDialog;
import com.iflytek.ui.RecognizerDialogListener;

/**
 * @author 陈淑飞
 * 2013-1-8 上午1:10:24
 */
public class HelloDemoActivity extends Activity implements OnClickListener {
	protected static final String TAG = "ThirdActivity";
	private EditText txt_result;
	private RecognizerDialog rd;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.demo);
		
		findView();
		//RecognizerDialog(Context context, String params); "appid=1234567,usr=test,pwd=12345"  usr、pwd不是必选的
		//创建语音识别dailog对象,appid到讯飞就注册获取
		rd = new RecognizerDialog(this ,"appid=50e1b967");
	}

	private void findView() {
		txt_result = (EditText) findViewById(R.id.txt_result);
		findViewById(R.id.bt_search).setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.bt_search:
			showReconigizerDialog();
			break;

		default:
			break;
		}
	}

	private void showReconigizerDialog() {
		//setEngine(String engine,String params,String grammar);
		/**
		 * 识别引擎选择,目前支持以下五种
			“sms”:普通文本转写
			“poi”:地名搜索
			“vsearch”:热词搜索
			“vsearch”:热词搜索
			“video”:视频音乐搜索
			“asr”:命令词识别
			
			params	引擎参数配置列表
			附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null
		 */
		rd.setEngine("sms", null, null);
		
		//设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。
		rd.setSampleRate(RATE.rate16k);
		
		final StringBuilder sb = new StringBuilder();
		Log.i(TAG, "识别准备开始.............");
		
		//设置识别后的回调结果
		rd.setListener(new RecognizerDialogListener() {
			@Override
			public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {
				for (RecognizerResult recognizerResult : result) {
					sb.append(recognizerResult.text);
					Log.i(TAG, "识别一条结果为::"+recognizerResult.text);
				}
			}
			@Override
			public void onEnd(SpeechError error) {
				Log.i(TAG, "识别完成.............");
				txt_result.setText(sb.toString());
			}
		});
		
		txt_result.setText(""); //先设置为空,等识别完成后设置内容
		rd.show();
	}

}

笔者注:呵呵请大家转载时,注下来源呗,也帮我弄弄人气撒。

另:工程示例domo,已上传到csdn中(免积分哦),地址:http://download.csdn.net/detail/chenshufei2/4989030


2018-01-30 03:43:42 weixin_34178244 阅读数 8

讯飞语音创建项目流程:

第一步:
注册讯飞语音,这个无需多说,
第二步:
注册成功后登录:点开右上角的控制台:就可以看到自己的项目了:

第二步
第三步:
在控制台的左边有可以看到我们的应用,如果没有就新建一个:

第三步

第四步:根据要求填写相关内容 并提交即可:
第四步

第五步:记住Appid,并开通相关服务

第五步
第六步,开通相关服务
我这里仅仅只开通了第一个语音听写然后就会跳转到下面的页面

第六步

第七步:下载sdk:

这里一定要选择自己的项目,因为我们下载的sdk是和前面的Appid相关的,
第七步

sdk压缩包

到现在,我们的准备工作完成了:下面就是在项目中配置相关sdk,

在项目中配置讯飞语音的相关sdk,这里使用最简单的Ctrl+C 和Ctrl+V:

第一步:使用讯飞自带UI接口,直接将assets下文件拷贝到项目中的相应位置;

复制jar文件和.so文件

第二步,开始实现讯飞语音识别
首先,权限

    <!--连接网络权限,用于执行云端语音能力 -->
    <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"/>
    <!--允许程序改变网络连接状态 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <!--读取手机信息权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--读取联系人权限,上传联系人需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

其次,初始化:

  // 初始化识别对象
        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=58c93888");

这里的APPID就是前面的创建应用时的appid

最后,调用讯飞的语音识别并监听返回值:

      //1.创建RecognizerDialog对象
        RecognizerDialog recognizerDialog = new RecognizerDialog(context, null);
        //2.设置accent、language等参数
        recognizerDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//语种,这里可以有zh_cn和en_us
        recognizerDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置口音,这里设置的是汉语普通话 具体支持口音请查看讯飞文档,
        recognizerDialog.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");//设置编码类型

        //其他设置请参考文档http://www.xfyun.cn/doccenter/awd
        //3.设置讯飞识别语音后的回调监听
        recognizerDialog.setListener(new RecognizerDialogListener() {
            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {//返回结果
                if (!b) {
                    Log.i("讯飞识别的结果", recognizerResult.getResultString());
                }
            }

            @Override
            public void onError(SpeechError speechError) {//返回错误
                Log.e("返回的错误码", speechError.getErrorCode() + "");
            }

        });
        //显示讯飞语音识别视图
        recognizerDialog.show();

语音识别的结果返回的是json各式,所以,如果需要得到识别结果,需要解析json.。我这里使用的是fastjson,需要在build.gradle配置:

    compile 'com.alibaba:fastjson:1.2.8'

解析代码:

JSONObject jsonObject = JSON.parseObject(resultString);
        JSONArray jsonArray = jsonObject.getJSONArray("ws");
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
            JSONArray jsonArray1 = jsonObject1.getJSONArray("cw");
            JSONObject jsonObject2 = jsonArray1.getJSONObject(0);
            String w = jsonObject2.getString("w");
            stringBuffer.append(w);
        }
        Log.i("识别结果", stringBuffer.toString());

最后的结果:

20006表示没有开启录音权限

10118表示没有说话

ok:到目前为止,讯飞的简单语音识别基本上实现,需要注意的是,下载的sdk一定要和自己的Appid匹配,不然就会出现下面的情况:
用户校验失败:

用户校验失败
所以, 把别人下好的sdk复制到自己的项目中时,这中情况是无法使的。

总结:

接入讯飞语音识别的几个要点:

  • 1.最重要的是:Appid一定要和自己下载的sdk相匹配
  • 2.记得要初始化: SpeechUtility.createUtility(this, SpeechConstant.APPID + "=58c93888");
  • 3.更多功能需要去阅读讯飞的开发文档http://www.xfyun.cn/doccenter/awd

项目源码:
http://git.oschina.net/bcbbcc/myiflytek

2013-04-21 23:29:47 zhandoushi1982 阅读数 26493

        Android语音识别,借助于云端技术可以识别用户的语音输入,包括语音控制等技术,下面我们将利用Google提供的Api实现这一功能。功能点为:通过用户语音将用户输入的语音识别出来,并打印在列表上。

       首先建立如下的一个activity,并在button下建立一个listview控件(用来回显语言识别到的项目)。

      代码如下:

package com.example.speechreg;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;   //用于查找本地应用软件包相关的类
import android.content.pm.ResolveInfo;      //从系统IntentFilter返回的信息
import android.os.Bundle;
import android.speech.RecognizerIntent;     //语音识别类
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;         //相同数据用数组存储的匹配转化类
import android.widget.Button;
import android.widget.ListView;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * Sample code that invokes the speech recognition intent API.
 */
public class MainActivity extends Activity implements OnClickListener {
    private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;   //startActivityForResult操作要求的标识码
    private ListView mList;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.voice_recognition);
        Button speakButton = (Button) findViewById(R.id.btn_speak);
        mList = (ListView) findViewById(R.id.listView1);    
 
        PackageManager pm = getPackageManager();
        List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
                RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);  //通过全局包管理器及特定intent,查找系统是否有语音识别的服务程序
        if (activities.size() != 0) {
            speakButton.setOnClickListener(this);	//如果存在该activity
        } else {
            speakButton.setEnabled(false);
            speakButton.setText("Recognizer not present");    //否则将BUTTON显示值修改,并设置成不可选
        }
    }
 
    public void onClick(View v) {    //OnClickListener中的要override的函数
        if (v.getId() == R.id.btn_speak) {
            startVoiceRecognitionActivity();
        }
    }
 
    private void startVoiceRecognitionActivity() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Speech recognition demo");    //设置语音识别Intent调用的特定属性参数
        startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);   启动一个要求有返回值的activity调用
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  //该函数非接口内也非抽象函数,为何会Override?
        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE
                && resultCode == RESULT_OK) {
            // Fill the list view with the strings the recognizer thought it
            // could have heard
            ArrayList<String> matches = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);  //解析存储识别返回的结果
            mList.setAdapter(new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, matches));  //在listview中显示结果
        }
 
        super.onActivityResult(requestCode, resultCode, data);
    }
}

     运行结果如下,它会自动调用谷歌语音识别的服务activity,并返回特定activity执行的结果。

=========================================讯飞平台语音识别语音播报==========================

在网上看到一篇中文语音识别、控制,语音合成的好文章。分享地址http://blog.csdn.net/gao_chun/article/details/46377505



参考原文:http://blog.csdn.net/comkingfly/article/details/7359987

参考原文:http://software.intel.com/zh-cn/articles/developing-android-applications-with-voice-recognition-features/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=intelandroid-yuyinshibie

没有更多推荐了,返回首页