Android——百度语音识别

最近搞了一些关于语音的开发,我做的项目使用的讯飞的语音识别,但是有一个问题是讯飞的语音唤醒和离线语音合成是收费的,并且费用还不低,对于一般的小公司或者个人开发的小APP,还是很有压力的。百度语音识别的效果整体还不错,并且是免费的,很适合个人开发的APP,我这里先给大家简单介绍一下关于百度语音识别的开发,如果时间如许的情况下,我会把这两个平台的语音识别都给大家介绍一下。

现在我们开始吧!!

这是百度语音识别的文档 http://yuyin.baidu.com/docs/asr/166 。这里是百度文档给出的一部分解释:

Android——百度语音识别_第1张图片

开发步骤:

第一步:

注册一个百度账号,这个我就不过多的说了。

第二步:

创建一个应用,设置相关内容和下载SDK,大体过程如下:

Android——百度语音识别_第2张图片

Android——百度语音识别_第3张图片

Android——百度语音识别_第4张图片

Android——百度语音识别_第5张图片

第三步:

创建一个Android工程,我这里是用的eclipse,如果使用Android studio 大体上是差不多的,我这里也不具体说了。

第四步:

下载SDK(链接http://yuyin.baidu.com/sdk)这里下载需要注意,如果你创建的应用太多,需要注意选择你需要的应用。

下载后解压文件内容如下:

Android——百度语音识别_第6张图片

这里是对下载的SDK的说明:

Android——百度语音识别_第7张图片

将开发包中的libs和res目录分别合并到工程目录的libs和res目录。如果你不是用百度语音识别的界面可以不导入res文件的内容,我这里就不使用界面。

第五步:

配置AndroidManifest.xml,AndroidManifest.xml配置主要内容为:增加权限,填写鉴权信息,注册语音服务,注册对话框。具体示例如下:

配置权限:

    
    
    
    
    
    
    
配置其他事项:
 	
        
        
        
        
        
        
        
 
  权限说明: 
  

Android——百度语音识别_第8张图片

这些东西可以在这里获取

Android——百度语音识别_第9张图片Android——百度语音识别_第10张图片

如果你使用百度语音识别的界面,需要配置下面的activity

         
            
                
                
            
        


接口的说明百度文档里面有具体说明(我感觉写的不如讯飞,链接http://yuyin.baidu.com/docs/asr/168)

最后一步

我这里直接上代码了。

package com.BDXCW;
import com.baidu.speech.VoiceRecognitionService;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.SpeechRecognizer;
/**
 * 语音识别,将语音转换为文字
 * @author 莫谈天下
 *
 */
public class MySpeechRecognizer {

	public static final String TAG = MySpeechRecognizer.class.getSimpleName();
	private SpeechRecognizer speechRecognizer;
	@SuppressWarnings("unused")
	private Context context;
	private SpeechRecognizerCallBack callBack;
	/**
	 * MySpeechRecognizer的构造方法
	 * @param context 上下文对象
	 */
	public MySpeechRecognizer(Context context)
	{
		this.context = context;
		// 创建识别器
        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context, new ComponentName(context, VoiceRecognitionService.class));
        // 注册监听器
        speechRecognizer.setRecognitionListener(new MyRecognitionListener());
	}
	/**
	 * 设置回调接口
	 * @param callBack 是SpeechRecognizerCallBack对象
	 */
	public void setCallBack(SpeechRecognizerCallBack callBack)
	{
		this.callBack = callBack;
	}
	/**
	 * 开始语音识别
	 */
	public void Start()
	{
		Intent intent = new Intent();
		speechRecognizer.startListening(intent);
	}
	/**
	 * 开始语音识别
	 * @param intent Inetnt对象,所有识别的参数都需要在intent中设置
	 */
	public void Start(Intent intent)
	{
		speechRecognizer.startListening(intent);
	}
	/**
	 * 停止录音,但是识别将继续
	 */
	public void Stop()
	{
		speechRecognizer.stopListening();
	}
	/**
	 * 取消本次识别,已有录音也将不再识别
	 */
	public void cancel()
	{
		speechRecognizer.cancel();
	}
	/**
	 * 销毁语音识别器,释放资源
	 */
	public void Destroy()
	{
		speechRecognizer.destroy();
	}
	
	 private class MyRecognitionListener implements RecognitionListener
	   {
		 /**
		  * 开始说话,当用户开始说话,会回调此方法。
		  */
		  @Override
		  public void onBeginningOfSpeech() {
			   
		  }
		  /**
		   * 音量变化,引擎将对每一帧语音回调一次该方法返回音量值。
		   */
		   public void onRmsChanged(float rmsdB) {
		    	
		   }
		   /**
		    * 获取原始语音,此方法会被回调多次,buffer是当前帧对应的PCM语音数据,拼接后可得到完整的录音数据。
		    */
		   public void onBufferReceived(byte[] buffer) {
		    	
		    }
		    /**
		     * 说话结束,当用户停止说话后,将会回调此方法。
		     */
		    public void onEndOfSpeech() {
		    	
		    }
		   /**
		    * 识别出错,识别出错,将会回调此方法,调用该方法之后将不再调用onResults方法。
		    * @param error 错误码
		    */
		    public void onError(int error) {
		    	
		    }
		    /**
		     * 识别最终结果,返回最终识别结果,将会回调此方法。
		     * @param results 识别结果
		     */
		    public void onResults(Bundle results) {
		       
		    	String text =  results.get("results_recognition").toString().replace("]", "").replace("[", "");
		    	callBack.getResult(text);
		    	
		    }
		    /**
		     * 识别临时结果,返回临时识别结果,将会回调此方法。
		     * @param partialResults 临时结果
		     */
		    public void onPartialResults(Bundle partialResults) {
		        
		    }
		    /**
		     * 识别事件返回,返回识别事件,将会回调此方法。
		     * @param eventType 事件类型
		     * @param params 参数
		     */
		    public void onEvent(int eventType, Bundle params) {
		        
		    }
		    /**
		     * 识别准备就绪,只有当此方法回调之后才能开始说话,否则会影响识别结果。
		     */
			@Override
			public void onReadyForSpeech(Bundle params) {
				
				
			} 
	   }
	 /**
	  * 识别结果回调接口
	  * @author Administrator
	  *
	  */
	 public interface SpeechRecognizerCallBack
	 {
		 /**
		  * 返回结果
		  * @param result String 结果
		  */
		 public void getResult(String result);
	 }
}


我这里是对百度语音醉了一个简单的封装,大家可以根据自己的具体需求修改。

百度语音识别就写到这里,转载希望标注出处,谢谢!

-----------------------------更新与2016年10月17日-----------------------------------------------------

这两天浏览了一下自己的这一篇博文,感觉里面少提了一些中要的东西,我这里补充一下。

百度语音识别中有一个方法如下:

void startListening(Intent recognizerIntent)
这个方法中的recognizerIntent 是一个intent对象,百度语音的参数就是通过这一个对象,向百度语音识别引擎传递参数。这里可以传递的参数有狠多,大家可以参照百度语音文档的具体说明,网址为:http://yuyin.baidu.com/docs/asr/169 。我这里给大家聚义个简单的例子,这个例子就是开启百度语义解析,代码如下:
 		Intent intent = new Intent();
		intent.putExtra("nlu", "enable");//开启语义理解
		intent.putExtra("prop", 10060);//这里是与地图相关的语义
		speechRecognizer.startListening(intent);



如果大家有什么问题,可以提出来,后期我会不断完善这篇博文,谢谢!!

 
 

你可能感兴趣的:(移动开发)