『Pythonで学ぶ音声合成』をWindows10でやってみる(第4章)
はじめに
『Pythonで学ぶ音声合成』で音声合成の基礎を身に着けたかったため、Windows環境で実践してみました。 ただ、Windows環境は公式サポートがされていないようで様々なエラーに見舞われたため、その対処を記録します。 動作確認として、深層学習が含まれない第4章の内容まで読み進めました。
プログラミング周りが初心者のため、変な記述があるかもしれませんがご了承ください。
インプレス社の書籍サイト book.impress.co.jp
公式ドキュメントサイト r9y9.github.io
ttslearnのGitHubページ github.com
環境構築
環境構築の手順は金子邦彦研究室のサイトを参考にしました。 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ではなく、PowerShellでpythonを実行しているため、出力時にはファイルに書き出すようにしました。
グラフが出力されない(ターミナルに入力時)
plt.show()
でグラフ描画の指示をする。
または、plt.savefig('out.png')
として、pngファイルを作成して確認する。ttslearn.notebook
のsavefig
も実行できたので、公式ドキュメントに従ってファイルを作成しても大丈夫です。
wavデータが聞けない(ターミナルに入力時)
from IPython.display import Audio
とAudio(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章以降も読み進めていけたらと思います。