[Cordova] 使用Cordova搭配微軟文字翻譯功能,作出一個即時翻譯的語音APP

微軟在雲端上已經有提供了文字的即時翻譯的功能,只要提供文字內容以及想要翻譯的目的語系,文字翻譯的API就可以將翻譯後的文字回傳
在APP端,透過這樣的翻譯功能,加上收音以及播放功能,就會變成一個可以即時語音翻譯的APP了

透過Cordova加上微軟的文字翻譯功能達到即時的語音翻譯,主要分成三的大功能,分別是"收音並轉換文字"、"將來源文字翻譯成目的語系文字"、"朗讀翻譯的結果"
下面,就會依序把這個即時翻譯功能的APP製作進行詳細的說明

1.首先我們先在Cordova的專案中點選config.xml,並在外掛程式中選到自訂,接著在文字方塊中放入下面的Git網址
https://github.com/pbakondy/cordova-plugin-speechrecognitionSpeech Recognition這個外掛套件,可以在呼叫時開啟手機的麥克風,並將收到的聲音轉換成文字

2.繼續在外掛程式中,安裝下面這個套件
https://github.com/vilic/cordova-plugin-ttsTTS這個套件,可以將指定的文字內容進行朗讀,可以用來將翻譯好的文字播放出來

3.在Microsoft Azure的Portal中建立一個名為[翻譯文字 API]的服務

[翻譯語音 API] 與 [翻譯文字 API] 不同,建立的時候請特別注意 

4.建立完成後將Key記下來,程式中會用到

5.接著,我們在html的畫面中加上下面的內容

<body>
    <p>
        <select id="ddlSource">
            <option value="cmn-Hant-TW">國語 (台灣)</option>
            <option value="cmn-Hans-CN">普通话 (中国大陆)</option>
            <option value="en-US">English</option>
            <option value="ja-JP">日本語</option>
            <option value="ko-KR">한국어</option>
            <option value="fr-FR">Français</option>
            <option value="th-TH">ไทย</option>
            <option value="de-DE">Deutsch</option>
        </select> =>
        <select id="ddlDesc">
            <option value="en-US">English</option>
            <option value="cmn-Hant-TW">國語 (台灣)</option>
            <option value="cmn-Hans-CN">普通话 (中国大陆)</option>
            <option value="ja-JP">日本語</option>
            <option value="ko-KR">한국어</option>
            <option value="fr-FR">Français</option>
            <option value="th-TH">ไทย</option>
            <option value="de-DE">Deutsch</option>
        </select>
        <input type="button" onclick="javascript:funOpenVoice()" value="Go!" />
    </p>
    <p>
        原文:<br />
        <textarea id="txtSource" width="100%" height="100"></textarea>
    </p>
    <p>
        翻譯後:<br />
        <textarea id="txtDesc" width="100%" height="100"></textarea>
    </p>
    <script type="text/javascript" src="cordova.js"></script>
    <script type="text/javascript" src="scripts/platformOverrides.js"></script>
    <script type="text/javascript" src="scripts/index.js"></script>
</body>

這段內容,主要是放上了兩個下拉式選單,決定來源語系以及要翻譯後的語系。當按下"Go"的時候會呼叫funOpenVoice(),執行翻譯的動作

6.在JS的檔案內容中加入下面的內容

function funOpenVoice() {

    var itemSource = document.getElementById("ddlSource");
    var source = itemSource.options[itemSource.selectedIndex].value;

    var itemDesc = document.getElementById("ddlDesc");
    var desc = itemDesc.options[itemDesc.selectedIndex].value;

    let options = {
        language: source,
        matches: 1,
        prompt: "",      // Android only
        showPopup: true,  // Android only
        showPartial: false
    };

    window.plugins.speechRecognition.startListening(
        function (x) { funGetVoiceResult(x, desc); },
        onFail,
        options);
}

function funGetVoiceResult(x, desc) {
    document.getElementById("txtSource").value = x;

    // 轉換成微軟語系的文字
    var langArr = {
        "cmn-Hans-CN": "zh-Hans",
        "cmn-Hant-TW": "zh-Hant"
    }

    var lang = desc.substring(0, 2);
    if (desc == "cmn-Hans-CN") { lang = "zh-Hans" }
    if (desc == "cmn-Hant-TW") { lang = "zh-Hant" }

    // 繼續進行翻譯的動作
    GetTranslater(x[0], lang);
}

這一段的內容主要是,當點下"Go"的按鈕時,會先透過[window.plugins.speechRecognition.startListening],打開收音的功能,並將收音後得到的結果轉換成文字放回到文字方塊

7.接著在JS裡繼續放入下面的內容

function GetTranslater(source, target) {
    var TranslaterUrl = "https://api.microsofttranslator.com/V2/Http.svc/Translate";
    var TranslaterApiKey = "[在這裡放上翻譯文字的Key]";

    var params = {
        // Request parameters
        "to": target,
        "text": source
    };

    var strUrl = TranslaterUrl + "?" + $.param(params);
    $.ajax({
        url: strUrl,
        beforeSend: function (xhrObj) {
            // Request headers
            xhrObj.setRequestHeader("Ocp-Apim-Subscription-Key", TranslaterApiKey);
        },
        type: "GET",
        success: onTranslaterDone,
        error: onFail
    })
}

function onTranslaterDone(caption) {
    var str = caption.getElementsByTagName("string")[0].textContent;
    document.getElementById("txtDesc").value = str;

    var itemDesc = document.getElementById("ddlDesc");
    var desc = itemDesc.options[itemDesc.selectedIndex].value;

    // 轉換語系的文字
    var langArr = {
        "cmn-Hans-CN": "zh-CN",
        "cmn-Hant-TW": "zh-TW"
    }

    var langDesc = langArr[desc];
    if (langDesc == undefined)
        langDesc = desc;

    TTS.speak({
        text: str,
        locale: langDesc,
        rate: 0.75
    }).then(null, onFail);
}

這一段的內容就是,取得到的來源文字,呼叫微軟的文字翻譯API後取得到結果,再將結果透過TTS.speak的外掛進行朗讀的動作

8.最後得到的結果如下

是不是很簡單呢?