『Pythonで学ぶ音声合成』をWindows10でやってみる(第4章)

はじめに

Pythonで学ぶ音声合成』で音声合成の基礎を身に着けたかったため、Windows環境で実践してみました。 ただ、Windows環境は公式サポートがされていないようで様々なエラーに見舞われたため、その対処を記録します。 動作確認として、深層学習が含まれない第4章の内容まで読み進めました。

プログラミング周りが初心者のため、変な記述があるかもしれませんがご了承ください。

環境構築

環境構築の手順は金子邦彦研究室のサイトを参考にしました。 www.kkaneko.jp

バージョンは Python 3.9.7, CUDA 11.1, cuDNN 8.2.3, PyTorch 1.9.0 を使うことにしました。 また、C++周りは Visual Studio 2019 Community をインストールしました。

Windows固有のエラー対応

ttslearn に含まれる pyopenjtalk がpip installできない

環境構築でインストールしたVisual Basic 2019 Community に含まれるCMakeにPATHを通すことで解決しました。自分の環境では、

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin

でした。以下のサイトを参照しました。 teitoku-window.hatenablog.com

librosaが管理者権限でないとimportできない

C:\Program Files\Python39\Lib\site-packages\librosa のフォルダプロパティを開き、Usersのアクセス許可で「書き込み」を許可すれば通るようになりました。pythonのインストールを全ユーザーで行ったため?

from ttslearn.dnntts import DNNTTS などができない

ttslearn の pretraind にある init.py が os.environ["HOME"] を使用しているものの、環境変数HOMEが無いというエラーのようです。ユーザー環境変数HOME を C:\Users\[ユーザー名] で追加したら通るようになりました。

2021/9/15にGitHubで修正済み

ターミナル出力関係

想定されているjupyter notebookではなく、PowerShellpythonを実行しているため、出力時にはファイルに書き出すようにしました。

グラフが出力されない(ターミナルに入力時)

plt.show() でグラフ描画の指示をする。

または、plt.savefig('out.png')として、pngファイルを作成して確認する。ttslearn.notebooksavefigも実行できたので、公式ドキュメントに従ってファイルを作成しても大丈夫です。

wavデータが聞けない(ターミナルに入力時)

from IPython.display import AudioAudio(wav, rate=sr)の代わりに、scipy.io.wavfile.write でwavファイルを作成して聞くことにする。

from scipy.io.wavfile import write
write('out.wav', sr, wav)

を実行する。

上記の方法で作成したwavファイルの音声が大音量・ノイズまみれになる

上記の方法で、逆短時間フーリエ変換(ISTFT)や位相復元後のデータからwavファイルを作成すると、聞くに堪えない異常なwavファイルが作成されます。引数が浮動小数点型float32にも関わらず、scipy.io.wavfile.write で指定されている値の範囲[-1.0, 1.0]を外れているためです。

例えば、p.84のISTFT後でwrite('istft.wav', sr, x_hat)を実行すると発生するので、write('istft.wav', sr, x_hat.astype(np.int16))と整数型int16に型変換を行ってから出力します。

誤植

p.78 フーリエ変換のグラフの周波数がおかしい

freqは大きい整数どうしの掛け算が含まれるので、np.arnge(len(X)) * srが先に行われると桁あふれを起こします。環境によって結果が変わるようです。

freq = np.arange(len(X)) / len(X) * sr / 2 

などとして解決します。2021/9/21にGithubでは修正済み

p.82 stft関数の定義

flame_shiftは関数内の変数ではないので、M = (len(x) - N) // S + 1と修正する。

おわりに

とりあえずWindowsでも読み進めて行けるのではという希望が持てました。Visual Basicのインストールと環境変数PATH、HOMEを解決すれば大丈夫そうです。 亀の歩みで第5章以降も読み進めていけたらと思います。