SHAREVOX core を動かしてみる

Try to run SHAREVOX core


2022/10/19
藤田昭人


前回 「楽しげなことを、コツコツと…」と語りましたが…

苦しくなると 「72時間連続コーディング」 とか無意味なパワープレーを 繰り出していたのも今は昔、 最近では MacBook に1時間程度向かうたびに 休憩を入れるようになっています。 休憩と言ってもテレビで YouTube を見るだけなんですけどね。 画面からの距離を長めに取ると 目が少し休まる気がするのです。 リモートワークが定着して良かった良かった。

お気に入りは「YOASOBI 切り抜き」ですね。 間にCMが挿入される回数が少ないので 流しっぱなしにしてます。 YOASOBI というと ボカロPとボーカリストの 「小説を音楽にするユニット」 なんだそうですが、 ふたりはトークも上手なんですねぇ*1。 おかげでポケモンの最近のキャラクターを 知りましたました😀

この映像、 彼らのオールナイトニッポンのDJを短く切って 映像を付けているようです。 オールナイトニッポンと言えば、 僕は「笑福亭鶴光」だとか「あのねのね」だとか、 あるいは「ビートたけし」が リアルタイムの世代なんですが、 彼らのワイルドなトークだけではなく、 AYASE氏とIKURA嬢のマイルドなトークでも 違和感なく聴けるのが不思議なところ。 やはりDJ特有の会話のリズム感が 魅力なんでしょうかねぇ?

さてさて…


SHAREVOX core というライブラリ

音声合成といえば有料サービスが花盛りですが…

本稿では、 前回チラッと触れた SHAREVOX core の動かし方を紹介してみようかと思います。

このライブラリには、 その核になる音声合成に関わる 機械学習のコードが ギュッと詰まっています。 もうひとつの特徴は 機械学習の実行環境を選ばないことです。 実は「機械学習というとGPUを搭載してない コンピュータでは動かない」と思い込んでたのですが、 このライブラリをリンクしたテストプログラムは 手持ちの Intel MacBook Pro でも あっさり動いてしまいました。

このライブラリ 「タダで音声合成をしたい人」 には朗報なんではないでしょうか?

という事で、 やや無謀にも 手持ちの Intel Mac Book Pro を使って ライブラリのバイナリ配布を動かしてみます。 やはり「論より RUN」でしょう😀


ライブラリのソースとバイナリのファイルをダウンロードする

Github においてある SHAREVOX core の ソース には README.md が用意されており、 ライブラリのダウンロード、展開、ビルドの手順が紹介されています。 が、ここでは僕が MacBook Pro (Retina, 15-inch, Mid 2014)/macOS Big Sur verion 11.7 で実行した手順を紹介します。

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

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

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

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

作業ディレクトリの下に archive サブディレクトリを作成し、 以上の4つのファイルをダウンロードして、 各々を展開しました。


SHAREVOX core のサンプルプログラムをビルドする。

元の作業ディレクトリに戻って…
まずは SHAREVOX core のソースツリーを展開します。

先ほどダウンロードしてきたソースの ZIP ファイルを移動、

$ mv archive/sharevox_core-0.1.2 .
$ cd sharevox_core-0.1.2/

あるいはコピーします。

$ cp -r  archive/sharevox_core-0.1.2 .
$ cd sharevox_core-0.1.2/

以降、このソースツリーを作業のベースに、SHAREVOX core の C++ サンプルコード の手順に従って そのほかのバイナリ・ファイルを所定のディレクトリにコピーしていきます*2

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

前述のダウンロード・展開したバイナリファイルを example/cpp/unix にコピーします。

  • sharevox_core のバイナリ・ライブラリ
$ cp  ../archive/sharevox_core-osx-universal2-cpu-0.1.2/libcore.dylib example/cpp/unix/
  • ONNX Runtime の共有ライブラリ
$ cp -r ../archive/onnxruntime-osx-universal2-1.10.0/lib/*.dylib example/cpp/unix/
$ cp -r ../archive/open_jtalk_dic_utf_8-1.11 example/cpp/unix/

以上のコピーを終えると、 example/cpp/unix/ には 以下のファイル・フォルダが存在することになります。

$ ls example/cpp/unix/ | cat
CMakeLists.txt
README.md
libcore.dylib
libonnxruntime.1.10.0.dylib
libonnxruntime.dylib
open_jtalk_dic_utf_8-1.11
simple_tts.cpp
$ 

C++サンプルプログラムのディレクトリに移動して、 CMake(3.16 以上)を使ったビルドを行います。

  • "cmake -S . -B build" と "cmake --build build" を実行する
$ cd example/cpp/unix/
$ cmake -S . -B build
-- The C compiler identification is AppleClang 13.0.0.13000029
-- The CXX compiler identification is AppleClang 13.0.0.13000029
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CORE_LIB: /Users/fujita/xtr/BookBot/BookBot3/02_sharevox_core/sharevox_core-0.1.2-A/example/cpp/unix/libcore.dylib
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/fujita/xtr/BookBot/BookBot3/02_sharevox_core/sharevox_core-0.1.2-A/example/cpp/unix/build
$ cmake --build build
[ 50%] Building CXX object CMakeFiles/simple_tts.dir/simple_tts.cpp.o
[100%] Linking CXX executable simple_tts
[100%] Built target simple_tts
$ 

これで build/simple_tts がビルドできました。 実行してみましょう*3

$ ls build/simple_tts
$ build/simple_tts これはテストです
coreの初期化中...
openjtalk辞書の読み込み中...
音声生成中...
音声ファイル保存中...
音声ファイル保存完了 (audio.wav)
$ 

引数で渡した日本語のフレーズを 発話した WAV ファイルが生成されます。 Mac Book には GPU が搭載されていないので 「coreの初期化中...」 は少し待たされます。

WAV ファイルが生成されたら 発話させてみましょう。

$ afplay audio.wav
$ 

男性の声で「これはテストです」と 読み上げてくれたでしょうか?


サンプルプログラムでつきよみちゃんに発話させてみる

調べてみると simple_tts は 学習済みの言語モデルを使って 引数で渡されるテキストを読み上げているようです。 そこで言語モデルを差し替えると 声色が変わるのか試してみました。

実は SHAREVOX Core 0.1.0 には SHAREVOX のリリースに付属する言語モデルのセットも収録されてます。

これをダウンロード、展開すると model というフォルダが現れますので、 SHAREVOX Core 0.1.2 の model と差し替えてみます。

元の sharevox_core-0.1.2 ディレクトリに戻って…

$ mv model model-0.1.2
$ mv ../archive/model .
$ 

これで言語モデルの差し替えができました。

さらに simple_tts.cpp の変数 speaker_id を 0 から 4 に変更します。

$ cd example/cpp/unix
$ (エディタで simple_tts.cpp を修正)
$ diff -u simple_tts.cpp.orig simple_tts.cpp
--- simple_tts.cpp.orig 2022-10-19 10:39:11.000000000 +0900
+++ simple_tts.cpp  2022-10-19 10:39:29.000000000 +0900
@@ -34,7 +34,7 @@

   std::cout << "音声生成中..." << std::endl;

-  int64_t speaker_id = 0;
+  int64_t speaker_id = 4;
   int output_binary_size = 0;
   uint8_t *output_wav = nullptr;

$ 

修正が終わったら simple_tts をリビルドしましょう。

$ cd build/
$ make
Consolidate compiler generated dependencies of target simple_tts
[ 50%] Building CXX object CMakeFiles/simple_tts.dir/simple_tts.cpp.o
[100%] Linking CXX executable simple_tts
[100%] Built target simple_tts
$ cd ..
$ 

先ほどと同じように WAV ファイルを生成し、 発話させてみましょう。

$ build/simple_tts これはテストです
coreの初期化中...
openjtalk辞書の読み込み中...
音声生成中...
音声ファイル保存中...
音声ファイル保存完了 (audio.wav)
$ afplay audio.wav
$

いかがでしょう? 女性の声色に変わりましたね。 これがつくよみちゃん( speaker_id = 4 )の声です。 少々早口のような気もしますが…

それではお約束の…

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

以上

*1:YOASOBI については 他にももう少し語りたいのですが、 それはまた後日。

*2:実は Python サンプルコードにもトライしましたが、 うまく実行できませんでした。
ケアレスミスのようなので、 後日リトライしてみるつもりです。

*3:build/simple_tts の初回実行時には次のダイアログが表示されます。

これはリンクした libcore.dylib の証明書がないため表示されます。 その際には、 アップルメニューから「システム環境設定」を選択して 「セキュリティとプライバシー」 をクリックし、 以下のダイアログの「一般」パネルで「このまま許可」選んでください。

このダイアログは libonnxruntime.1.10.0.dylib でも表示されます。 なので、 build/simple_tts を実行するためには 都合2回「このまま許可」を選択することになります。