 
			(1) 概念解釋
實時語音翻譯:可實現對連續音頻流的實時識別,實時識別和翻譯語音輸入的內容,轉換成文本信息并返回對應文字流。
(2) 說明
Hi,您好,歡迎使用有道智云實時語音翻譯 Android SDK。如果您想快速體驗服務,建議您前往實時語音翻譯體驗中心 或者在體驗中心右下側找到小程序二維碼,掃描進行體驗。
本文檔主要針對需要集成實時語音翻譯服務 Android SDK 的開發工程師,詳細描述有道智云實時語音能力及集成過程。
如果您有與我們商務合作的需求,可以通過一下方式聯系我們:
商務郵箱: AIcloud_Business@corp.youdao.com
如果您對文檔內容有任何疑問,可以通過以下幾種方式聯系我們:
客服 QQ:1906538062
智云翻譯技術交流 QQ 1 群: 652880659
智云翻譯技術交流 QQ 2 群: 669384425
智云翻譯技術交流 QQ 3 群: 807539209
智云翻譯技術交流 QQ 4 群: 936752411
聯系郵箱: zhiyun@corp.youdao.com
溫馨提示: 本文檔主要針對開發人員,接入測試前需要在后臺創建 Android 應用,并綁定實時語音翻譯實例;如果您還沒有,請按照新手指南 操作。 平臺向每個賬戶贈送 50 元的體驗金,供用戶集成前測試所用,具體資費規則詳見 實時語音翻譯服務報價 。
###功能介紹
有道智云實時語音翻譯 SDK 是有道智云開放平臺提供的云服務之一,是有道在線實時語音翻譯接口的一種實現,支持實時語音翻譯和整句翻譯。
###兼容性
支持設備:運行了 Android 4.0.3 及以上系統的 Android 設備
開始集成 SDK 之前開發者需要登錄有道智云平臺 , 創建應用獲取應用 ID(或者通過運營人員獲取應用 ID),以便使用實時語音翻譯。
1. SDK 包導入
請將 ydasr-release.aar 拷貝到 libs 目錄下,并將以下代碼添加到 app 的 build.gradle 中:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
    ...
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
dependencies {
    ...
    implementation "android.arch.lifecycle:extensions:$lifecycleVersion"
    implementation "android.arch.lifecycle:common-java8:$lifecycleVersion"
    implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
    implementation "com.google.code.gson:gson:$gsonVersion"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    implementation (name:'ydasr-release', ext:'aar')
    kapt "android.arch.lifecycle:compiler:$lifecycleVersion"
}
buildscript {
    ext {
        // App dependencies
        gsonVersion = '2.8.5'
        kotlinVersion = '1.3.0'
        lifecycleVersion = '1.1.1'
        okHttpVersion = '3.11.0'
    }
    dependencies {
        ...
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
    }
}
2.AndroidManifest 配置
添加權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<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" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.BLUETOOTH" />
其中 RECORD_AUDIO 和 WRITE_EXTERNAL_STORAGE 權限需要動態申請
3. 代碼混淆配置
代碼混淆文件 proguard-project.txt,添加如下內容
# Gson
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
#okhttp3
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
#lifecycle
-keep public class android.arch.lifecycle.** {
    public protected *;
}
-keepclassmembers class ** {
    @android.arch.lifecycle.OnLifecycleEvent public *;
}
#kotlin
-dontwarn kotlin.**
#AsrSdk
-keep class com.youdao.ydasr.** { *; }
-keep interface com.youdao.ydasr.** { *; }
-keep class com.youdao.audio.** { *; }
-keep interface com.youdao.audio.** { *; }
// 創建asr返回接口,如果不想實現所有接口,可以使用實現 OptionalAsrListener
private AsrListener mAsrListener = new AsrListener() {
    // 開始識別回調
    @Override
    public void onAsrStart() {}
    // 重連后再次連接成功回調
    @Override
    public void onAsrRestart() {}
    // 結束識別回調
    @Override
    public void onAsrStop() {}
    // 正在重連提示
    @Override
    public void onAsrReconnecting() {}
    // 錯誤回調
    @Override
    public void onAsrError(@NotNull AsrResultCode error) {
    // ASR結果回調 識別結果:result.getResult().getContext()
    // 翻譯結果:result.getResult().getTranContent()
    @Override
    public void onAsrNext(@NotNull AsrResult result, boolean isPartial) {}
    // 音量變化回調
    @Override
    public void onAsrVolumeChange(float volume) {}
    // 后端點靜音回調
    @Override
    public void onAsrSilentEnd() {}
    // 前端點靜音回調
    @Override
    public void onAsrSilentStart() {}
    // 連接上藍牙麥克風提示
    @Override
    public void onBluetoothAudioConnected() {}
    // 藍牙麥克風斷開提示
    @Override
    public void onBluetoothAudioDisconnected() {}
};
// 在onCreate中調用,創建AsrManager,并注冊生命周期觀察
asrParams = new ASRParams.Builder()
        .transPattern(transPattern) //翻譯模式 支持實時(stream)和整句(sentence)翻譯
        .timeoutStart(5000L)
        .timeoutEnd(10000L)
        .sentenceTimeout(3000L)
        .connectTimeout(10000L)
        .isWaitServerDisconnect(true)
        .build();
mAsrManager = AsrManager.getInstance(this, "your appKey", asrParams, mAsrListener);
getLifecycle().addObserver(mAsrManager);
//設置是否添加頭文件
mAsrManager.addWavHead = true;
//設置源語言和目標語言 FROM源語言,TO目標語言,當前已支持多達80余種語言的互譯
mAsrManager.setASRLanguage(from, to);
//如果是本地已經錄制好的文件不需要加頭,其余情況需要添加頭文件
mAsrManager.addWavHead = true;
// 開始連接(注:先連接,后插入數據流)
mAsrManager.startConnect();
// 停止識別
mAsrManager.stop();
// 數據實時翻譯
mAsrManager.insertAudioBytes(bytes);
注:音頻目前僅支持 16k 采樣率,通過手機錄音獲取的音頻需要添加頭文件,本地文件不需要頭文件
針對 support library 26.1.0 以下,請使用這個版本去除 lifecycle 依賴版本
同時需要去除 lifecycle 依賴:
dependencies {
    ...
    // implementation "android.arch.lifecycle:extensions:$lifecycleVersion"
    // implementation "android.arch.lifecycle:common-java8:$lifecycleVersion"
    implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
    implementation "com.google.code.gson:gson:$gsonVersion"
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
    // implementation (name:'ydaudiosdk-release', ext:'aar')
    implementation (name:'ydasrsdk-release', ext:'aar')
    // kapt "android.arch.lifecycle:compiler:$lifecycleVersion"
}
并在調用過程中去除
// getLifecycle().addObserver(mAsrManager);
并添加:
@Override
protected void onDestroy() {
    mAsrManager.destroy();
    super.onDestroy();
}
| 參數 | 含義 | 說明 | 
|---|---|---|
| bg | 分句開始時間 | 單位毫秒/ms | 
| ed | 分句結束時間 | 單位毫秒/ms | 
| context | 識別結果 | |
| tranContent | 翻譯結果 | |
| partial | 是否是中間結果 | true:中間結果;false:完整句子 | 
| segId | 分句 id | 從 0 開始遞增 | 
| 代碼 | 語言 | 
|---|---|
| zh-CHS | 簡體中文 | 
| en | 通用英文 | 
| enzh | 中英混合 | 
| ar-IL | 阿拉伯語(以色列) | 
| ar-JO | 阿拉伯語(約旦) | 
| ar-AE | 阿拉伯語(阿拉伯聯合酋長國) | 
| ar-BH | 阿拉伯語(巴林) | 
| ar-DZ | 阿拉伯語(阿爾及利亞) | 
| ar-SA | 阿拉伯語(沙特阿拉伯) | 
| ar-IQ | 阿拉伯語(伊拉克) | 
| ar-KW | 阿拉伯語(科威特) | 
| ar-MA | 阿拉伯語(摩洛哥) | 
| ar-TN | 阿拉伯語(突尼斯) | 
| ar-OM | 阿拉伯語(阿曼) | 
| ar-PS | 阿拉伯語(巴勒斯坦國) | 
| ar-QA | 阿拉伯語(卡塔爾) | 
| ar-LB | 阿拉伯語(黎巴嫩) | 
| ar-EG | 阿拉伯語(埃及) | 
| pl | 波蘭語(波蘭) | 
| da | 丹麥語(丹麥) | 
| de | 德語(德國) | 
| ru | 俄語 | 
| fr | 法語(法國) | 
| fr-CA | 法語(加拿大) | 
| fi | 芬蘭語(芬蘭) | 
| ko | 韓語(韓國) | 
| nl | 荷蘭語(荷蘭) | 
| cs | 捷克語(捷克共和國) | 
| hr | 克羅地亞語(克羅地亞) | 
| lv | 拉脫維亞語(拉脫維亞) | 
| ro | 羅馬尼亞語(羅馬尼亞) | 
| ms | 馬來語(馬來西亞) | 
| pt-BRA | 葡萄牙語(巴西) | 
| pt | 葡萄牙語(葡萄牙) | 
| ja | 日語(日本) | 
| sv | 瑞典語(瑞典) | 
| te | 泰盧固語(印度) | 
| ta | 泰米爾語(印度) | 
| ta-SG | 泰米爾語(新加坡) | 
| ta-LK | 泰米爾語(斯里蘭卡) | 
| ta-MY | 泰米爾語(馬來西亞) | 
| th | 泰語(泰國) | 
| tr | 土耳其語(土耳其) | 
| es | 西班牙語(西班牙) | 
| es-AR | 西班牙語(阿根廷) | 
| es-BO | 西班牙語(玻利維亞) | 
| es-CL | 西班牙語(智利) | 
| es-COL | 西班牙語(哥倫比亞) | 
| es-CR | 西班牙語(哥斯達黎加) | 
| es-EC | 西班牙語(厄瓜多爾) | 
| es-SV | 西班牙語(薩爾瓦多) | 
| es-US | 西班牙語(美國) | 
| es-GT | 西班牙語(危地馬拉) | 
| es-HN | 西班牙語(洪都拉斯) | 
| es-MEX | 西班牙語(墨西哥) | 
| es-NI | 西班牙語(尼加拉瓜) | 
| es-PA | 西班牙語(巴拿馬) | 
| es-PY | 西班牙語(巴拉圭) | 
| es-PE | 西班牙語(秘魯) | 
| es-PR | 西班牙語(波多黎各) | 
| es-DO | 西班牙語(多米尼加共和國) | 
| es-UY | 西班牙語(烏拉圭) | 
| es-VE | 西班牙語(委內瑞拉) | 
| it | 意大利語(意大利) | 
| hi | 印地語(印度) | 
| en-AUS | 英語(澳大利亞) | 
| en-CA | 英語(加拿大) | 
| en-GH | 英語(加納) | 
| en-GBR | 英語(英國) | 
| en-IND | 英語(印度) | 
| en-IE | 英語(愛爾蘭) | 
| en-KE | 英語(肯尼亞) | 
| en-NZ | 英語(新西蘭) | 
| en-NG | 英語(尼日利亞) | 
| en-PH | 英語(菲律賓) | 
| en-SG | 英語(新加坡) | 
| en-ZAF | 英語(南非) | 
| en-TZ | 英語(坦桑尼亞) | 
| en-US | 英語(美國) | 
| vi | 越南語(越南) | 
| zh-TWN | 臺灣普通話(中國臺灣) | 
| lo | 老撾語(老撾) | 
| bn | 孟加拉語(孟加拉) | 
| bn-IN | 孟加拉語(印度) | 
| tl | 菲律賓語 | 
| 錯誤碼 | 含義 | 
|---|---|
| 101 | 缺少必填的參數 | 
| 102 | 不支持的語言類型 | 
| 103 | 翻譯文本過長 | 
| 104 | 不支持的 API 類型 | 
| 105 | 不支持的簽名類型 | 
| 106 | 不支持的響應類型 | 
| 107 | 不支持的傳輸加密類型 | 
| 108 | 應用 ID 無效,注冊賬號,登錄后臺創建應用和實例并完成綁定,可獲得應用 ID 和應用密鑰等信息 | 
| 109 | batchLog 格式不正確 | 
| 110 | 無相關服務的有效實例 | 
| 111 | 開發者賬號無效 | 
| 113 | q 不能為空 | 
| 114 | 不支持的圖片傳輸方式 | 
| 201 | 解密失敗,可能為 DES,BASE64,URLDecode 的錯誤 | 
| 202 | 簽名檢驗失敗 | 
| 203 | 訪問 IP 地址不在可訪問 IP 列表 | 
| 205 | 請求的接口與應用的平臺類型不一致,如有疑問請參考入門指南 | 
| 206 | 因為時間戳無效導致簽名校驗失敗 | 
| 207 | 重放請求 | 
| 301 | 辭典查詢失敗 | 
| 302 | 翻譯查詢失敗 | 
| 303 | 服務端的其它異常 | 
| 304 | 會話閑置太久超時 | 
| 401 | 賬戶已經欠費停 | 
| 402 | offlinesdk 不可用 | 
| 411 | 訪問頻率受限,請稍后訪問 | 
| 412 | 長請求過于頻繁,請稍后訪問 | 
| 1001 | 無效的 OCR 類型 | 
| 1002 | 不支持的 OCR image 類型 | 
| 1003 | 不支持的 OCR Language 類型 | 
| 1004 | 識別圖片過大 | 
| 1201 | 圖片 base64 解密失敗 | 
| 1301 | OCR 段落識別失敗 | 
| 1411 | 訪問頻率受限 | 
| 1412 | 超過最大識別字節數 | 
| 2003 | 不支持的語音聲道 | 
| 2004 | 不支持的語音上傳類型 | 
| 2005 | 不支持的語言類型 | 
| 2006 | 不支持的識別類型 | 
| 2201 | 識別音頻文件過大 | 
| 2301 | 識別音頻時長過長 | 
| 2411 | 不支持的音頻文件類型 | 
| 2412 | 不支持的發音類型 | 
| 3001 | 不支持的語音格式 | 
| 3002 | 不支持的語音采樣率 | 
| 3003 | 不支持的語音聲道 | 
| 3004 | 不支持的語音上傳類型 | 
| 3005 | 不支持的語言類型 | 
| 3006 | 不支持的識別類型 | 
| 3007 | 識別音頻文件過大 | 
| 3008 | 識別音頻時長過長 | 
| 3009 | 不支持的音頻文件類型 | 
| 3010 | 不支持的發音類型 | 
| 3201 | 解密失敗 | 
| 3301 | 語音識別失敗 | 
| 3302 | 語音翻譯失敗 | 
| 3303 | 服務的異常 | 
| 3411 | 訪問頻率受限,請稍后訪問 | 
| 3412 | 超過最大請求字符數 | 
| 4001 | 不支持的語音識別格式 | 
| 4002 | 不支持的語音識別采樣率 | 
| 4003 | 不支持的語音識別聲道 | 
| 4004 | 不支持的語音上傳類型 | 
| 4005 | 不支持的語言類型 | 
| 4006 | 識別音頻文件過大 | 
| 4007 | 識別音頻時長過長 | 
| 4201 | 解密失敗 | 
| 4301 | 語音識別失敗 | 
| 4303 | 服務的異常 | 
| 4411 | 訪問頻率受限,請稍后訪問 | 
| 4412 | 超過最大請求時長 | 
| 5001 | 無效的 OCR 類型 | 
| 5002 | 不支持的 OCR image 類型 | 
| 5003 | 不支持的語言類型 | 
| 5004 | 識別圖片過大 | 
| 5005 | 不支持的圖片類型 | 
| 5006 | 文件為空 | 
| 5201 | 解密錯誤,圖片 base64 解密失敗 | 
| 5301 | OCR 段落識別失敗 | 
| 5411 | 訪問頻率受限 | 
| 5412 | 超過最大識別流量 | 
| 9001 | 不支持的語音格式 | 
| 9002 | 不支持的語音采樣率 | 
| 9003 | 不支持的語音聲道 | 
| 9004 | 不支持的語音上傳類型 | 
| 9005 | 不支持的語音識別 Language 類型 | 
| 9301 | ASR 識別失敗 | 
| 9303 | 服務器內部錯誤 | 
| 9411 | 訪問頻率受限(超過最大調用次數) | 
| 9412 | 超過最大處理語音長度 | 
| 10001 | 無效的 OCR 類型 | 
| 10002 | 不支持的 OCR image 類型 | 
| 10004 | 識別圖片過大 | 
| 10201 | 圖片 base64 解密失敗 | 
| 10301 | OCR 段落識別失敗 | 
| 10411 | 訪問頻率受限 | 
| 10412 | 超過最大識別流量 | 
| 11001 | 不支持的語音識別格式 | 
| 11002 | 不支持的語音識別采樣率 | 
| 11003 | 不支持的語音識別聲道 | 
| 11004 | 不支持的語音上傳類型 | 
| 11005 | 不支持的語言類型 | 
| 11006 | 識別音頻文件過大 | 
| 11007 | 識別音頻時長過長,最大支持 30s | 
| 11201 | 解密失敗 | 
| 11301 | 語音識別失敗 | 
| 11303 | 服務的異常 | 
| 11411 | 訪問頻率受限,請稍后訪問 | 
| 11412 | 超過最大請求時長 | 
| 12001 | 圖片尺寸過大 | 
| 12002 | 圖片 base64 解密失敗 | 
| 12003 | 引擎服務器返回錯誤 | 
| 12004 | 圖片為空 | 
| 12005 | 不支持的識別圖片類型 | 
| 12006 | 圖片無匹配結果 | 
| 13001 | 不支持的角度類型 | 
| 13002 | 不支持的文件類型 | 
| 13003 | 表格識別圖片過大 | 
| 13004 | 文件為空 | 
| 13301 | 表格識別失敗 | 
| 15001 | 需要圖片 | 
| 15002 | 圖片過大(1M) | 
| 15003 | 服務調用失敗 | 
| 17001 | 需要圖片 | 
| 17002 | 圖片過大(1M) | 
| 17003 | 識別類型未找到 | 
| 17004 | 不支持的識別類型 | 
| 17005 | 服務調用失敗 | 
| -1000 | 未知錯誤 | 
| -2000 | 查詢輸入為空 | 
將 wav 后綴文件儲存至手機存儲的 ydasrDemo/temp 目錄下,將文件名改成對應 from 語言的對應參數時,可自動根據所選 from 語言種類自動選擇相對應的音頻文件。
例如:該目錄下存在 da.wav 的音頻文件。當選擇 from 語言為丹麥語(丹麥)時,點擊翻譯本地文件按鈕后,自動開始翻譯 da.wav 文件。
| 上線日期 | 版本號 | 更新內容 | 
|---|---|---|
| 2019.06.20 | v1.0.0 | 支持實時語音翻譯和整句翻譯 | 
| 2019.09.19 | v1.1.0 | 擴充小語種 |