UnityでWatsonの音声認識と音声読み上げを使ってみる

#はじめに
はじめして！Qiita初投稿になります！
よろしくお願いいたします。

本記事では、
UnityでのWatsonを使ったアプリケーションを作る際に、自分がわからなくて詰まった
Watson SDKにおけるSpeech To TextとText To Speechの認証方法と使い方について記述します。
これらサービスを使ったアプリケーションを作成しているので
以下のURLを参考にしてみてください。
https://github.com/sugarsolt/SecretaryUnity-chan

#対象者
UnityのWatson SDKを使ってみたいけど、使い方がよくわからない人
（注）ただし、IBM Cloudへの登録方法は記述しません。

#目次
 - [インストール](#インストール)
 - [認証](#認証)
    - [Speech To Text認証](#Speech To Text認証)
    - [Text To Speech認証](#Text To Speech認証)
 - [音声認識・音声読み上げ](#音声認識・音声読み上げ)
    - [Speech To Text](#Speech To Text)
    - [Text To Speech](#Text To Speech)
 - [最後に](#最後に)

#インストール
Watson SDkのインストール方法は以下のURLにも記載されていますが、簡単に説明させていただきます。
https://github.com/watson-developer-cloud/unity-sdk
1. Unityでプロジェクトを作成
2. Api Compatibility Levelを.Net 4.xに変更
3. unity-sdkとunity-sdk-coreをダウンロード
4. unity-sdkとunity-sdk-coreを解凍
5. unity-sdkとunity-sdk-coreをAsset下に移動
以上でインストールは完了です。
ここで、私が使っている各ソフトウェアのバージョンを記載します。

- Windows10
- Unity 2019.3.12f1 (64-bit)
- unity-sdk-core 1.2.0
- unity-sdk 4.6.0

#認証
この章では、Speech To TextとText To Speechサービスを使う上での認証用プログラムを示します。
ここはサンプルプログラムと同じです。

##Speech To Text認証
これはSpeech To Textサービスの認証用のプログラムになります。
APIとURLを入力することによって認証を得ます。

```Talk.cs
private IEnumerator authWatsonSTT(){
    //STT認証
    if (string.IsNullOrEmpty(STTIamApikey))
    {
        throw new IBMException("Plesae provide IAM ApiKey for the service.");
    }
    IamAuthenticator authenticator = new IamAuthenticator(apikey: STTIamApikey);
    //  Wait for tokendata
    while (!authenticator.CanAuthenticate()){
        yield return null;
    }
    STTService = new SpeechToTextService(authenticator);
    if (!string.IsNullOrEmpty(STTServiceUrl))
    {
        STTService.SetServiceUrl(STTServiceUrl);
    }
    yield break;
}
```

##Text To Speech認証
これはText To Speechサービスの認証用のプログラムになります。
Speech To Text認証と同様にAPIとURLを入力することによって認証を得ます。

```Talk.cs
private IEnumerator authWatsonTTS(){
    //TTS認証
    if (string.IsNullOrEmpty(TTSIamApikey))
    {
        throw new IBMException("Plesae provide IAM ApiKey for the service.");
    }
    IamAuthenticator authenticator = new IamAuthenticator(apikey: TTSIamApikey);
    //  Wait for tokendata
    while (!authenticator.CanAuthenticate()){
        yield return null;
    }
    TTSService = new TextToSpeechService(authenticator);
    if (!string.IsNullOrEmpty(TTSServiceUrl))
    {
        TTSService.SetServiceUrl(TTSServiceUrl);
    }
    yield break;
}
```

#音声認識・音声読み上げ
この章では音声認識プログラムと音声読み上げプログラムについて記述いたします。
ここでは示さないその他のパラメータの指定方法はwatson sdkのサイトを参考にしてください。

##Speech To Text
Speech To Textサービスを利用するためのプログラムについて記述します。
機能としては、watsonを使って、wav形式の音声データを文章に変換するものです。
このプログラムで指定する必要があるパラメータは”audio”、”contentType”、”model”になります。
”audio”では”contentType”で指定した形式のデータをbyte[]型で取得したものを渡すところになります。
”contentType”ではwavやmp3などのデータ形式を指定します。
”model”では日本語や英語などを聞き取るデータの言語を指定します。
ここでは日本語を聞き取るので”ja-JP_BroadbandModel”を指定しました。
コールバック関数の中では、送信した音声データを文字列に変換したデータを取得しています。

``` Talk.cs
private IEnumerator WatsonSTT()
{
    //認識開始 
    STTService.Recognize(callback: (DetailedResponse<SpeechRecognitionResults> response, IBMError error) =>
        {
            jsontext = response.Response;
        },
        audio: bytes,
        contentType: "audio/wav",
        model: "ja-JP_BroadbandModel"
    );
    yield break;
}
```

##Text To Speech
Text To Speechサービスを利用するためのプログラムについて記述します。
機能としては、watsonを使って文章をwav形式の音声データに変換するものです。
このプログラムで指定する必要があるパラメータは”text”、”voice”、”accept”になります。
”text”では発声してほしい文字列を指定します。
”voice”では発声してほしい話者を指定します。
”accept”では発声データの形式を指定します。
コールバック関数の中では、取得したbyte[]型のデータをaudio clipに変換し、
それを再生しています。

``` Talk.cs
private IEnumerator WatsonTTS(string VoiceText){
    //認識開始 
    byte[] synthesizeResponse = null;
    clip = null;
    TTSService.Synthesize(callback: (DetailedResponse<byte[]> response, IBMError error) =>
        {
            synthesizeResponse = response.Result;
            clip = WaveFile.ParseWAV("myClip", synthesizeResponse);
            PlayClip(clip);
        },
        text: VoiceText,
        voice: "ja-JP_EmiV3Voice",
        accept: "audio/wav"
    );
    yield break;
}
```

#最後に
アプリケーションでwatsonを使う際に詰まったところについて記述しました。
初投稿で分かりにくいところが多々あると思いますが生暖かい目で見守ってください。

#参考
 - [Watson x Unity！初心者でもできる、VR 空間で Unity ちゃんとおしゃべりアプリ！](https://developer.ibm.com/jp/technologies/software-development/articles/unity/)
 - [developerWorks記事「Watson×Unity！初心者でもできる、VR 空間で Unity ちゃんとおしゃべりアプリ！」を試してみる](https://qiita.com/yamachan360/items/911204e57957bd4bbef0)
 - [UnityとWatsonを使ってサクッと音声認識させてみる](https://note.com/yiwase/n/n4d7eb15de9c8)
 - [Unity SDK to use the IBM Watson services.](https://github.com/watson-developer-cloud/unity-sdk)