騰訊ASR語音識(shí)別接入

騰訊云語音識(shí)別(Automatic Speech Recognition戏阅,ASR)是將語音轉(zhuǎn)化成文字的PaaS產(chǎn)品橙凳,為企業(yè)提供精準(zhǔn)而極具性價(jià)比的識(shí)別服務(wù)。被微信彭羹、王者榮耀黄伊、騰訊視頻等大量業(yè)務(wù)使用,適用于錄音質(zhì)檢派殷、會(huì)議實(shí)時(shí)轉(zhuǎn)寫还最、語音輸入法等多個(gè)場(chǎng)景。

官方接入文檔地址:

https://cloud.tencent.com/document/product/1093/35722

實(shí)時(shí)語音識(shí)別 Android SDK 及 Demo 下載地址:接入 SDK 下載毡惜。

接入步驟

1. 下載好aar包添加依賴
implementation(name: 'asr-realtime-release', ext: 'aar')
2. 在 AndroidManifest.xml 添加如下權(quán)限:
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
3. 初始化ASR功能拓轻,只需要初始化一次
var aaiClient: AAIClient? = null
    fun initAsr() {
        // okhttp全局配置
        ClientConfiguration.setAudioRecognizeConnectTimeout(3000)
        ClientConfiguration.setAudioRecognizeWriteTimeout(5000)

        val appid: Int = ASRConstent.APPID
        val projectId = 0 //此參數(shù)固定為0
        val secretId = ASRConstent.SECRETID
        val secretKey = ASRConstent.SECRETKEY

        try {
            /**直接鑒權(quán) */
            // 1、簽名鑒權(quán)類经伙,sdk中給出了一個(gè)本地的鑒權(quán)類扶叉,您也可以自行實(shí)現(xiàn)CredentialProvider接口,在您的服務(wù)器上實(shí)現(xiàn)鑒權(quán)簽名
            aaiClient = AAIClient(getApplication(),
                appid,
                projectId,
                secretId,
                LocalCredentialProvider(secretKey)
            )
        } catch (e: ClientException) {
            e.printStackTrace()
        }
    }
4. 開始識(shí)別語音
    fun startAsr() {
        try {
            // 5帕膜、啟動(dòng)語音識(shí)別
            viewModelScope.launch {
                aaiClient?.startAudioRecognize(audioRecognizeRequest,
                    audioRecognizeResultlistener,
                    recognizeStateListener,
                    audioRecognizeConfiguration)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

創(chuàng)建開始語音識(shí)別的各個(gè)listener

    // 初始化語音識(shí)別請(qǐng)求枣氧。
    val audioRecognizeRequest: AudioRecognizeRequest =
            builder
            .pcmAudioDataSource(getRecordDataSource())
            .setEngineModelType("16k_zh") // 設(shè)置引擎參數(shù)("16k_zh" 通用引擎,支持中文普通話+英文,"16k_en"英文引擎)
            .setFilterDirty(0) // 0 :默認(rèn)狀態(tài) 不過濾臟話 1:過濾臟話
            .setFilterModal(2) // 0 :默認(rèn)狀態(tài) 不過濾語氣詞  1:過濾部分語氣詞 2:嚴(yán)格過濾
            .setFilterPunc(1) // 0 :默認(rèn)狀態(tài) 不過濾句末的句號(hào) 1:濾句末的句號(hào)
            .setConvert_num_mode(1) //1:默認(rèn)狀態(tài) 根據(jù)場(chǎng)景智能轉(zhuǎn)換為阿拉伯?dāng)?shù)字泳叠;0:全部轉(zhuǎn)為中文數(shù)字作瞄。
            .setNeedvad(1) //0:關(guān)閉 vad,1:默認(rèn)狀態(tài) 開啟 vad危纫。
            .setWordInfo(1) //0:關(guān)閉 vad宗挥,1:默認(rèn)狀態(tài) 開啟 vad。
//          .setNoiseThreshold(0) //是否嚴(yán)格過濾噪音 0不嚴(yán)格种蝶, 1 嚴(yán)格
            .build()

        // 初始化語音識(shí)別結(jié)果監(jiān)聽器契耿。
    val audioRecognizeResultlistener: AudioRecognizeResultListener =
        object : AudioRecognizeResultListener {

            override fun onSliceSuccess(request: AudioRecognizeRequest?,
                                        result: AudioRecognizeResult?,
                                        seq: Int) {
                //返回分片的識(shí)別結(jié)果,此為中間態(tài)結(jié)果螃征,會(huì)被持續(xù)修正搪桂, //在這里實(shí)時(shí)獲取識(shí)別的結(jié)果
                result?.let {
                    
                }
            }

            override fun onSegmentSuccess(request: AudioRecognizeRequest?,
                                          result: AudioRecognizeResult?,
                                          seq: Int) {
                //返回語音流的識(shí)別結(jié)果,此為穩(wěn)定態(tài)結(jié)果,可做為識(shí)別結(jié)果用與業(yè)務(wù)
             //在這里獲取一句話識(shí)別的最終結(jié)果
            }

            override fun onSuccess(request: AudioRecognizeRequest?, result: String?) {}

            override fun onFailure(request: AudioRecognizeRequest?,
                                   clientException: ClientException?,
                                   serverException: ServerException?,
                                   response: String?) {
                     // 識(shí)別失敗
            }
        }

    //自定義識(shí)別配置
    val audioRecognizeConfiguration: AudioRecognizeConfiguration =
        AudioRecognizeConfiguration.Builder() //分片默認(rèn)40ms踢械,可設(shè)置40-5000,必須為20的整倍數(shù)酗电,
            //分片默認(rèn)40ms,可設(shè)置40-5000,必須為20的整倍數(shù)内列,如果不是撵术,sdk內(nèi)將自動(dòng)調(diào)整為20的整倍數(shù),例如77將被調(diào)整為60话瞧,如果您不了解此參數(shù)不建議更改
            //.sliceTime(40)
            // 是否使能靜音檢測(cè)嫩与,
            .setSilentDetectTimeOut(false)
            //觸發(fā)靜音超時(shí)后是否停止識(shí)別,默認(rèn)為true:停止交排,setSilentDetectTimeOut為true時(shí)參數(shù)有效
            .setSilentDetectTimeOutAutoStop(true)
            .audioFlowSilenceTimeOut(2000)
            .minVolumeCallbackTime(100)
            .isCompress(true).build()
5. 結(jié)束語音識(shí)別
    fun stopAsr() {
        viewModelScope.launch {
            if (aaiClient != null) {
                //停止語音識(shí)別划滋,等待最終識(shí)別結(jié)果
                aaiClient?.stopAudioRecognize()
            }
        }
    }
6. 更多設(shè)置

6.1 設(shè)置狀態(tài)監(jiān)聽器
AudioRecognizeStateListener 可以用來監(jiān)聽語音識(shí)別的狀態(tài):


6.2 回聲消除

/**
 * 注: 部分android機(jī)型可以通過該方式解決回音消除失效的問題
 * https://blog.csdn.net/wyw0000/article/details/125195997
 */
// 1. 設(shè)置音頻模式為AudioManager.MODE_IN_COMMUNICATION可以起到回音消除的作用
AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);


// 2. 音頻源使用MediaRecorder.AudioSource.VOICE_COMMUNICATION可以起到回音消除的作用
int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
AudioRecord audioRecord = new AudioRecord(audioSource, sampleRate, channel, audioFormat, bufferSize);
/**
 * 注: 以下兩個(gè)能力(AcousticEchoCanceler和NoiseSuppressor)和手機(jī)硬件能力相關(guān),有些機(jī)型(比如小米11)即使isAvailable()==true埃篓,回音消除也不生效
 */
// AcousticEchoCanceler回音消除
if (AcousticEchoCanceler.isAvailable()) {
    Log.d(TAG, "AcousticEchoCanceler isAvailable.");
    AcousticEchoCanceler acousticEchoCanceler = AcousticEchoCanceler
            .create(audioRecord.getAudioSessionId());
    int resultCode = acousticEchoCanceler.setEnabled(true);
    if (AudioEffect.SUCCESS == resultCode) {
        Log.d(TAG, "AcousticEchoCanceler AudioEffect SUCCESS");
    }
}


// NoiseSuppressor噪音抑制
if (NoiseSuppressor.isAvailable()) {
    Log.d(TAG, "NoiseSuppressor isAvailable.");
    NoiseSuppressor noiseSuppressor = NoiseSuppressor
            .create(audioRecord.getAudioSessionId());
    int resultCode = noiseSuppressor.setEnabled(true);
    if (AudioEffect.SUCCESS == resultCode) {
        Log.d(TAG, "NoiseSuppressor AudioEffect SUCCESS");
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末处坪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子架专,更是在濱河造成了極大的恐慌稻薇,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胶征,死亡現(xiàn)場(chǎng)離奇詭異塞椎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睛低,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門案狠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钱雷,你說我怎么就攤上這事骂铁。” “怎么了罩抗?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵拉庵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我套蒂,道長(zhǎng)钞支,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任操刀,我火速辦了婚禮烁挟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骨坑。我一直安慰自己撼嗓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著且警,像睡著了一般粉捻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斑芜,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天杀迹,我揣著相機(jī)與錄音,去河邊找鬼押搪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浅碾,可吹牛的內(nèi)容都是我干的大州。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼垂谢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼厦画!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滥朱,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤根暑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徙邻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體排嫌,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年缰犁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淳地。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帅容,死狀恐怖颇象,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情并徘,我是刑警寧澤遣钳,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站麦乞,受9級(jí)特大地震影響蕴茴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姐直,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一荐开、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧简肴,春花似錦晃听、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佣渴。三九已至,卻和暖如春初斑,著一層夾襖步出監(jiān)牢的瞬間辛润,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工见秤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砂竖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓鹃答,卻偏偏與公主長(zhǎng)得像乎澄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子测摔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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