💬

ESPNet2 で日本語 TTS(Text-to-speech)するメモ (Windows でも動くよ)

2023/04/06に公開

とりま日本語 TTS するには, voicevox があります https://voicevox.hiroshiba.jp/

ありがとうございます.

しかし人類の TTS に対する欲望は果てしない...
独自の学習データで TTS モデルつくりたい... イントネーションとかも自動でええ感じにして高みを目指したい...

ESPNet2 を試します!

情報

https://qiita.com/kan-bayashi/items/0371e06202641dbfa0ad

ありがとうございます.
実際のところは ESPNet は各種音声処理モデルをまとめたライブラリという感じです. ASR(音声認識)のモジュールもあります.

TTS モデルはどれを使う?

https://espnet.github.io/icassp2022-tts/

2023/04/05 時点では, FB-VITS がよさそうでしょうか. ただ VITS はアクセント(イントネーション)がちょっと中国語っぽく(?)なるときがあります(少なくとも日本語のイントネーションとしては不自然).

環境

  • Ubuntu 20.04
  • Python 3.8(miniconda 利用)
    • Python 3.10 などだと, ESPNet2 が, typegurad で deprecated となっって削除された古い typegurad の関数を使っているため(check_argument_types https://typeguard.readthedocs.io/en/stable/versionhistory.html 2.13.3 がインストールできずエラーとなる
    • 3.10 などで動作させたい場合は espnet 側のコードを修正でもいいかも
  • GPU は必須ではないです. CPU でもそこそこ高速に音声合成できます.

セットアップ

https://colab.research.google.com/github/espnet/notebook/blob/master/espnet2_tts_realtime_demo.ipynb

Colab デモを参考にします.

pyopentalk, typegurad 以外は, 各モジュール最新版でいけるとは思います.

# requirements.txt
espnet
pyopenjtalk-prebuilt==0.2.0
# pyopenjtalk==0.2
#pypinyin
#parallel_wavegan
typeguard==2.13.3
espnet_model_zoo

pyopenjtalk はビルドが必要なので, prebuilt を作りました.

https://zenn.dev/syoyo/articles/4f6962247adfb6

もし prebuilt でうまく行かないときは pyopenjtalk でソースからビルドしてください.

pypinyin は中国語用なのでインストールは不要です. parallel_wavegan もいらないです.
(拡張として, 中国語 TTS や WaveGan model 使いたい場合はインストールしましょう)

pyopenjtalk は, 執筆時点での最新 0.3 だと pyopenjtalk.run_frontend が返す値の仕様が変わったため, 実行時に espnet での pyopenjtalk.run_frontend 呼び出しでコケます.
(0.3 だと JSON でよりええ感じになっているので, espnet 側のコードを改善するのが本来はよいであろう)

とりま音声合成する.

Colab のやり方に合わせてみます!

import time
import torch
import soundfile as sf

from espnet2.bin.tts_inference import Text2Speech
from espnet2.utils.types import str_or_none

lang = 'Japanese'
tag = 'kan-bayashi/jsut_full_band_vits_prosody'
vocoder_tag = 'none'

# Use device="cuda" if you have GPU
text2speech = Text2Speech.from_pretrained(
    model_tag=str_or_none(tag),
    vocoder_tag=str_or_none(vocoder_tag),
    device="cpu",
    # Only for Tacotron 2 & Transformer
    threshold=0.5,
    # Only for Tacotron 2
    minlenratio=0.0,
    maxlenratio=10.0,
    use_att_constraint=False,
    backward_window=1,
    forward_window=3,
    # Only for FastSpeech & FastSpeech2 & VITS
    speed_control_alpha=1.0,
    # Only for VITS
    noise_scale=0.333,
    noise_scale_dur=0.333,
)

# decide the input sentence by yourself
#print(f"Input your favorite sentence in {lang}.")
#x = input()

x = "明日は夏日となるでしょう. 最高気温は 35 度の予想です"

ts = text2speech(x)
print(ts)


# synthesis
with torch.no_grad():
    start = time.time()
    wav = text2speech(x)["wav"]
rtf = (time.time() - start) / (len(wav) / text2speech.fs)
print(f"RTF = {rtf:5f}")

wavdata = wav.view(-1).cpu().numpy()
samplerate=text2speech.fs

sf.write('tts.wav', wavdata, samplerate, subtype='PCM_24')

https://drive.google.com/file/d/1gILiPXFWfWZ8HzseYCZiOtI4M5rhcRG1/view?usp=sharing

Voila!

tagkan-bayashi/tsukuyomi_full_band_vits_prosody を指定すると, つくよみちゃんで TTS してくれます!

つくよみちゃん(R)について.

====

音声合成(「声質の学習」など、より具体的に説明しても可)には、フリー素材キャラクター「つくよみちゃん」が無料公開している音声データを使用しています。

■つくよみちゃんコーパス(CV.夢前黎)
https://tyc.rei-yumesaki.net/material/corpus/

====

ありがとうございます. つくよみちゃんコーパスの利用規約を遵守して (pretrained) model 利用しましょう.

モデルファイルは自動ダウンロードしてくれます! 350MB くらいです.
(モデルファイルは zenodo にアップロードされています. 帯域弱いのかダウンロードに時間かかるときありますのでダウンロードは気長に待ちましょう)

Streamlit で GUI

Streamlit で GUI をつくりました.

https://github.com/syoyo/espnet-tts-streamlit

実行時, pretrained つくよみちゃん モデルを自動ダウンロードします
(利用規約は確認してね)

pyinstaller で .exe バイナリも作れるよ.

Streamlit アプリを pyinstaller で .exe パッケージ化のメモ(2023/01 時点)
https://qiita.com/syoyo/items/b253267e61bde03fd42a

でシッカリと streamit のパッケージング対応しているから, .exe できたらあとはフォルダコピればほかのマシンでも動かせるよ.
(.exe 等は再配布可能なライセンスになっているはずです. model データは再配布しないで, 個人や研究組織内でのプライベート利用にとどめてね)

Windows にもきちんと対応してるよ.

まとめ

ESPNet2 でいい感じに日本語 TTS できるのを確認しました!

ただ, VITS 系は, 入力文章によってはアクセントがちょっとおかしくなるときがあるので, つくよみちゃんコーパスで非 VITS 系?(FastSpeech2 + HiFiGAN など)で学習させるとどうなるか調査したいところですね.

最近は Bark や RVC なども出てきました. それらの利用も検討したいですね.

TODO

  • ESPNet, voicebox みたいにデフォの GUI は無いようなので, Streamlit あたりで UI を組んでみる
  • marin アクセント推定つかってみる https://github.com/6gsn/marine
  • アクセント調整できるかどうか調べる
  • ReazonSpeech 日本語コーパスなど, 商用利用可能な音声で学習させる
  • 平均声(これを表現する学術用語があるのか不明であるが, たとえば「平均的な 30 代日本人女性声」など)を作成して学習し, 話者の個人情報がわからないようにする
  • 平均声で TTS し, so-vits-svc や RVC で声質変換する
    • 声帯から頭部までの 3D model を作り, 3D 音響処理と物理シミュレーションを極めることで, Physically-based で声を Synthetic に生成させて架空の声を作りそれを学習させてみる

Discussion