Help us understand the problem. What is going on with this article?

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

はじめに

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秒かからないくらいですね。
実用する場合には、ここの処理時間なども正確に計測しておきたいところです。

honeycomb-lab
様々なスキルを持つメンバーが、世の中の様々な課題やアイディアをクリエイティブとテクノロジーの力で解決し、ワクワクする未来の実現を目指します。xRコンテンツやインタラクティブコンテンツの企画・開発を得意とします。
https://www.honeycomb-lab.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした