PythonでVOICEVOX COREを使ってみる(音声合成)
はじめに
以前の記事でGoogle Cloud Platformの音声合成・音声認識を試したのですが、利用回数が多いとお金がかかります。やっぱり無料で実行したいということで、今回はVOICEVOXを使ってみました。
「無料で使える中品質なテキスト読み上げソフトウェア」ということですが、十分高品質で素晴らしいソフトウェアだと思います。一から勉強して音声合成ソフトウェアを組み込むのは大変ですし...
何かとエラーが起きたので、その対処方法を残しています。今後のアップデート次第ではありますが、ご参考になれば幸いです。
▼VOICEVOXのページはこちら
https://voicevox.hiroshiba.jp/
▼VOICEVOXのソフトウェア利用規約についてはこちら
https://voicevox.hiroshiba.jp/term/
▼以前の記事はこちら
VOICEVOXの概要
▼手軽に試したい方はこちらの「ダウンロード」から。デスクトップアプリケーションになっています。Electronも使われているみたいですね。
https://voicevox.hiroshiba.jp/
▼VOICEVOXの全体構成はこちら。今回使うのはコア部分です。
https://github.com/VOICEVOX/voicevox/blob/main/docs/%E5%85%A8%E4%BD%93%E6%A7%8B%E6%88%90.md
▼コア部分のGitHubのリポジトリはこちら
https://github.com/VOICEVOX/voicevox_core
Pythonで実行する
環境を構築する
▼Pythonの環境構築についてはこちらに書かれています。
https://github.com/VOICEVOX/voicevox_core/blob/main/example/python/README.md
今回はWindowsのVS Codeで、PowerShellのターミナルから実行しています。Pythonのバージョンは3.10.11です。
▼voicevox_coreのバージョンは0.14.5を利用します。
https://github.com/VOICEVOX/voicevox_core/releases/tag/0.14.5
まずは以下のコマンドでvoicevoxフォルダにdownload.exeをダウンロードし、実行します。必要なライブラリがインストールされます。
mkdir voicevox
cd voicevox
Invoke-WebRequest https://github.com/VOICEVOX/voicevox_core/releases/latest/download/download-windows-x64.exe -OutFile ./download.exe
.\download.exe
pipでPythonのライブラリもインストールします。
pip install https://github.com/VOICEVOX/voicevox_core/releases/download/0.14.5/voicevox_core-0.14.5+cpu-cp38-abi3-win_amd64.whl
▼フォルダ構造はこんな感じ。
voicevox
├─ voicevox_core
└─ download.exe
プログラムを実行する
voicevox_coreリポジトリのサンプルプログラムを試してみたのですが、エラーが出て実行できませんでした。
▼試してみたサンプルプログラムはこちら
https://github.com/VOICEVOX/voicevox_core/tree/main/example/python
まずは以下のエラーが出ました。PythonもVOICEVOXも、64ビット版をインストールしていました。
ImportError: DLL load failed while importing _rust: %1 は有効な Win32 アプリケーションではありません。
DLLファイルの読み込みに失敗しているとのことです。これは先程ダウンロードしたvoicevox_coreフォルダに含まれる、onnxruntime.dllを適切に配置すると解決します。
以下の二通りの方法でエラーを回避できました。
- onnxruntime.dllがあるフォルダでプログラムを実行する
- pipでインストールされたvoicevox_coreフォルダにonnxruntime.dllをコピーする
次に、voicevox_core.blockingが無いというエラーも出ていました。こちらについては今後のアップデートで解決するかもしれません。
voicevox_core.blockingについて
現在のPythonのバインディングにあるvoicevox_coreには、blocking.pyが含まれています。
▼こちらです。
https://github.com/VOICEVOX/voicevox_core/tree/main/crates/voicevox_core_python_api
バージョンはリリースされていた0.14.5を使っていましたが、0.15.0がリリースされそうです。そのときに含まれるようになるのかもしれません。
▼リリースについてはこちら。
以下の記事ではvoicevox_core.blockingを使っていないプログラムがあって、こちらだと実行できました。
▼こちらの記事です。
https://qiita.com/taka7n/items/1dc61e507274b93ee868
話者をidで指定するのですが、以下のプログラムで一覧を表示できます。
from voicevox_core import METAS
from pprint import pprint
pprint(METAS)
先程のvoicevox_coreフォルダに、プログラムを保存して実行します。
from pathlib import Path
from voicevox_core import VoicevoxCore, METAS
import sys, os
core = VoicevoxCore(open_jtalk_dict_dir=Path("./open_jtalk_dic_utf_8-1.11"))
speaker_id = 2
text = sys.argv[1]
if not core.is_model_loaded(speaker_id):
core.load_model(speaker_id)
wave_bytes = core.tts(text, speaker_id)
with open("./" + text + ".wav", "wb") as f:
f.write(wave_bytes)
idは2なので、「四国めたん」さんのノーマル音声になっています。
引数を音声に変換するようにしているので、以下のように実行します。
python .\voicevox.py こんにちは
▼以下のエラーが出た場合は、open_jtalkのフォルダのパスを確認してください。
voicevox_core.VoicevoxError: OpenJTalkの辞書が読み込まれていません
文字列 + .wavのファイルが作成されます。
▼実際の音声はこんな感じ。
最後に
環境構築がいつも一番大変なのですが、実行できるようになりました。今後のアップデートは要チェックですね。
Pythonで実行できたということは、アプリケーションに組み込み可能で、Node-REDから実行可能で、ロボットにも組み込めるというわけです。夢が広がりますね。あとは音声認識機能も欲しいところです。