🎃

ESPnet2で日本語のTTSを試す

2023/08/07に公開

日本語でText to Speechを試してみます。全く知らないので用語を調べるところから。
ESPnetというライブラリが便利みたい。

ESPnet は、エンドツーエンドの音声認識、テキスト読み上げ、音声翻訳、音声強調、話者ダイアリゼーション、音声言語理解などをカバーするエンドツーエンドの音声処理ツールキットです。ESPnet は、ディープ ラーニング エンジンとしてpytorchを使用し、カルディスタイルのデータ処理、特徴抽出/形式、およびレシピに従って、さまざまな音声処理実験のための完全なセットアップを提供します。

https://github.com/espnet/espnet

事前知識

用語や英語の省略形も含めて知らなかったのでメモ。

ESPNet2では以下の機能が使える。
サンプルも充実していたので、何ができるのかわかりやすかった。

  • ASR(Automatic Speech Recognition): 音声認識
  • TTS(Text-to-speech): 音声合成
  • SE(Speech enhancement): 単一話者の音声強調、複数話者の音声分離
  • ST: Speech Translation & MT: Machine Translation 音声翻訳、機械翻訳
  • SLU: Spoken Language Understanding
  • SUM: Speech Summarization 音声の要約
  • SVS: Singing Voice Synthesis 歌声合成
  • SSL: Self-supervised Learning
  • UASR: Unsupervised ASR (EURO: ESPnet Unsupervised Recognition - Open-source)
  • DNN Framework

models

End-to-End TTSでは、テキストをMel spectrogram(メルスペクトログラム)に変換し、Mel spectrogram(メルスペクトログラム)から音声に変換にするのが一般的な手法っぽい。
Mel spectrogram(メルスペクトログラム)は音響特徴量

ESPNet2のTTSとしてサポートされるモデルは以下

  • Tacotron2
  • Transformer-TTS
  • FastSpeech
  • FastSpeech2
  • Conformer FastSpeech & FastSpeech2
  • VITS
  • JETS

https://github.com/espnet/espnet#tts-text-to-speech

Tacotron2

https://github.com/NVIDIA/tacotron2

Transformer-TTS

論文: https://arxiv.org/abs/1809.08895
解説: https://aria3366.hatenablog.com/entry/2020/10/20/172807

Vits

実装: https://github.com/jaywalnut310/vits
論文: https://arxiv.org/abs/2106.06103

動かす

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

colabでのサンプルが用意してあるので、そのまま参考にします
https://colab.research.google.com/github/espnet/notebook/blob/master/espnet2_tts_realtime_demo.ipynb#scrollTo=fjJ5zkyaoy29

install

# NOTE: pip shows imcompatible errors due to preinstalled libraries but you do not need to care
!pip install -q espnet==202308 pypinyin==0.44.0 parallel_wavegan==0.5.4 gdown==4.4.0 espnet_model_zoo
!pip install -q --no-build-isolation pyopenjtalk==0.3.1

日本語で良さげな音声が公開されているので使わせて頂く。
tagは次を指定 kan-bayashi/tsukuyomi_full_band_vits_prosody

https://tyc.rei-yumesaki.net/material/corpus/

#@title Choose Japanese model { run: "auto" }
lang = 'Japanese'
tag = 'kan-bayashi/tsukuyomi_full_band_vits_prosody'
from espnet2.bin.tts_inference import Text2Speech
from espnet2.utils.types import str_or_none

text2speech = Text2Speech.from_pretrained(
    model_tag=str_or_none(tag),
    vocoder_tag=str_or_none(vocoder_tag),
    device="cuda",
    # 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,
)
from IPython.display import Audio
import torch

text = "はじめまして。私の名前はつくよみです。"

with torch.no_grad():
    wav = text2speech(text)["wav"]

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

sample_rate=24000
Audio(audio_array, rate=samplerate)

file save

import soundfile as sf
sf.write('sample.wav', audio_array, sample_rate)
sample.wav (327 kB) 

所感

思ったより高速に音声に変換できて驚いた。
声もかわいい
他のモデルもあるので試してみたい

Discussion