现在有很多应用都会有需求加入如果输入功能,在这里我就主要介绍讯飞语音
首先 :使用讯飞语音功能要到讯飞开放平台申请应用的app_id http://open.voicecloud.cn/index.php/default/index
在我的语音云里点击创建先应用
创建完成后就可以得到应用的app_id
把app_id添加到应用中
<string name="app_id">54575cec</string>在讯飞语音中下载应用的sdk文件,这里我们只需要使用
把这五个添加到应用的libs的文件中
然后在应用中Build Path中添加Msc.jar
现在我们就可以在代码中添加语音功能的代码了
首先我们先自定义一个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 } }
这里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>
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(); } }
这里提醒一下,不要忘记添加相关的权限
<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按钮,就可以使用了