チラシの裏からうっすら見える外枠の外のメモ書き

新聞に挟まってる硬い紙のチラシの裏からうっすら見える外枠の外に走り書きされたようなものです。思いついたときにふらふらと。

MacでVOICEVOXエンジンをビルドしてみた

この記事は、「VOICEVOXをMacで動かそうシリーズ」の第一弾です。

VOICEVOX 0.10からmacOSがサポートされるようになりました。 以下のリンクからダウンロードできます。 voicevox.hiroshiba.jp この記事は古くなっていますが、参考のため残しています。

VOICEVOXはマルチプラットフォームで動作するように設計されているため、ビルド次第でWindows/Linux/Macで動作させることができます。 VOICEVOXのリポジトリでは、Windows向けビルドとLinux向けビルドが公開されましたが、Mac向けビルドがまだ公開されていません。

この連載では、VOICEVOXをMacで動かすことを目標として、いくつかのソフトウェアをビルドしていきます。

voicevox.hiroshiba.jp

第一弾は、VOICEVOXエンジンのビルドです。

VOICEVOXエンジンとは

VOICEVOXエンジンは、VOICEVOXのフロントエンドからテキストやイントネーションなどを受け取り、コアライブラリで音声合成をしてフロントエンドに合成音声を返すソフトウェアです。 フロントエンドとのやり取りはHTTP通信でやり取りしています。

エンジン自体はPythonで記述されており、nuitkaというツールを使って実行ファイルに変換されています。 nuitkaはMacもサポートしているので、早速ビルドしてみましょう。

ビルドコマンドはVOICEVOXエンジンのリポジトリ内にあるREADME.mdとDockerfileを参考にしています。

github.com

CMakeのインストール

VOICEVOXエンジンはPythonで作られていますが、ビルドによりバイナリの実行ファイルに変換されます。 この時に、CMakeというソフトウェアを使って変換が行われますが、Macには標準で入っていません。

そこで、brewコマンドを使ってCMakeを入れます。 brewコマンドを提供するHomebrewのインストール方法はHomebrewのサイトで確認してください。

brew.sh

以下のコマンドでcmakeをインストールします。

brew install cmake

LibTorchのインストール

VOICEVOXエンジンはコアライブラリを使って音声合成をします。 コアライブラリが動作するには、LibTorchをインストールしておく必要があります。 これもbrewコマンドでインストールできます。

brew install libtorch

ビルド用Python venv環境の用意

VOICEVOXエンジンのビルドにはPython 3を使います。 venvという仮想化機能を利用してモジュール類をインストールするので、以下のようにvenvを用意してください。

ビルドの動作確認はPython 3.9で行っています。

python3 -m venv venv

venvの有効化

仮想環境を有効にするには以下のようにします。

source ./venv/bin/activate

VOICEVOXコアライブラリのダウンロード

次に、VOICEVOXのコアライブラリをダウンロードしておきます。 VOICEVOXコアライブラリのバージョン0.7.4からMac向けにダイナミックライブラリが提供されているので、これを使うことにします。

curl -OL https://github.com/Hiroshiba/voicevox_core/releases/download/0.7.4/core.zip
ditto -x -k --sequesterRsrc --rsrc core.zip ./ # unzipコマンドでは展開に失敗するので、dittoコマンドを使う
rm core.zip
cd core
mv libcore_cpu.dylib libcore.dylib # ライブラリをリネームしておく

LD_LIBRARY_PATHとLIBRARY_PATHにパスを追加

VOICEVOXコアライブラリは、後ほどVOICEVOXコアモジュールをビルドする時に必要になります。 LD_LIBRARY_PATHLIBRARY_PATHに追加しておきます。

export LD_LIBRARY_PATH="$(pwd):${LD_LIBRARY_PATH:-}"
export LIBRARY_PATH="$(pwd):${LIBRARY_PATH:-}"

VOICEVOXコアモジュールのビルド

次に、VOICEVOXコアモジュールをビルドします。

VOICEVOXコアモジュールはVOICEVOXコアライブラリと同じGitHubリポジトリソースコードが公開されています。 以下のようにしてダウンロードとビルドを行います。

VOICEVOXコアモジュールのビルドの際に、NumPyのインクルードファイルを認識することができない問題があるため、環境変数CPATHにNumPyのインクルードファイルを追加しています。

cd ../ # 元のディレクトリに戻る
cuel -OL https://github.com/Hiroshiba/voicevox_core/archive/refs/tags/0.7.4.zip
ditto -x -k --sequesterRsrc --rsrc 0.7.4.zip ./ # unzipコマンドでは展開に失敗するので、dittoコマンドを使う
rm 0.7.4.zip
cd voicevox_core-0.7.4
cp ./core.h ./example/python/ # ヘッダファイルのコピー
cd ./example/python
pip install -r ./requirements.txt
NUMPY_INCLUDE=`python -c "import numpy; print(numpy.get_include())"`
CPATH="$NUMPY_INCLUDE:${CPATH:-}" pip install .

VOICEVOXエンジンのダウンロード

次に、VOICEVOXエンジンをダウンロードします。

cd ../ # 一旦ディレクトリを戻る
curl -OL https://github.com/Hiroshiba/voicevox_engine/archive/refs/tags/0.7.4.zip
ditto -x -k --sequesterRsrc --rsrc 0.7.4.zip ./
rm 0.7.4.zip

ライセンス情報生成用仮想環境の作成

ここで、VOICEVOXエンジンが使っているライブラリなどのライセンス情報を生成します。 最初に作った仮想環境ではうまく動作しないため、現在の仮想環境から抜けて別の仮想環境へ移ります。

deactivate
python3 -m venv gen_license_env
source ./gen_license_env/bin/activate

ライセンスファイルの生成

ライセンス生成用の仮想環境でライセンス生成に必要なモジュールをインストールし、ライセンス生成を行います。

cd voicevox_engine-0.7.4
pip install --upgrade pip setuptools wheel
pip install -r requirements-dev.txt pip-licenses
python generate_licenses.py > ./licenses.json

ビルド用仮想環境へ切り替え

ライセンス生成用の仮想環境の出番はこれで終了です。 ライセンス生成用の仮想環境から抜けて、最初の仮想環境へ戻りましょう。

cd ../ # 元のディレクトリに戻る
deactivate
source ./venv/bin/activate

VOICEVOXエンジンのビルド前提モジュールのインストール

VOICEVOXエンジンのビルドに必要なモジュールをインストールします。

cd voicevox_engine-0.7.4
pip install -r requirements-dev.txt

PyOpenJTalk辞書ファイルのダウンロード

ここで、VOICEVOXエンジンが利用するPyOpenJTalkの辞書ファイルをダウンロードしておきます。 この辞書ファイルはたまにダウンロードに失敗するので、失敗した場合は適宜リトライしてください。

python -c "import pyopenjtalk; pyopenjtalk._lazy_init()"

ビルド先の用意

VOICEVOXエンジンのビルドファイルの生成先を用意します。

cd ../ # 元のディレクトリに戻る
mkdir voicevox_engine_build
cd voicevox_engine_build

VOICEVOXエンジンのビルド

最後にVOICEVOXエンジンをビルドします。 ビルドにはとても時間がかかる上に電力消費が激しいので、時間とバッテリに余裕があるときに実行することをお勧めします。

python -m nuitka \
    --output-dir=./ \
    --standalone \
    --plugin-enable=numpy \
    --follow-import-to=numpy \
    --follow-import-to=aiofiles \
    --include-package=uvicorn \
    --include-package=anyio \
    --include-package-data=pyopenjtalk \
    --include-package-data=resampy \
    --include-package-data=llvmlite \
    --include-data-file=../voicevox_engine-0.7.4/VERSION.txt=./ \
    --include-data-file=../voicevox_engine-0.7.4/licenses.json=./ \
    --include-data-file=$(brew --prefix libtorch)/lib/*.dylib=./ \
    --include-data-file=../core/*.dylib=./ \
    --include-data-file=../core/*.bin=./ \
    --include-data-file=../core/metas.json=./ \
    --include-data-file=../venv/lib/python*/site-packages/scipy/.dylibs/*.dylib=./scipy/.dylibs/ \
    --include-data-file=../venv/lib/python*/site-packages/llvmlite/binding/*.dylib=./ \
    --include-data-file=../venv/lib/python*/site-packages/_soundfile_data/*=./_soundfile_data/ \
    --follow-imports \
    --no-prefer-source-code \
    ../voicevox_engine-0.7.4/run.py

成功すると、voicevox_engine_buildディレクトリの中にrun.distが生成されます。 その中にあるrunがVOICEVOXエンジンの実行ファイルです。

コアライブラリパスの設定

ただし、このままでは動きません。 コアライブラリ(libcore.dylib)のパスを@rpathで指定していますが、@rpath自体が指定されていないからです。

そこで、以下のコマンドで@rpath@executable_pathと同じ位置を指すように指定します。

# まだvoicevox_engine_buildディレクトリの中にいるのであれば...
install_name_tool -add_rpath @executable_path/. ./run.dist/run

以上でrun.distの中身だけを持ち出してVOICEVOXエンジンを動作させることができます。

Intel MacではUniversal(=aarch64対応)なVOICEVOXエンジンを作ることができない

OpenBLASをbrewコマンドでインストールすると、x64アーキテクチャのライブラリがインストールされますが、aarch64向けのライブラリがインストールされませんでした。 そのため、NumPyなどがaarch64に対応できずUniversalなVOICEVOXエンジンを作ることができていません。

Intel Macでaarch64のOpenBLASをインストールする方法など知っている方はぜひコメントください。

MacでVOICEVOXをビルドしてみた

第二弾の記事「MacでVOICEVOXをビルドしてみた」はこちら

k-hyoda.hatenablog.com