{
"cells": [
{
"cell_type": "markdown",
"id": "wired-flash",
"metadata": {
"tags": []
},
"source": [
"# 第10章 日本語Tacotronに基づく音声合成システムの実装\n",
"\n",
"[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/r9y9/ttslearn/blob/master/notebooks/ch10_Recipe-Tacotron.ipynb)\n",
"\n",
"Google colabでの実行における推定所要時間: 5時間\n",
"\n",
"このノートブックに記載のレシピの設定は、Google Colab上で実行した場合のタイムアウトを避けるため、学習条件を書籍に記載の設定から一部修正していることに注意してください (バッチサイズを減らす等)。\n",
"参考までに、書籍に記載の条件で、著者 (山本) がレシピを実行した結果を以下で公開しています。\n",
"\n",
"- Tensorboard logs: https://tensorboard.dev/experiment/gHKogn7wRxa4B3NIVw27xw/\n",
"- expディレクトリ(学習済みモデル、合成音声を含む) : https://drive.google.com/file/d/1RvRCmHhqUGFwpR4KYMu_bh6K_VGlJmt_/view?usp=sharing (226.9 MB)"
]
},
{
"cell_type": "markdown",
"id": "detailed-memorabilia",
"metadata": {},
"source": [
"## 準備"
]
},
{
"cell_type": "markdown",
"id": "historic-documentation",
"metadata": {},
"source": [
"### Google Colabを利用する場合"
]
},
{
"cell_type": "markdown",
"id": "sunrise-reach",
"metadata": {},
"source": [
"Google Colab上でこのノートブックを実行する場合は、メニューの「ランタイム -> ランタイムのタイムの変更」から、「ハードウェア アクセラレータ」を **GPU** に変更してください。"
]
},
{
"cell_type": "markdown",
"id": "round-terminology",
"metadata": {},
"source": [
"### Python version"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "about-russia",
"metadata": {
"execution": {
"iopub.execute_input": "2021-08-21T07:51:57.074497Z",
"iopub.status.busy": "2021-08-21T07:51:57.073038Z",
"iopub.status.idle": "2021-08-21T07:51:57.182022Z",
"shell.execute_reply": "2021-08-21T07:51:57.181665Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python 3.8.6 | packaged by conda-forge | (default, Dec 26 2020, 05:05:16) \r\n",
"[GCC 9.3.0]\r\n"
]
}
],
"source": [
"!python -VV"
]
},
{
"cell_type": "markdown",
"id": "herbal-short",
"metadata": {},
"source": [
"### ttslearn のインストール"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "foster-prague",
"metadata": {
"execution": {
"iopub.execute_input": "2021-08-21T07:51:57.185320Z",
"iopub.status.busy": "2021-08-21T07:51:57.185046Z",
"iopub.status.idle": "2021-08-21T07:51:57.633186Z",
"shell.execute_reply": "2021-08-21T07:51:57.632873Z"
},
"tags": []
},
"outputs": [],
"source": [
"%%capture\n",
"try:\n",
" import ttslearn\n",
"except ImportError:\n",
" !pip install ttslearn"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "cutting-trauma",
"metadata": {
"execution": {
"iopub.execute_input": "2021-08-21T07:51:57.638374Z",
"iopub.status.busy": "2021-08-21T07:51:57.637974Z",
"iopub.status.idle": "2021-08-21T07:51:57.640046Z",
"shell.execute_reply": "2021-08-21T07:51:57.639750Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'0.2.1'"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import ttslearn\n",
"ttslearn.__version__"
]
},
{
"cell_type": "markdown",
"id": "freelance-prize",
"metadata": {},
"source": [
"## 10.1 本章の日本語音声合成システムの実装"
]
},
{
"cell_type": "markdown",
"id": "structured-senator",
"metadata": {},
"source": [
"### 学習済みモデルを用いた音声合成"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "written-russian",
"metadata": {
"execution": {
"iopub.execute_input": "2021-08-21T07:51:57.642683Z",
"iopub.status.busy": "2021-08-21T07:51:57.642234Z",
"iopub.status.idle": "2021-08-21T07:54:21.398102Z",
"shell.execute_reply": "2021-08-21T07:54:21.398463Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7c163504afdd4572bf14327fed288313",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/32400 [00:00, ?it/s]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from ttslearn.tacotron import Tacotron2TTS\n",
"from tqdm.notebook import tqdm\n",
"from IPython.display import Audio\n",
"\n",
"engine = Tacotron2TTS()\n",
"wav, sr = engine.tts(\"一貫学習にチャレンジしましょう!\", tqdm=tqdm)\n",
"Audio(wav, rate=sr)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "documented-indication",
"metadata": {
"execution": {
"iopub.execute_input": "2021-08-21T07:54:21.401161Z",
"iopub.status.busy": "2021-08-21T07:54:21.400813Z",
"iopub.status.idle": "2021-08-21T07:54:21.695665Z",
"shell.execute_reply": "2021-08-21T07:54:21.695888Z"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"