ESPnet2で日本語のTTSを試す
日本語でText to Speechを試してみます。全く知らないので用語を調べるところから。
ESPnetというライブラリが便利みたい。
ESPnet は、エンドツーエンドの音声認識、テキスト読み上げ、音声翻訳、音声強調、話者ダイアリゼーション、音声言語理解などをカバーするエンドツーエンドの音声処理ツールキットです。ESPnet は、ディープ ラーニング エンジンとしてpytorchを使用し、カルディスタイルのデータ処理、特徴抽出/形式、およびレシピに従って、さまざまな音声処理実験のための完全なセットアップを提供します。
事前知識
用語や英語の省略形も含めて知らなかったのでメモ。
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
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
動かす
参考
colabでのサンプルが用意してあるので、そのまま参考にします
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
#@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