Android訊飛實現語音轉文字功能

一,前言

近期新版本的需求中添加了語音轉文字的功能 ,經過綜合的對比我還是選擇了訊飛,下面記錄一下大概的步驟吧

二,去訊飛官網下載語音聽寫sdk

https://www.xfyun.cn/services/voicedictation
在這裏插入圖片描述

三,下載完打開是這樣的

在這裏插入圖片描述

我們需要把jar 和v7、v8包粘到我們項目對應的位置

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200518154440384.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNTg5OTkx,size_16,color_FFFFFF,t_70
並在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();
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章