Text To Speech コンテナライブラリ- 組み込みAI セルフサービス型デジタル共創体験(DSCE)

# 組み込みAI セルフサービス型デジタル共創体験(DSCE)とは

[組み込みAI セルフサービス型デジタル共創体験](https://qiita.com/trtrbohz/items/356a5a4b66624b2c94a2)に記載しておりますが、現在STT(speech-to-text)、TTS(test-to-speech)、NLU(natural-language-understanding)等のAIがサーバーに接続しなくても組み込んで利用することが可能となりました。

その情報がこちらの[サイト](https://dsce.ibm.com/)、DSCE([Digital Self-Serve Co-Create Experience](https://dsce.ibm.com/);"組み込みAI セルフサービス型デジタル共創体験"？)にて紹介されております。

今回はそのDSCEの中から、「Convert text to speech using Watson Libraries」 を実施します。
※個人的な利用は無償ですが、商用利用は有償となります。

# 今回 「Speech to Text container for running a pre-trained model」 Watson TTS ライブラリを使ってテキストから音源へ変換してみた。※参照1

# 1. 前提
* コンテナ動作環境準備
コンテナ上で学習済みのSTTエンジンを動作させます。そのため、コンテナ環境としてDockerをインストールしてください。
mac：[ココ](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/)を参照
windows : 今回、TTS検証時にJupyter notebook を用います。その中で Windows には存在しないサウンド機能を利用します。そのため、Windows の場合には Windows Subsystem for Linux(WSL2) の中で全作業を実行します。次の情報を参照してWSL2内にコンテナ動作環境を構築してください。[WSL2+Docker環境構築手順](https://zenn.dev/ttani/articles/wsl2-docker-setup)

* Entitlement key 入手
  IBM Entitled Registry にアクセスしてするための entitlement key を [container soft library](https://myibm.ibm.com/products-services/containerlibrary)から入手していること
入手した entitlement key を以下のように環境変数として登録し、cp.icr.io のレジストリサービスにサインインします。

    export IBM_ENTITLEMENT_KEY=〈 entitlement key 〉
    echo $IBM_ENTITLEMENT_KEY | docker login -u cp --password-stdin cp.icr.io

# 2. コードリポジトリ クローン
※ Windowsの場合、WSL2上のLinux(Ubuntu22.04にて検証済み)で実施してください。
この[URL](https://github.com/ibm-build-lab/Watson-Speech)(https://github.com/ibm-build-lab/Watson-Speech) にアクセスして、以下のように一連のソースコードをダウンロード。
※コード改変＆プルリクをしていただけるのであれば「git clone」コマンドを使ってください。ただ、今回はソースコードの入手が目的ですので Zip ファイルでソースコードを入手しています。
![スクリーンショット 2023-07-02 16.15.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/3344c1fc-6394-c839-85d6-b0cac13b23db.png)
その後、ダウンロードしたZipファイルをご自身の都合の良い場所で展開し、以下のディレクトリへ移動してください。

    cd Watson-Speech/single-container-tts

もしくは、以下のように適切なディレクトリに wget コマンドにてリソースを取得し、unzip コマンドにて展開後、以下のディレクトリに移動してください。

    wget https://github.com/ibm-build-lab/Watson-Speech/archive/refs/heads/main.zip
    unzip main.zip
    cd Watson-Speech/single-container-tts

# 3. コンテナイメージビルド
※ Windowsの場合、WSL2上のLinux(Ubuntu22.04にて検証済み)で実施してください。
移動したディレクトリにはDockerファイルが既にあるので、以下のコマンドを使ってDockerファイルからコンテナイメージをビルドしてください。
このビルドでは、"chuck_var"ディレクトリにある configuration file を使います。
デフォルトでは、事前学習済み２つの言語（en_US:英語、fr_FR:仏語）を用いたモデルを組み込みます。
他の言語を用いたい場合は、Dockerファイルやchuck_varディレクトリにあるenv_config.jsonファイル、sessionPools.yaml ファイルを適宜修正してください。
※初めてイメージをビルドする場合には1時間強時間を要する場合があります。気長にビルドが完了するまでお待ち下さい。m(_ _)m
    
    docker build . -t tts-standalone

# 4. TTSサービス開始
※ Windowsの場合、WSL2上のLinux(Ubuntu22.04にて検証済み)で実施してください。
#3でビルドしたイメージを使ってコンテナを走らせます。その際、ライセンスが設定されていることを示すため以下のコマンドにあるように"ACCEPT_LICENSE"を"true"としてください。
    
    docker run --rm -it --env ACCEPT_LICENSE=true --publish 1080:1080 tts-standalone

上記コマンドでは、ローカルの1080番ポートにてサービスが提供されるようにしています。

# 5. TTS機能検証
※ Windowsの場合、WSL2上のLinux(Ubuntu22.04にて検証済み)で実施してください。
※ 本検証はWindows上のUbuntu22.02(WSL2)で実施しているためDebian系のaptコマンドを用いています。Red Hat系OSを利用される場合はパッケージ管理ツールを適宜変更してください。

## 5.1. Jupyter Notebook 準備

    sudo apt install -y python3-pip
    export PATH="$HOME/.local/bin:$PATH"
    pip3 install Jupyter jupyterlab pandas numpy SciPy matplotlib librosa soundfile requests

## 5.2. Jupyter Notebook 起動
※ Mac,Windows ともにGithubからダウンロードしてきたリソースの Watson-Speech\TextToSpeech の下で以下のコマンドを実行してください。
 
    jupyter-lab --ip='0.0.0.0'

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/c950dd2d-e69f-74f2-0dec-88173072aeda.png)

上記のようなJupyter notebook が起動するか、Jupyter notebook が自動で起動しなければ、アクセスURLが出力されるのでブラウザからそのURLにアクセスしてください。
※Windows で WSL2 を利用している場合、LinuxサブシステムのIPアドレスを事前に確認しておき「localhost」もしくは「127.0.0.1」にて表示されるURLをLinuxサブシステムのIPアドレスに変えてアクセスしてください。

例 LinuxサブシステムのIPアドレスが 123.456.789.12 であった場合
    
    http://127.0.0.1:8888/lab?token=bbaeb8a158bbdd6dd402b4c7d5868646c202f60c8b25bd03
    ⇓
    http://123.456.789.123:8888/lab?token=bbaeb8a158bbdd6dd402b4c7d5868646c202f60c8b25bd03

## 5.3. 本検証を通じて使用されるライブラリ等のインポート

    from matplotlib import pyplot as plt
    import IPython.display as ipd
    import librosa
    import pandas as pd
    %matplotlib inline
    import soundfile as sf
    import requests

※本家の指南では末尾の「import requests」が抜けています。これがないと後続でエラーとなります。

## 5.4. 振幅表示メソッド定義

    def print_plot_play(fileName, text=''):
        x, Fs = librosa.load(fileName, sr=None)
        print('%s Fs = %d, x.shape = %s, x.dtype = %s' % (text, Fs, x.shape, x.dtype))
        plt.figure(figsize=(10, 5))
        plt.plot(x, color='blue')
        plt.xlim([0, x.shape[0]])
        plt.xlabel('Time (samples)')
        plt.ylabel('Amplitude')
        plt.tight_layout()
        plt.show()
        ipd.display(ipd.Audio(data=x, rate=Fs))

## 5.5. テキストデータ読み込み

    consumer_df = pd.read_csv('consumer_data.csv')

## 5.6. テキストデータ前処理
 音声合成サービスがJsonフォーマットのデータにアクセスするのですが、Jsonの中で無効な文字列を無害な文字列へ変換します。

    def clean(doc):
        stop_free = " ".join([word.replace('X','').replace('/','').replace("''",'').replace(',','').replace(':','').replace('{','').replace('}','').replace('"','') for word in doc.split()])
        return stop_free

## 5.7. Watson Text to Speech パラメータ設定

    headers = {"Content-Type": "application/json", "Accept":"audio/wav"}
    params ={'output': 'output_text.wav'}
    text_to_speech_url ='http://localhost:1080/text-to-speech/api/v1/synthesize'

## 5.8. サンプルテキスト
今回の検証では「Text to Speech service provides APIs that use IBM\'s speech-synthesis capabilities to synthesize text into natural-sounding speech in a variety of languages, dialects, and voices」を音声化します。

    data ='{"text": "Text to Speech service provides APIs that use IBM\'s speech-synthesis capabilities to synthesize text into natural-sounding speech in a variety of languages, dialects, and voices"}'

## 5.9. Watson Text to Speech サービスから音声を取り出すメソッドを定義

    def getSpeechFromText(headers,params,data,file_name):
        request =requests.post(text_to_speech_url,headers=headers,params =params,data=data)
        print(request.status_code)
        with open(file_name, mode='bx') as f:
            f.write(request.content)

## 5.10. サンプルテキストを Watson Text to Speech へ送信し、音声を取得＆波形データ表示

    file_name = 'text_to_speech_sample1.wav'
    result = getSpeechFromText(headers, params, data, file_name)
    print_plot_play(file_name)

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/e1502b48-155a-1b48-b85d-311aa8fbdc5f.png)

notebook 上に波形モデルが表示されます。また、赤枠で囲んだ再生ボタンをクリックすると音声を聞くことができます。


* 本家の指南には後続でパラメータ変更などのやり方が記載されておりますが、エラーとなってしまうため本家に現在問い合わせ中です。大変申し訳ございません。m(_ _)m
正しい情報が分かりましたら本記事をアップデート致します。


## 参考
※1
[Convert text to speech using Watson Libraries](https://developer.ibm.com/tutorials/convert-text-to-speech-using-the-watson-nlp-library/)