11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unityで音声合成を再生する (Amazon Polly)

Last updated at Posted at 2020-02-13

Unityで Alexaのような音声合成を試してみました。
「.Net」 に対応している AWS の音声合成サービス 「Amazon Polly」 を使います。

やりたいこと

  1. 入力したテキストの発話
  2. ボイスの選択( 男性女性 / 日本語・多言語 )

下記のサイトで Alexaの音声合成を試せるので、これと同じような仕組みを検討します。
SSML Editor : VoiceFlow
スクリーンショット 2020-02-13 17.33.34.png

Amazon Polly とは

 Amazon Polly は、文章をリアルな音声に変換するサービスです。テキスト読み上げができるアプリケーションを作成できるため、まったく新しいタイプの音声対応製品を構築できます。Polly は、高度なディープラーニング技術を使用したテキスト読み上げ (TTS) サービスで、自然に聞こえるように人間の音声を合成します。何十種類ものリアルな音声を多数の言語でサポートしているため、さまざまな国に対応した音声アプリケーションを構築できます。(AWSサイトより)

Polly API に テキストを送信するだけで、Amazon Polly からオーディオストリームがレスポンスされます。アプリケーションで直接ストリーミングしたり、MP3 に保存することもできます。
AWSのアカウントが必要ですが、「1か月あたり数百万文字」までの無料利用枠があるので、無料で始められます。

Amazon Polly : AWS

Amazon Polly の準備

AWSアカウントの作成

AWSアカウントがない場合は、下記からアカウントを作成してください。

AWSアカウントの作成の流れ : AWS
途中、クレジットカード情報の入力が必要です。

AWS SDK を使う際に、「アクセスキー ID」と「シークレットアクセスキー」が必要になるので、アカウント作成後に、IAMからアクセスキーを作成しておきます。

AWS SDK の入手

下記から AWSSDK.Core と AWSSDK.Polly の最新版をダウンロードします。
https://www.nuget.org/packages/AWSSDK.Core/
https://www.nuget.org/packages/AWSSDK.Polly/
スクリーンショット 2020-02-13 18.49.55.png

ダウンロードした「awssdk.core.****.nupkg」と「awssdk.polly.****.nupkg」は、拡張子を zip に変更すると解凍できます。
下記の階層から、それぞれの「.Net4.5」用DLLを取り出しておきます。
スクリーンショット 2020-02-13 18.59.38.png

音声合成コンポーネントを作る

新規作成したUnityプロジェクトに「Plugins」フォルダを作り、先ほどのDLLを配置します。
スクリーンショット 2020-02-13 19.16.06.png

ProjectSettings から Api Compatibility Levelを「.Net 4.x」に変更します。
スクリーンショット 2020-02-13 19.17.38.png

下記のスクリプトを作成します。
"access-key"と "secret-key"は、自分のキーに書き換えてください。

PollyTest.cs
using System.IO;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Amazon.Polly;
using Amazon.Polly.Model;

public class PollyTest : MonoBehaviour
{
    public VoiceType voiceType;
    public string text;
    private AmazonPollyClient client;
    private AudioSource audioSource;
    private List<FieldInfo> voiceList = new List<FieldInfo>();

    private string fileName = "voice.ogg";

    void Awake()
    {
        audioSource = gameObject.AddComponent<AudioSource>();

        string voiceNames = "";
        var list = typeof(VoiceId).GetFields();
        foreach (FieldInfo prop in list)
        {
            voiceNames += prop.Name + ",";
            voiceList.Add(prop);
        }
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Speak());
        }
    }

    private IEnumerator Speak()
    {
        client = new AmazonPollyClient("access-key", "secret-key", Amazon.RegionEndpoint.USEast1);
        SynthesizeSpeechRequest sreq = new SynthesizeSpeechRequest();
        sreq.Text = text;
        sreq.OutputFormat = OutputFormat.Ogg_vorbis;
        sreq.VoiceId = voiceList[(int)voiceType].GetValue(null) as VoiceId;
        SynthesizeSpeechResponse sres = client.SynthesizeSpeech(sreq);

        //save voice
        using (var fileStream = File.Create(Application.persistentDataPath + "/" + fileName))
        {
            sres.AudioStream.CopyTo(fileStream);
            fileStream.Flush();
            fileStream.Close();
        }
        //play voice
        using (WWW www = new WWW("file:///" + Application.persistentDataPath + "/" + fileName))
        {
            yield return www;
            audioSource.clip = www.GetAudioClip(false, true, AudioType.OGGVORBIS);
            audioSource.Play();
        }
    }
}

public enum VoiceType
{
    Aditi, Amy, Astrid, Bianca, Brian, Camila, Carla, Carmen, Celine, Chantal, Conchita, Cristiano, Dora, Emma, Enrique, Ewa, Filiz, Geraint, Giorgio, Gwyneth, Hans, Ines, Ivy, Jacek, Jan, Joanna, Joey, Justin, Karl, Kendra, Kimberly, Lea, Liv, Lotte, Lucia, Lupe, Mads, Maja, Marlene, Mathieu, Matthew, Maxim, Mia, Miguel, Mizuki, Naja, Nicole, Penelope, Raveena, Ricardo, Ruben, Russell, Salli, Seoyeon, Takumi, Tatyana, Vicki, Vitoria, Zeina, Zhiyu
}

ここでは、Amazon Polly から取得したオーディオストリームを Oggファイルとして保存して、WWW.AudioClipで再生しています。

GameObjectにスクリプトをアタッチします。
インストラクタ上で、ボイス選択 と 再生したい音声テキスト を変更できます。
スクリーンショット 2020-02-13 19.29.10.png

スペースキーで、音声が再生されると完成です。

VoiceType を Mizuki か Takumi にすると、日本語の音声合成も可能です。

11
4
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
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?