mirror of
https://github.com/neodyland/sbv2-api.git
synced 2025-12-22 23:49:58 +00:00
181 lines
6.8 KiB
Plaintext
181 lines
6.8 KiB
Plaintext
{
|
||
"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
|
||
}
|