Android Studio 3.1.4 接入訊飛語(yǔ)音接口

注:本文最后更新時(shí)間:2018/08/26,測(cè)試環(huán)境切換為 macOS

測(cè)試環(huán)境

Android Studio 3.1.4
macOS 10.13.6
測(cè)試訊飛語(yǔ)音的 語(yǔ)音聽(tīng)寫(xiě)在線語(yǔ)音合成 功能萌抵,使用訊飛默認(rèn) UI祠够。

下載訊飛 SDK

去科大訊飛開(kāi)發(fā)平臺(tái)下載 相關(guān)的SDK怠益。
解壓后的文件目錄如下:

Android_xxx_xxx_xxxxxx
    |-- assets              // 訊飛語(yǔ)音的資源文件夾
    |-- doc                 // 開(kāi)發(fā)文檔說(shuō)明
    |-- libs                // 核心 SDK 文件
        |-- arm64-v8a       // 下面是幾個(gè)不同CPU架構(gòu)下的平臺(tái)兼容庫(kù)
            |-- libmsc.so
        |-- armeabi
        |-- ...
        |-- Msc.jar         // 訊飛開(kāi)發(fā)庫(kù)
        |-- Sunflower.jar   // 使用訊飛語(yǔ)音統(tǒng)計(jì)功能用到的庫(kù)
    |-- sample
        |-- SpeechDemo
        |-- ...
    |-- readme.txt
    |-- release.txt

導(dǎo)入訊飛 SDK

  • 使用 Android Studio 新建一個(gè) Android 工程摹量,為了方便勃痴,我在這里所有設(shè)置均為默認(rèn)季春。
新建 Android 工程步驟 1
新建 Android 工程步驟 2
新建 Android 工程步驟 3
新建 Android 工程步驟 4
  • 將工程視圖切換至 Project 結(jié)構(gòu)洗搂,然后將訊飛文檔中對(duì)應(yīng)的文件夾復(fù)制到 Android 中,如沒(méi)有相應(yīng)的文件夾則需要手動(dòng)新建载弄,具體如下:
訊飛文檔 Android 工程
/assets /app/src/main/assets/
/libs/ /app/libs

此時(shí)耘拇,查看 /app/build.gradle,確保會(huì)多出下面一行:

buildTypes {
    ...
}
// 下面這一行 需要手動(dòng)添加侦锯,以加載 .so 動(dòng)態(tài)庫(kù)及其他第三方庫(kù)
sourceSets {
     main {
         jniLibs.srcDirs = ["libs"]
     }
}

為使 /libs/xxx/libmsc.so 文件生效驼鞭,需要在 /gradle.properties 中加入下面一行(為什么?):

# 更新尺碰,新版 AS 貌似可以不加入這一行了挣棕。
android.useDeprecatedNdk = true
  • AndroidManifest.xml 中添加相關(guān)權(quán)限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!--讀取網(wǎng)絡(luò)信息狀態(tài) -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!--獲取當(dāng)前wifi狀態(tài) -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <!--允許程序改變網(wǎng)絡(luò)連接狀態(tài) -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <!--讀取手機(jī)信息權(quán)限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <application ...>
        ...
    </application>
    

測(cè)試訊飛 SDK

我們?cè)谥黜?yè)面中加入一個(gè) textView 和 button,點(diǎn)擊 button 則會(huì)開(kāi)始語(yǔ)音聽(tīng)寫(xiě)亲桥,同時(shí)會(huì)將聽(tīng)寫(xiě)結(jié)果顯示到 textView 中洛心,非常簡(jiǎn)單。
activity_main.xml 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        tools:layout_constraintTop_creator="1"
        tools:layout_constraintRight_creator="1"
        tools:layout_constraintBottom_creator="1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_constraintLeft_creator="1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_constraintTop_creator="1"
        tools:layout_constraintRight_creator="1"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toBottomOf="@+id/textView"
        tools:layout_constraintLeft_creator="1"
        app:layout_constraintLeft_toLeftOf="parent" />


</android.support.constraint.ConstraintLayout>

MainActivity.java 代碼如下:

package com.example.cn_pa.myapplication;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

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

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

public class MainActivity extends AppCompatActivity {

    private SpeechRecognizer mIat;
    private RecognizerDialog mIatDialog;
    private RecognizerDialogListener mRListener;

    private Button button;
    private TextView tv;
    private String result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID +"=XXXXXX");  // 這里要替換成自己申請(qǐng)的 AppID

        mRListener = new RecognizerDialogListener() {
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                String text = parseIatResult(results.getResultString());
                result += text;
                tv.setText(result);
                if (isLast) {

                    result = "";
                }
            }

            @Override
            public void onError(SpeechError speechError) {

            }
        };
        mIatDialog = new RecognizerDialog(MainActivity.this, null);
        mIatDialog.setListener(mRListener);

        button = (Button)findViewById(R.id.button);
        tv = (TextView)findViewById(R.id.textView);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                setIatParam("zph");
                mIatDialog.show();
            }
        });
    }

    private void setIatParam(String filename) {
        // 清空參數(shù)
        mIatDialog.setParameter(SpeechConstant.PARAMS, null);

        // 設(shè)置聽(tīng)寫(xiě)引擎
        mIatDialog.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);

        // 設(shè)置返回結(jié)果格式
        mIatDialog.setParameter(SpeechConstant.RESULT_TYPE, "json");

        // 設(shè)置語(yǔ)言
        mIatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        // 設(shè)置語(yǔ)言區(qū)域
        mIatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");

        // 設(shè)置語(yǔ)音前端點(diǎn):靜音超時(shí)時(shí)間题篷,即用戶多長(zhǎng)時(shí)間不說(shuō)話則當(dāng)做超時(shí)處理
        mIatDialog.setParameter(SpeechConstant.VAD_BOS, "4000");

        // 設(shè)置語(yǔ)音后端點(diǎn):后端點(diǎn)靜音檢測(cè)時(shí)間词身,即用戶停止說(shuō)話多長(zhǎng)時(shí)間內(nèi)即認(rèn)為不再輸入, 自動(dòng)停止錄音
        mIatDialog.setParameter(SpeechConstant.VAD_EOS, "2000");

        // 設(shè)置標(biāo)點(diǎn)符號(hào),設(shè)置為"0"返回結(jié)果無(wú)標(biāo)點(diǎn),設(shè)置為"1"返回結(jié)果有標(biāo)點(diǎn)
        mIatDialog.setParameter(SpeechConstant.ASR_PTT, "1");

        // 設(shè)置音頻保存路徑番枚,保存音頻格式支持pcm法严、wav,設(shè)置路徑為sd卡請(qǐng)注意WRITE_EXTERNAL_STORAGE權(quán)限
        // 注:AUDIO_FORMAT參數(shù)語(yǔ)記需要更新版本才能生效
        mIatDialog.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
        mIatDialog.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/MyApplication/" + filename + ".wav");
    }

    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++) {
                // 轉(zhuǎn)寫(xiě)結(jié)果詞葫笼,默認(rèn)使用第一個(gè)結(jié)果
                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();
    }
}

以上代碼很粗糙深啤,但完成了基本功能演示, 希望對(duì)你有所幫助 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末路星,一起剝皮案震驚了整個(gè)濱河市溯街,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖呈昔,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挥等,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡堤尾,警方通過(guò)查閱死者的電腦和手機(jī)肝劲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哀峻,“玉大人涡相,你說(shuō)我怎么就攤上這事∈s埃” “怎么了催蝗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)育特。 經(jīng)常有香客問(wèn)我丙号,道長(zhǎng),這世上最難降的妖魔是什么缰冤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任犬缨,我火速辦了婚禮,結(jié)果婚禮上棉浸,老公的妹妹穿的比我還像新娘怀薛。我一直安慰自己,他們只是感情好迷郑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布枝恋。 她就那樣靜靜地躺著,像睡著了一般嗡害。 火紅的嫁衣襯著肌膚如雪焚碌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天霸妹,我揣著相機(jī)與錄音十电,去河邊找鬼。 笑死叹螟,一個(gè)胖子當(dāng)著我的面吹牛鹃骂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罢绽,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偎漫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了有缆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棚壁,沒(méi)想到半個(gè)月后杯矩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袖外,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年史隆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曼验。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泌射,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鬓照,到底是詐尸還是另有隱情熔酷,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布豺裆,位于F島的核電站拒秘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏臭猜。R本人自食惡果不足惜躺酒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蔑歌。 院中可真熱鬧羹应,春花似錦、人聲如沸次屠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)帅矗。三九已至偎肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浑此,已是汗流浹背累颂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凛俱,地道東北人紊馏。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蒲犬,于是被迫代替她去往敵國(guó)和親朱监。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容