LoginSignup
11
1

More than 3 years have passed since last update.

日本語対応したDeepL APIを使用して、「STT→DeepL→TTS」の同時通訳を試作してみた

Last updated at Posted at 2020-07-01

はじめに

DeepL Proが日本語に対応したということで、UnityでDeepL APIを試してみました。
せっかくなので、同時通訳っぽいものを作れたら楽しいなと思い、
STTで音声をテキスト化

DeepLにテキストを渡し、翻訳されたテキストを返してもらう

翻訳されたテキストをTTSで音声出力

の流れで組み込みました。

(作業環境…Unity 2019.3.1f)

STTとTTS

今回、STTとTTSは無料で手軽に試せるIBMのWatsonを使用しました。
2020年7月現在、Unity Asset StoreからWatson SDKは入手できなくなっているので、
https://github.com/watson-developer-cloud/unity-sdk
上記からダウンロードし、Unityプロジェクトにインポートする必要があります。

STT、TTS共にサンプルシーンがあるので、今回はそこで使用されているサンプルコードをほぼそのまま流用しました。
(IBM Cloudにログインして、STTとTTSを作成し、それぞれのAPIキーとURLを利用してください)
ただSTTについては、認識された発話が垂れ流しになるのを防ぐため、
Confidence(確信度)が0.5以上になった時を確定して、DeepLに投げるようにしました。

STTで認識したい言語は下記を、
https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models&locale=ja
TTSで認識したい言語は下記を参考にしてください。
https://cloud.ibm.com/docs/text-to-speech?topic=text-to-speech-voices&locale=ja

DeepL API

DeepL API ドキュメント:https://www.deepl.com/docs-api/introduction/

APIの呼び出しにはUnityWebRequestを使用しました。
(参考:https://kan-kikuchi.hatenablog.com/entry/UnityWebRequest
APIをPOSTで呼んでいます。

DeepLReceiver.cs
    [SerializeField]
    string lang;//翻訳したい言語を指定

    private IEnumerator DeepLTranslate(string text)
    {

        string base_word = text;

        WWWForm form = new WWWForm();
        form.AddField("auth_key", [KEY]);
        form.AddField("text", base_word);
        form.AddField("target_lang", lang);

        UnityWebRequest request = UnityWebRequest.Post("https://api.deepl.com/v2/translate", form);

        yield return request.SendWebRequest();

        if (request.isHttpError || request.isNetworkError)
        {

            Debug.Log(request.error);
        }
        else
        {
            readJson = request.downloadHandler.text;
            Debug.Log(request.downloadHandler.text);
            JsonRead(readJson);
        }
    }

DeepLからは下記のようなJsonが返ってくるので、

{
    "translations": [{
        "detected_source_language":"JA",
        "text":"Hallo, How are you?"
    }]
}

翻訳されたtextだけを取り出して、TTSに渡せるようにします。

DeepLReceiver.cs
    [Serializable]
    public class RESPONSEJSON
    {
        public RESPONSE[] translations;
    }
    [Serializable]
    public class RESPONSE
    {
        public string detected_source_language;
        public string text;
    }

    string ttsText;

    private void JsonRead(string json)
    {
        string inputString = json;
        RESPONSEJSON responseJson = JsonUtility.FromJson<RESPONSEJSON>(inputString);
        ttsText = responseJson.translations[0].text;
    }

実際に遊んでみた動画

即席試作といえども、画面に文字だけでは味気ないので、
弊社のオリジナルキャラクター、「ハニカ」に翻訳文を喋らせました。
(Watson TTSの声質が微妙だけど、キャラクターがいるとやっぱり見栄えが可愛い)
↓是非動画でご覧ください。クリックで再生されます。
IMAGE ALT TEXT HERE
動画内の遊んだ履歴:
日本語→英語
日本語→スペイン語
中国語→フランス語
英語→日本語
ドイツ語→英語
(楽しかったので日本語以外でも遊んでみました)

文字数にもよりますが、STTからテキストが渡って翻訳→TTSにのって音声出力、までは
体感で2秒かからないくらいですね。
実用する場合には、ここの処理時間なども正確に計測しておきたいところです。

11
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1