Advanced TTS demos

Open In Colab

このページ(ノートブック形式)では、第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
今日の天気は、晴れ時々曇りです。

参考