##はじめに
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で呼んでいます。
[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に渡せるようにします。
[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の声質が微妙だけど、キャラクターがいるとやっぱり見栄えが可愛い)
↓是非動画でご覧ください。クリックで再生されます。
動画内の遊んだ履歴:
日本語→英語
日本語→スペイン語
中国語→フランス語
英語→日本語
ドイツ語→英語
(楽しかったので日本語以外でも遊んでみました)
文字数にもよりますが、STTからテキストが渡って翻訳→TTSにのって音声出力、までは
体感で2秒かからないくらいですね。
実用する場合には、ここの処理時間なども正確に計測しておきたいところです。