Advanced TTS demos¶
このページ(ノートブック形式)では、第11章で少し触れた「非自己回帰型ニューラルボコーダ」を用いた、発展的な音声合成のデモを示します。 書籍ではJSUTコーパスのみを扱いましたが、ここではJVSコーパスを用いた多話者音声合成など、他のコーパスを利用した音声合成のデモも紹介します。 このページのデモは、書籍では解説していないことに注意してください。
非自己回帰型ニューラルボコーダの実装には、kan-bayashi/ParallelWaveGAN を利用します。 多話者音声合成の実装は、書籍では実装の解説はしていませんが、第9章、第10章の内容に、軽微な修正を加えることで実現可能です。 興味のある読者は、extra_recipes のソースコードを参照してください。
準備¶
ttslearn のインストール¶
[1]:
%%capture
try:
import ttslearn
except ImportError:
!pip install ttslearn
[2]:
import ttslearn
ttslearn.__version__
[2]:
'0.2.2'
パッケージのインポート¶
[3]:
%pylab inline
import IPython
from IPython.display import Audio
import librosa
import librosa.display
from tqdm.notebook import tqdm
import torch
import random
Populating the interactive namespace from numpy and matplotlib
JSUT¶
Tacotron + Parallel WaveGAN (16kHz)¶
[4]:
from ttslearn.contrib import Tacotron2PWGTTS
if torch.cuda.is_available():
device = torch.device("cuda")
else:
device = torch.device("cpu")
print("Device:", device)
pwg_engine = Tacotron2PWGTTS(device=device)
%time wav, sr = pwg_engine.tts("あらゆる現実を、すべて自分のほうへねじ曲げたのだ。")
IPython.display.display(Audio(wav, rate=sr))
Device: cuda
CPU times: user 211 ms, sys: 7.53 ms, total: 218 ms
Wall time: 314 ms
Tacotron + Parallel WaveGAN (24kHz)¶
[5]:
from ttslearn.pretrained import create_tts_engine
pwg_engine = create_tts_engine("tacotron2_pwg_jsut24k", device=device)
%time wav, sr = pwg_engine.tts("あらゆる現実を、すべて自分のほうへねじ曲げたのだ。")
IPython.display.display(Audio(wav, rate=sr))
CPU times: user 197 ms, sys: 3.81 ms, total: 200 ms
Wall time: 201 ms
Tacotron + HiFi-GAN (24kHz)¶
[6]:
from ttslearn.pretrained import create_tts_engine
pwg_engine = create_tts_engine("tacotron2_hifipwg_jsut24k", device=device)
%time wav, sr = pwg_engine.tts("あらゆる現実を、すべて自分のほうへねじ曲げたのだ。")
IPython.display.display(Audio(wav, rate=sr))
CPU times: user 444 ms, sys: 2.96 ms, total: 447 ms
Wall time: 187 ms
JVS¶
Multi-speaker Tacotron + Parallel WaveGAN (16kHz)¶
[7]:
pwg_engine = create_tts_engine("multspk_tacotron2_pwg_jvs16k", device=device)
for spk in ["jvs001", "jvs010", "jvs030", "jvs050", "jvs100"]:
text = "タコスと寿司、あなたはどっちが好きですか?わたしは" + ("寿司" if random.random() > 0.2 else "タコス") + "が好きです。"
wav, sr = pwg_engine.tts(text, spk_id=pwg_engine.spk2id[spk])
print(f"Speaker: {spk}")
print(text)
IPython.display.display(Audio(wav, rate=sr))
Speaker: jvs001
タコスと寿司、あなたはどっちが好きですか?わたしはタコスが好きです。
Speaker: jvs010
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs030
タコスと寿司、あなたはどっちが好きですか?わたしはタコスが好きです。
Speaker: jvs050
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs100
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Multi-speaker Tacotron + Parallel WaveGAN (24kHz)¶
[8]:
pwg_engine = create_tts_engine("multspk_tacotron2_pwg_jvs24k", device=device)
for spk in ["jvs001", "jvs010", "jvs030", "jvs050", "jvs100"]:
text = "タコスと寿司、あなたはどっちが好きですか?わたしは" + ("寿司" if random.random() > 0.2 else "タコス") + "が好きです。"
wav, sr = pwg_engine.tts(text, spk_id=pwg_engine.spk2id[spk])
print(f"Speaker: {spk}")
print(text)
IPython.display.display(Audio(wav, rate=sr))
Speaker: jvs001
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs010
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs030
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs050
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs100
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Multi-speaker Tacotron + HiFi-GAN (24kHz)¶
[9]:
pwg_engine = create_tts_engine("multspk_tacotron2_hifipwg_jvs24k", device=device)
for spk in ["jvs001", "jvs010", "jvs030", "jvs050", "jvs100"]:
text = "タコスと寿司、あなたはどっちが好きですか?わたしは" + ("寿司" if random.random() > 0.2 else "タコス") + "が好きです。"
wav, sr = pwg_engine.tts(text, spk_id=pwg_engine.spk2id[spk])
print(f"Speaker: {spk}")
print(text)
IPython.display.display(Audio(wav, rate=sr))
Speaker: jvs001
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs010
タコスと寿司、あなたはどっちが好きですか?わたしはタコスが好きです。
Speaker: jvs030
タコスと寿司、あなたはどっちが好きですか?わたしはタコスが好きです。
Speaker: jvs050
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Speaker: jvs100
タコスと寿司、あなたはどっちが好きですか?わたしは寿司が好きです。
Common voice (ja)¶
Multi-speaker Tacotron + Parallel WaveGAN (16kHz)¶
[10]:
pwg_engine = create_tts_engine("multspk_tacotron2_pwg_cv16k", device=device)
# NOTE: some speaker's voice have significant amount of noise (e.g., speaker 0)
for spk_id in [5, 6, 12, 15, 19]:
text = ("今日" if random.random() > 0.5 else "明日") + "の天気は、" + ("晴れ時々曇り" if random.random() > 0.5 else "晴れ") + "です。"
wav, sr = pwg_engine.tts(text, spk_id=spk_id)
print(f"Speaker ID: {spk_id}")
print(text)
IPython.display.display(Audio(wav, rate=sr))
Speaker ID: 5
今日の天気は、晴れ時々曇りです。
Speaker ID: 6
明日の天気は、晴れです。
Speaker ID: 12
今日の天気は、晴れ時々曇りです。
Speaker ID: 15
今日の天気は、晴れ時々曇りです。
Speaker ID: 19
今日の天気は、晴れです。
Multi-speaker Tacotron + Parallel WaveGAN (24kHz)¶
[11]:
pwg_engine = create_tts_engine("multspk_tacotron2_pwg_cv24k", device=device)
# NOTE: some speaker's voice have significant amount of noise (e.g., speaker 0)
for spk_id in [5, 6, 12, 15, 19]:
text = ("今日" if random.random() > 0.5 else "明日") + "の天気は、" + ("晴れ時々曇り" if random.random() > 0.5 else "晴れ") + "です。"
wav, sr = pwg_engine.tts(text, spk_id=spk_id)
print(f"Speaker ID: {spk_id}")
print(text)
IPython.display.display(Audio(wav, rate=sr))
Speaker ID: 5
今日の天気は、晴れ時々曇りです。
Speaker ID: 6
今日の天気は、晴れ時々曇りです。
Speaker ID: 12
今日の天気は、晴れ時々曇りです。
Speaker ID: 15
明日の天気は、晴れ時々曇りです。
Speaker ID: 19
今日の天気は、晴れ時々曇りです。
参考¶
Parallel WaveGAN: https://arxiv.org/abs/1910.11480
HiFi-GAN: https://arxiv.org/abs/2010.05646
Parallel WaveGANを含むGANベースの非自己回帰型ニューラルボコーダの実装: https://github.com/kan-bayashi/ParallelWaveGAN