SHAREVOX core をビルドしてみる

Try to build SHAREVOX core


2022/10/30
藤田昭人


前回YouTube の話から始めましたが…

今回はテレビの話。 完全に昭和世代の僕は 今もってテレビ依存の生活をしています。 最近、朝のニュースを付けてると 「1ドル=150円」だとか、 「マクドナルドが立て続けに値上げした」 とか、果ては 「ロシアに爆撃されたウクライナの街角」 の映像まで連日見せられています。 ティーンエイジャーの諸君にも 「円安」や「戦争」の話はピンと来なくても 「マクドナルドの値上げ」は あまり経験のない 実感的な話ではないでしょうか?

確かに、僕のような老人にも、 昨年と一昨年のパンデミックは未知の体験で、 正直かなりビビっていたのですが…

3年目のコロナ禍にもどこか慣れてしまった 今年の印象はだいぶん違ったものになりました。 例えば「円安」。 僕らは子供の頃 「1ドル=360円」 をリアルタイムで経験しているので、 若い方々ほどは衝撃的には受け止めません*1。 このところ毎日ウクライナから届く 「爆撃された街角の映像」 にも既視感があります*2。 こういった子供の頃の生活に根ざした体験は いつまでも記憶に残るものなんですね。

今年は…

なにやら50年前に舞い戻ったような 不安げな社会の空気を感じ取りつつ…
このブログでは子供の頃感じた 楽しげな感覚に突き動かされている気が しています😁


またまたファイルをダウンロードする。

さて…

本稿でのお題は SHAREVOX core を ソースコードからビルドします。 今回も僕が MacBook Pro (Retina, 15-inch, Mid 2014)/macOS Big Sur verion 11.7 で実行した手順を紹介します。 ちなみにビルドには cmake 3.20.2 を使いました*3

まずはライブラリのソースとバイナリのファイルをダウンロードするところから。 任意の作業ディレクトリに移動してください。

今回も SHAREVOX Core 0.1.2 を使用しました。次のファイルをダウンロードします。

今回はビルドするので、 ダウンロードするのはソースだけ。

次に ONNX Runtime v1.10.0 のライブラリをダウンロードします。

これも前回とおなじ。

一方、Open JTalk のソースコードは VOICEVOX のリポジトリからダウンロードします*4

このリポジトリはリリース・タグが設定されていないので、 上記の URL から「Code」「 ZIP ファイルをダウンロード」を指定してください。

さらに Open JTalk の辞書セット(UTF-8)をダウンロードします。

これは simple_tts を動かす際に必要になります。

いずれも前回同様、 作業ディレクトリの下の archive ディレクトリにダウンロードして、 その場でアーカイブファイルを 展開することにします。


ビルドのためのソースツリーを構築する

README.md の コアライブラリのビルド で紹介されている手順通りに エラー無しでビルドするには、 ソースツリーの構築に注意する必要があります。

【注】ターミナルソフトで UNIX コマンドを使ってください。

  • SHAREVOX Core 0.1.2のソースツリーを archive ディレクトリの隣に作る
$ cd <作業ディレクトリ>
$ cp -r archive/sharevox_core-0.1.2 .
$ 
  • sharevox_core-0.1.2/onnxruntimeをコピー
$ cp -r archive/onnxruntime-osx-universal2-1.10.0 sharevox_core-0.1.2/onnxruntime
$ 
  • open_jtalkを移動
$ cp -r archive/open_jtalk-1.11 sharevox_core-0.1.2/open_jtalk
$ 
  • core/src/engine/openjtalk.cpp を次のように修正
    text2mecabの引数に "8192" を追加します。
$ cd sharevox_core-0.1.2/core/src/engine/
$ cp openjtalk.cpp openjtalk.cpp.orig
$ diff -u openjtalk.cpp.orig openjtalk.cpp
--- openjtalk.cpp.orig  2022-10-28 17:26:57.000000000 +0900
+++ openjtalk.cpp       2022-10-28 17:27:13.000000000 +0900
@@ -15,7 +15,7 @@
 namespace voicevox::core::engine {
 std::vector<std::string> OpenJTalk::extract_fullcontext(std::string text) {
   char buff[8192];
-  text2mecab(buff, text.c_str());
+  text2mecab(buff, 8192, text.c_str());
   Mecab_analysis(&mecab, buff);
   mecab2njd(&njd, Mecab_get_feature(&mecab), Mecab_get_size(&mecab));
   njd_set_pronunciation(&njd);
$ 

これで、README.md の説明どおりに ビルドできます。


SHAREVOX core をビルドする

作業ディレクトリに戻って…

SHAREVOX core の README.md の コアライブラリのビルド の項目の手順にしたがってビルドします。

$ cd sharevox_core-0.1.2
$ mkdir build
$ cd build
$ cmake ..

<中略>

Required HTSEngine not found
-- Configuring done
-- Generating done

$ cmake --build . --config Release
[  2%] Building C object open_jtalk/src/CMakeFiles/openjtalk.dir/jpcommon/jpcommon.c.o

<中略>

[ 97%] Building CXX object core/CMakeFiles/core.dir/src/engine/synthesis_engine.cpp.o
[100%] Linking CXX shared library libcore.dylib
[100%] Built target core
$ 

ご存知のように、 この "cmake .." がビルドするための Makefile を用意するプロセスで、 続く "cmake --build . --config Release" が (実際にソースをコンパイルする) ビルドのプロセスです。

最後に "cmake --install ." で 所定のディレクトリにインストールすると…

$ cmake --install .

<中略>

$ cd .. 
$ ls sharevox_core-0.1.2/core/lib/
core.h              libonnxruntime.dylib
libcore.dylib           libopenjtalk.a
libonnxruntime.1.10.0.dylib
$

それまで存在しなかった lib ディレクトリが作成されて、 ビルドされたバイナリ・ライブラリがコピーされます。


SHAREVOX core をテストしてみる

さらに README.md の コアライブラリのビルド の「C++のテスト実行」の手順を実行してみましょう。

$ cmake -S . -B test_build -DBUILD_TEST=YES

<中略>

[100%] Linking CXX executable unit_test
dyld: Library not loaded: @rpath/libonnxruntime.1.10.0.dylib
  Referenced from: 02_sharevox_core/sharevox_core-0.1.2/test_build/tests/unit_test
  Reason: no suitable image found.  Did find:
    02_sharevox_core/sharevox_core-0.1.2/onnxruntime/lib/libonnxruntime.1.10.0.dylib: code signature in (02_sharevox_core/sharevox_core-0.1.2/onnxruntime/lib/libonnxruntime.1.10.0.dylib) not valid for use in process using Library Validation: library load disallowed by system policy
CMake Error at 02_sharevox_core/sharevox_core-0.1.2/test_build/_deps/catch2-src/extras/CatchAddTests.cmake:45 (message):
  Error running test executable
  '02_sharevox_core/sharevox_core-0.1.2/test_build/tests/unit_test':


    Result: Subprocess aborted
    Output: 



make[2]: *** [tests/unit_test] Error 1
make[2]: *** Deleting file `tests/unit_test'
make[1]: *** [tests/CMakeFiles/unit_test.dir/all] Error 2
make: *** [all] Error 2
$ 

テスト用のプログラムをリンクするところでコケます。 これは 前回 の脚注で説明したライブラリの証明書の問題です。 前回同様、 アップルメニューから「システム環境設定」を選択して 「セキュリティとプライバシー」 をクリックし、 ダイアログの「一般」パネルで「このまま許可」選んでください。 次のとおり cmake --build test_build が再実行できます。

$ cmake --build test_build
Consolidate compiler generated dependencies of target openjtalk
[ 31%] Built target openjtalk
Consolidate compiler generated dependencies of target core
[ 38%] Built target core
Consolidate compiler generated dependencies of target Catch2
[ 96%] Built target Catch2
Consolidate compiler generated dependencies of target Catch2WithMain
[ 98%] Built target Catch2WithMain
Consolidate compiler generated dependencies of target unit_test
[ 99%] Linking CXX executable unit_test
[100%] Built target unit_test
$ ctest --test-dir test_build --verbose
Internal ctest changing into directory: 02_sharevox_core/sharevox_core-0.1.2/test_build
UpdateCTestConfiguration  from :02_sharevox_core/sharevox_core-0.1.2/test_build/DartConfiguration.tcl
UpdateCTestConfiguration  from :02_sharevox_core/sharevox_core-0.1.2/test_build/DartConfiguration.tcl
Test project 02_sharevox_core/sharevox_core-0.1.2/test_build
Constructing a list of tests
Done constructing a list of tests
Updating test list for fixtures
Added 0 tests to meet fixture requirements
Checking test dependency graph...
Checking test dependency graph end
test 1
    Start 1: extract_one_character

1: Test command: 02_sharevox_core/sharevox_core-0.1.2/test_build/tests/unit_test "extract_one_character"
1: Test timeout computed to be: 10000000
1: Filters: extract_one_character
1: Randomness seeded to: 3858558281
1: ===============================================================================
1: All tests passed (6 assertions in 1 test case)
1: 
1/1 Test #1: extract_one_character ............   Passed    0.01 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) =   0.02 sec
$ 

以上で「C++のテスト実行」は終了です。

この状態で 前回 の「SHAREVOX core のサンプルプログラムをビルドする」の手順を 実行すれば、再び男性の声を聞くことができます。


今回は SHAREVOX core のビルドの手順を紹介しました。 「前回、バイナリライブラリで動かしたのに、何で?」 と思ってらっしゃる方も多いかと…

そもそも僕は そういう無駄な努力が 大好きなヤツですが…*5 *6

ソースからのビルドは コンパイル対象となるソースコードを スキャンしていくプロセスですので、 注意深く観察していれば 対象となるソフトウェアについて より多くの情報が引き出せます。

例えば、今回の SHAREVOX core の場合、 前回 紹介した simple_tts をビルドするためには onnxruntime のライブラリと open_jtalk の辞書ファイルが必要だったので この二つが関連することは分かっていたのですが、 ソースのビルド・プロセスから さらに次のことがわかります。

  • SHAREVOX core は比較的小さなライブラリである
  • 下位で open_jtalk と onnxruntime を呼び出している?
  • 各々はトップディレクトリ以下の次のサブディレクトリに格納されている
  • onnxruntime は公開されているコードを無修正で利用している

…とまぁ、 現時点で分かっているのはこれくらい。

とはいえ、simple_tts でちゃんと WAV ファイルが生成できることが確認できたので、 次は model ディレクトリを差し替えると つくよみちゃんの声に切り替わる理由を 調べてみたいと思っています。

それではお約束の…

#つくよみちゃんを利用してフォロワー増やしたい

以上

*1:「なんで、子供に為替がわかるんだ!!」 とのツッコミがありそうですが…
僕が子供の頃は アメリカやヨーロッパから輸入されるお菓子は とんでもない高級品で、 危篤な人がその年のお歳暮に送ってくれないと、 僕たちの口には入らない代物だったのです😀

*2:僕らはベトナム戦争をリアルタイムで体験した世代、 つまり日常的な報道番組で 戦場の様子を(テレビ越しに) 目撃した世代ですから。

*3:README.md によれば CMake 3.16以上とのことです。

*4:どうやら VOICEVOX/SHAREVOX で使用する Open JTalk のソースコードは 独自に修正されているようです。

*5:実際、中学生の僕といえば…

ゴミ捨て場で拾った 壊れたトランジスタラジオを 再び鳴らそうとハンダゴテを振り回したり…

組立説明書が無くなったプラモデルを引き取って 箱に印刷されている完成写真と睨めっこして、 ちゃんと完成すべく、 ああでもない、 こうでもないと…

無駄なことに労力を注ぎ込む パッとしない変わった趣味の男子でした😁

*6:これが、先日の 「今、16歳の自分に出会ったら、 今の自分は何を語りかけるのか?」 というお題に僕は引っかかり続けている理由でもあります😀

前々回 にもチラッと触れたように、今の僕は 「これから就職を控えた学生諸君に何かをいう」 立場でもあるのですが、 自分の経験から言えることは 「16歳で 自分の人生の目標が定まっている人なんて ほとんどいない」 ということだけなんです。

実際「16歳の僕」がやっていた 周りの人たちには全く理解されない 「無駄な努力」と「自己満足」が (というか「それができる能力」が) その後の僕の人生を切り開いたことは 否定しようがない事実。 だって、僕が16歳の頃は プログラマなんて職業はみんな 知らなかったからね (もちろん親だって)。 プログラマが社会的に広く認知される 職業になったのはそこから10年あまり 経過した後でした。

それに、 当時は周囲から「無駄な努力」と 言われ続けていたことを 「16歳の僕」は何か後ろめたく 感じていたのも本当の話。 なので、今の僕は…

「迷うな。ブレるな。 自分を信じろ。やがて、その力が お前の人生を切り開く時が必ずやってくる!!」

…と彼に語ってやりたいと 思うのが正直なところです。

が、それは単に 僕が運が良かっただけ かもしれない。 これが今の僕の 酷く悩ましい問題 でもあります。