{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 音声合成プログラム\n", "\n", "このノートブックでは、`sbv2_bindings` パッケージを使用して音声合成を行います。必要なモデルをダウンロードし、ユーザーが入力したテキストから音声を生成します。音声合成が終わったら、再度テキストの入力を求め、ユーザーが終了するまで繰り返します。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 必要なパッケージのインストール\n", "%pip install sbv2_bindings\n", "\n", "# 必要なモジュールのインポート\n", "import os\n", "import urllib.request\n", "import time\n", "from sbv2_bindings import TTSModel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## モデルのダウンロード\n", "\n", "モデルファイルとトークナイザーをダウンロードします。ユーザーが独自のモデルを使用したい場合は、該当するURLまたはローカルパスを指定してください。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# モデルの URL またはローカルパスの指定\n", "user_sbv2_model_url = \"\" # カスタムモデルのURLがあればここに指定\n", "user_sbv2_model_path = \"\" # カスタムモデルのローカルパスがあればここに指定\n", "\n", "# モデル用のディレクトリを作成\n", "model_dir = 'models'\n", "os.makedirs(model_dir, exist_ok=True)\n", "\n", "# ダウンロードするファイルの URL\n", "file_urls = [\n", " \"https://huggingface.co/googlefan/sbv2_onnx_models/resolve/main/tokenizer.json\",\n", " \"https://huggingface.co/googlefan/sbv2_onnx_models/resolve/main/deberta.onnx\",\n", "]\n", "\n", "# モデルのパス決定\n", "if user_sbv2_model_path:\n", " sbv2_model_path = user_sbv2_model_path # ローカルモデルのパスを使用\n", "elif user_sbv2_model_url:\n", " sbv2_model_filename = os.path.basename(user_sbv2_model_url)\n", " sbv2_model_path = os.path.join(model_dir, sbv2_model_filename)\n", " file_urls.append(user_sbv2_model_url)\n", "else:\n", " # デフォルトのモデルを使用\n", " sbv2_model_filename = \"tsukuyomi.sbv2\"\n", " sbv2_model_path = os.path.join(model_dir, sbv2_model_filename)\n", " file_urls.append(\"https://huggingface.co/googlefan/sbv2_onnx_models/resolve/main/tsukuyomi.sbv2\")\n", "\n", "# ファイルをダウンロード\n", "for url in file_urls:\n", " file_name = os.path.join(model_dir, os.path.basename(url))\n", " if not os.path.exists(file_name):\n", " print(f\"{file_name} をダウンロードしています...\")\n", " urllib.request.urlretrieve(url, file_name)\n", " else:\n", " print(f\"{file_name} は既に存在します。\")\n", "\n", "# ダウンロードまたは使用するファイルを確認\n", "print(\"\\n使用するファイル:\")\n", "for file in os.listdir(model_dir):\n", " print(file)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## モデルの読み込みと音声合成\n", "\n", "モデルを読み込み、ユーザーが入力したテキストから音声を生成します。話者名は使用する `.sbv2` ファイル名から自動的に取得します。音声合成が終わったら、再度テキストの入力を求め、ユーザーが終了するまで繰り返します。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 音声合成の実行\n", "def main():\n", " try:\n", " print(\"\\nモデルを読み込んでいます...\")\n", " model = TTSModel.from_path(\n", " os.path.join(model_dir, \"deberta.onnx\"),\n", " os.path.join(model_dir, \"tokenizer.json\")\n", " )\n", " print(\"モデルの読み込みが完了しました!\")\n", " except Exception as e:\n", " print(f\"モデルの読み込みに失敗しました: {e}\")\n", " return\n", "\n", " # 話者名を取得(.sbv2 ファイル名の拡張子を除いた部分)\n", " speaker_name = os.path.splitext(os.path.basename(sbv2_model_path))[0]\n", " \n", " # 指定されたモデルのパスを使用\n", " try:\n", " model.load_sbv2file_from_path(speaker_name, sbv2_model_path)\n", " print(f\"話者 '{speaker_name}' のセットアップが完了しました!\")\n", " except Exception as e:\n", " print(f\"SBV2ファイルの読み込みに失敗しました: {e}\")\n", " return\n", "\n", " # 音声合成を繰り返し実行\n", " while True:\n", " # 合成したいテキストをユーザーから入力\n", " user_input = input(\"\\n音声合成したいテキストを入力してください(終了するには 'exit' と入力): \")\n", " \n", " if user_input.strip().lower() == 'exit':\n", " print(\"音声合成を終了します。\")\n", " break\n", "\n", " # 出力ファイル名\n", " output_file = \"output.wav\"\n", "\n", " # 音声合成を実行\n", " try:\n", " print(\"\\n音声合成を開始します...\")\n", " start_time = time.time()\n", "\n", " audio_data = model.synthesize(user_input, speaker_name, 0, 0.0, 1)\n", "\n", " with open(output_file, \"wb\") as f:\n", " f.write(audio_data)\n", "\n", " end_time = time.time()\n", " elapsed_time = end_time - start_time\n", "\n", " print(f\"\\n音声が '{output_file}' に保存されました。\")\n", " print(f\"音声合成にかかった時間: {elapsed_time:.2f} 秒\")\n", " except Exception as e:\n", " print(f\"音声合成に失敗しました: {e}\")\n", "\n", "if __name__ == \"__main__\":\n", " main()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.x" } }, "nbformat": 4, "nbformat_minor": 4 }