一,前言
近期新版本的需求中添加了語音轉文字的功能 ,經過綜合的對比我還是選擇了訊飛,下面記錄一下大概的步驟吧
二,去訊飛官網下載語音聽寫sdk
https://www.xfyun.cn/services/voicedictation
三,下載完打開是這樣的
我們需要把jar 和v7、v8包粘到我們項目對應的位置
並在app的build.radle 中 android{}裏添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
四,檢查添加權限
<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" /> <!-- 外存儲寫權限,構建語法需要用到此權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 外存儲讀權限,構建語法需要用到此權限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 配置權限,用來記錄應用配置信息 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
五,佈局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<RelativeLayout
android:id="@+id/Relat_ms"
android:layout_width="match_parent"
android:layout_height="167dp"
android:layout_below="@+id/text_title"
android:layout_marginTop="13dp"
android:layout_marginLeft="13dp"
android:background="#F6F5F5"
android:focusable="true"
android:focusableInTouchMode="true" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/toText">
<EditText
android:id="@+id/result_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
android:layout_marginTop="12dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:textColor="#333333"
android:text=""
android:gravity="top"
android:textSize="14sp"
android:hint="說點什麼吧~"
/>
</RelativeLayout>
<TextView
android:id="@+id/toText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@mipmap/yuyin"
android:text=" 按住說話 語音轉文字"
android:textSize="13sp"
android:textColor="#0B8FFF"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="8dp"
android:gravity="center"
android:layout_marginBottom="11dp"/>
</RelativeLayout>
</LinearLayout>
六,代碼
public class MainActivity extends AppCompatActivity {
private TextView toText;
private EditText resultText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toText = findViewById(R.id.toText);
resultText = findViewById(R.id.result_text);
SpeechUtility.createUtility(this, SpeechConstant.APPID + "=你在訊飛官網獲取的AppID");
//長按
toText.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
getPermission();
return true;
}
});
}
private void getPermission() {
//申請動態權限
new RxPermissions((Activity) this)
.requestEachCombined(Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(new Consumer<com.tbruyelle.rxpermissions2.Permission>() {
@Override
public void accept(com.tbruyelle.rxpermissions2.Permission permission) throws Exception {
if (permission.granted) {
btnVoice();
//權限已經都通過了,可以將程序繼續打開了
} else if (permission.shouldShowRequestPermissionRationale) {
Log.e("onFail: ", "權限被拒絕");
} else {
Log.e("onFail: ", "權限被始終拒絕");
}
}
});
}
//第三方訊飛語音轉文字 賦值
private void btnVoice() {
RecognizerDialog dialog = new RecognizerDialog(this, null);
dialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
dialog.setParameter(SpeechConstant.ACCENT, "mandarin");
dialog.setListener(new RecognizerDialogListener() {
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
printResult(recognizerResult);
}
@Override
public void onError(SpeechError speechError) {
}
});
dialog.show();
Toast.makeText(this,"請開始說話",Toast.LENGTH_LONG).show();
}
//回調結果:
private void printResult(RecognizerResult results) {
String text = parseIatResult(results.getResultString());
// 自動填寫地址
resultText.append(text);
}
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"));
}
} catch (Exception e) {
e.printStackTrace();
}
return ret.toString();
}
}