应用中添加讯飞语音功能

现在有很多应用都会有需求加入如果输入功能,在这里我就主要介绍讯飞语音

首先 :使用讯飞语音功能要到讯飞开放平台申请应用的app_id   http://open.voicecloud.cn/index.php/default/index

在我的语音云里点击创建先应用

应用中添加讯飞语音功能_第1张图片

创建完成后就可以得到应用的app_id

应用中添加讯飞语音功能_第2张图片

把app_id添加到应用中

 <string name="app_id">54575cec</string>
在讯飞语音中下载应用的sdk文件,这里我们只需要使用

应用中添加讯飞语音功能_第3张图片

应用中添加讯飞语音功能_第4张图片

把这五个添加到应用的libs的文件中


然后在应用中Build Path中添加Msc.jar

应用中添加讯飞语音功能_第5张图片

现在我们就可以在代码中添加语音功能的代码了

首先我们先自定义一个activity类

public abstract class PrentActicity extends Activity {

	protected Context context;

	@SuppressWarnings("static-access")
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(LayoutId());
		this.context = this;
		
		SetContentView();
	}

	protected abstract int LayoutId();

	protected abstract void SetContentView();
然后继承这个类

public class PhoneManager extends PrentActicity {

	@Override
	protected int LayoutId() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	protected void SetContentView() {
		// TODO Auto-generated method stub
		
	}
}

在layoutid()中添加布局文件

应用中添加讯飞语音功能_第6张图片

这里xml文件我只添加一个edittext和一个button

<LinearLayout 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:orientation="vertical" >

    <EditText
        android:id="@+id/ed"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ok" />

</LinearLayout>


做完这样,我们就可以在我们之前定义的activity类中实现代码了

package com.example.demo;

import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Toast;

@SuppressLint("SdCardPath")
public abstract class PrentActicity extends Activity {
	// 语音听写对象
	private SpeechRecognizer mIat;
	// 语音听写UI
	private RecognizerDialog dialog;
	// 听写结果内容
	private EditText editText;
	private Toast toast;
	int ret = 0;
	private SharedPreferences sharedPreferences;
	protected Context context;

	@SuppressWarnings("static-access")
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(LayoutId());
		this.context = this;
		// 初始化识别对象
		mIat = SpeechRecognizer.createRecognizer(context, mInitListener);
		// 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer
		dialog = new RecognizerDialog(context, mInitListener);
		sharedPreferences = getSharedPreferences("com.example.demo",Activity.MODE_PRIVATE);
		toast = toast.makeText(context, "", toast.LENGTH_SHORT);
		SetContentView();
	}

	protected abstract int LayoutId();

	protected abstract void SetContentView();
	/**
	 * 语音界面,只需要传入EditText即可showSpeechDialog(EditText);
	 */
	public void showSpeechDialog(EditText edit) 
	{
		this.editText = edit;
		// 设置参数
		setParam();
		boolean isShowDialog = sharedPreferences.getBoolean("iat_show", true);
		if (isShowDialog) 
		{
			// 显示听写对话框
			dialog.setListener(recognizerDialogListener);
			dialog.show();
			showTip("开始说话");
		} else 
		{
			showTip("听写失败");
		}

	}

	private InitListener mInitListener = new InitListener() 
	{
		@Override
		public void onInit(int arg0) {
			if (arg0 != ErrorCode.SUCCESS)
			{
				showTip("初始化失败,错误码:" + arg0);
			} else if (arg0 == 21001)
			{
				showTip("缺少讯飞组件,请下载讯飞语音+");
				dialog.dismiss();
			}

		}
	};

	private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() 
	{

		@Override
		public void onResult(RecognizerResult arg0, boolean arg1) 
		{
			String text = JsonParser.parseIatResult(arg0.getResultString());
			editText.append(text);
			editText.setSelection(editText.length());
		}

		@Override
		public void onError(SpeechError arg0) 
		{
			showTip(arg0.getPlainDescription(true));
		}
	};


	private void showTip(final String str)
	{
		runOnUiThread(new Runnable() 
		{
			@Override
			public void run() 
			{
				toast.setText(str);
				toast.show();
			}
		});
	}

	public void setParam() 
	{
		String lag = sharedPreferences.getString("iat_language_preference",
				"mandarin");
		if (lag.equals("en_us")) 
		{
			// 设置语言
			mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
		} else 
		{
			// 设置语言
			mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
			// 设置语言区域
			mIat.setParameter(SpeechConstant.ACCENT, lag);
		}
		// 设置语音前端点
		mIat.setParameter(SpeechConstant.VAD_BOS,sharedPreferences.getString("iat_vadbos_preference", "5000"));
		// 设置语音后端点
		mIat.setParameter(SpeechConstant.VAD_EOS,sharedPreferences.getString("iat_vadeos_preference", "1800"));
		// 设置标点符号
		mIat.setParameter(SpeechConstant.ASR_PTT,sharedPreferences.getString("iat_punc_preference", "1"));
		// 设置音频保存路径
		mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,"/sdcard/cryl/wavaudio.pcm");
	}

	@Override
	protected void onDestroy() 
	{
		super.onDestroy();
		// 退出时释放连接
		mIat.cancel();
		mIat.destroy();
	}

}
这样就可以在继承了该类的activity中使用了

package com.example.demo.ac;

import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

import com.example.demo.PrentActicity;
import com.example.demo.R;

public class PhoneManager extends PrentActicity {

	EditText editText;
	Context context;

	@Override
	protected void SetContentView() {
		context = this;
		editText = (EditText) findViewById(R.id.ed);
		Button button = (Button) findViewById(R.id.btn);
		button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				showSpeechDialog(editText);
			}
		});
	}

	@Override
	protected int LayoutId() {
		return R.layout.phone_manager;
	}

}

由于讯飞语音使用的时候是联网操作,所以就需要进行数字解析

package com.example.demo;


import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

/**
 * Json结果解析类
 */
public class JsonParser {

	public static String parseIatResult(String json) {
		StringBuffer ret = new StringBuffer();
		try {
			JSONTokener tokener = new JSONTokener(json);
			JSONObject joResult = new JSONObject(tokener);

			JSONArray words = joResult.getJSONArray("ws");
			for (int i = 0; i < words.length(); i++) {
				// 转写结果词,默认使用第一个结果
				JSONArray items = words.getJSONObject(i).getJSONArray("cw");
				JSONObject obj = items.getJSONObject(0);
				ret.append(obj.getString("w"));
//				如果需要多候选结果,解析数组其他字段
//				for(int j = 0; j < items.length(); j++)
//				{
//					JSONObject obj = items.getJSONObject(j);
//					ret.append(obj.getString("w"));
//				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return ret.toString();
	}
	
	public static String parseGrammarResult(String json) {
		StringBuffer ret = new StringBuffer();
		try {
			JSONTokener tokener = new JSONTokener(json);
			JSONObject joResult = new JSONObject(tokener);

			JSONArray words = joResult.getJSONArray("ws");
			for (int i = 0; i < words.length(); i++) {
				JSONArray items = words.getJSONObject(i).getJSONArray("cw");
				for(int j = 0; j < items.length(); j++)
				{
					JSONObject obj = items.getJSONObject(j);
					if(obj.getString("w").contains("nomatch"))
					{
						ret.append("没有匹配结果.");
						return ret.toString();
					}
					ret.append("【结果】" + obj.getString("w"));
					ret.append("【置信度】" + obj.getInt("sc"));
					ret.append("\n");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			ret.append("没有匹配结果.");
		} 
		return ret.toString();
	}
}


使用语音输入时要application中添加该代码

package com.example.demo;

import com.iflytek.cloud.SpeechUtility;

public class Application extends android.app.Application{
	@Override
	public void onCreate() {
		SpeechUtility.createUtility(Application.this, "appid="+getString(R.string.app_id));
		super.onCreate();
	}
}

应用中添加讯飞语音功能_第7张图片

这里提醒一下,不要忘记添加相关的权限

<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.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这里提供一个已经实现了语音功能的包 

下载地址  http://download.csdn.net/detail/u013255127/8118381

点击phonemanager按钮,就可以使用了



你可能感兴趣的:(android,讯飞,讯飞语音,语音云)