『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章以降も読み進めていけたらと思います。
100℃の水と0℃の水は何℃になるか
はじめに
以下の問題を考えてみましょう。
(ただし熱のやり取りは外界としないものとします。比熱も一定であるとします。体積膨張なども無視できるとします。)
「100℃と0℃なので50℃!」と即答された方、正解です。後で確認するようにエネルギー保存則から計算できます。
それでは次の問題はどうでしょう。
(ただし熱のやり取りは熱機関以外とはしないものとします。比熱も一定であるとします。体積膨張なども無視できるとします。)
可逆という言葉が出てきました。断熱的に(仕事のみによって)変化させて元に戻すことができるという意味です。
先程の100℃の水と0℃の水を単に混ぜて50℃の水を作るのは不可逆です。50℃の水が勝手に100℃の水と0℃の水になることはありません。熱力学第二法則に反してしまいます。 また、何らかの仕事で元に戻そうとしても、内部エネルギーの合計は変わっていないため、熱力学第一法則に反してしまいます。
もし可逆に同じ温度にできたならば、仕事をする余地を考えて50℃より低くなっていそうです。そのようなことは出来るのでしょうか?
内部エネルギー
手始めに、この系の内部エネルギーを設定します。比熱が一定であるため、絶対温度、物質量のとき
と書くことができます*1。エネルギーの原点を適当にずらして比例式にしています。
単位物質量あたりの内部エネルギーにすると、
です。
単純に混ぜた場合
では、最初の100℃の水と0℃の水を単純に混ぜた場合を考えます。一般化しながら話を進めるため、、と設定しておきます。
それぞれ物質量だけあるとして、混ぜる前の内部エネルギーは、温度の方は、温度の方はです。そのときの内部エネルギーの総和は、
となります。一方で、混ぜたあとの温度を[tex: T{\mathrm{mix}}]とすると、混ぜたことで物質量がとなっているため、内部エネルギー[tex: U{\mathrm{mix}}]は、
と書けます。仕事も熱も外部とやり取りしていないため、熱力学第一法則より、内部エネルギーは不変で です。したがって、混ぜたあとの温度は
と求まります。やはり、平均で求めて良いことが分かりました。、のときは、です*2。
エントロピー
次に、可逆に同じ温度にする場合を考えるために、エントロピーを求めておきます。単位物質量あたりのエントロピーを考えると、
の関係あります*3。は単位物質量あたりの内部エネルギーです。内部エネルギーの表式を代入して、
として、これを積分することで、
と単位物質量あたりのエントロピーの表式が得られます。物質量のときのエントロピーは
となります。
以下では、温度でのエントロピーをと基準にとって計算を進めます。
エントロピー原理
熱力学の定理に「エントロピー原理」があります*4。これは、断熱過程のみでの状態変化が可能かどうかはエントロピーの大小のみによって知ることができるというものです。
詳しく書くと、エントロピー原理によって、熱平衡状態(エントロピー)から熱平衡状態(エントロピー)へ断熱過程のみで到達できることと、であることが必要十分条件となります。
特に、熱平衡状態と熱平衡状態の変化が可逆で、どちらからも他方に断熱過程で変化できるとき、かつでなくてはならないので、
が言えます。可逆であることは、エントロピーが等しいと読み替えて良いことが分かりました。
可逆操作で同じ温度にした場合
準備が整ったので、可逆に同じ温度にした場合を考えていきます。 それぞれ物質量だけあるとして、混ぜる前のエントロピーは、温度の方は、温度の方はです。エントロピーの総和は、
となります。一方で、可逆操作後の温度をとすると、その温度の物質量がであるため、可逆操作後のエントロピーは、
と書けます。可逆の場合のエントロピー原理より、 です。を整理しながら比較すると、可逆操作後の温度は
と求まります。単純に混ぜた時が相加平均だったのに対して、こちらは温度の相乗平均になっています。
「相乗平均相加平均」なので、可逆操作後の温度は単純に混ぜたあとの温度より低くなります。
また、内部エネルギーは可逆操作を経て、外界に何らかの仕事を行い、充電池やバネなどの位置エネルギーとして蓄えられることになります。減少分の内部エネルギーは、
と計算できます。
、として実際どうなるのか見てみます。なお、ここでの計算は比が含まれるため、絶対温度で行わななければなりません。
可逆に操作することで、100℃の水と0℃の水から約46.1℃の水が生まれることが分かります。
ついでに水1kgのときに、どれくらいのエネルギーを仕事として取り出したのか見ておきます。水の比熱は、カロリーの定義より*5、
です。物質量の部分を質量に読み替えて、内部エネルギーの変化分をみると、
が得られます。当たり前ですが、水2kgを約46.1℃から50℃にするエネルギーがそのまま仕事になっています。単純に混ぜた場合はその分のエネルギーを「無駄に」温度上昇に使ってしまったから不可逆になったとも言えます。
おわりに
なるべく簡単な例でエントロピーを扱おうとしたのですが、またそこそこ長い文量になってしまいました。可逆操作の理解に少しでも貢献できたら何よりです。
1kgずつ用意した100℃の水と0℃の水が、約46℃の水と約33kJの仕事になるという、普段はあまり考えない事実を熱力学が教えてくれました。
今回の例は、以下の本で扱われている題材を下敷きにしています。他の熱力学の教科書とはかなり毛色の違う本です。いずれ、この本の紹介をすることになると思います。
理想気体の基本関係式(エントロピー表示)の導出
はじめに
熱力学では熱力学変数の関係を状態方程式で表して,個々の系を表現します。状態方程式のとり方は様々ありますが,清水本[*1]や田崎本[*2],佐々本[*3]などで述べられているように,基本関係式(fundamental equations)ないし完全な熱力学関数(conplete thermodynamic function)と呼ばれる,特定の熱力学変数の組で関数を構成すると見通しが良くなることが知られています。
たとえば,内部エネルギーをエントロピー,体積,物質量 で表す,
は基本関係式になります。なぜなら,熱力学第一法則と熱力学第二法則を組み合わせて得られる微分形式
から読み取れるように,温度,圧力,化学ポテンシャルの表式がの偏微分から,
のように導けるからです。
基本関係式は,上で述べた内部エネルギー表示の他に,エントロピー表示,ヘルムホルツの自由エネルギー表示,ギブスの自由エネルギー表示,エンタルピー表示などがあります。 エントロピー表示を用いた場合は,対応する微分形式は
となり,これは先程の内部エネルギー表示での微分形式を移項してについて整理したものと見なせます*4。
(は定数)を,おなじみの状態方程式
と内部エネルギーの式
からなるべくシンプルに導出します。
変数の削減(単位物質量あたり)
まず,導出の前段階として,熱力学変数の示量性に注目して変数を削減します。示量性とは系のサイズを倍したときに,元のサイズの系の倍の物理量が得られる性質です。エントロピーを例に式にすると
のようになります。
ここでさらにとすることで,
と,単位物質量あたりのエントロピー,内部エネルギー,体積の関係式が得られます。 この式では物質量を考えないで済むため,式の導出が簡潔に行なえます。微分形式では,
となります。元の式から,化学ポテンシャルをひとまず無視して進められるようになりました。
理想気体の状態方程式の代入
状態方程式を単位物質量あたりの関係に置き換えます。温度や圧力は示強性の変数なので,そのままで良いことに注意すると,状態方程式からは,
内部エネルギーの式からは,
が得られます。少し細工を加えてあるように,微分形式の係数がきれいに表されていることが見て取れます。
として,これをについて積分することで,
が得られます。ここでは基準状態を表す定数です。についても整理すれば,
となります。単位物質量あたりのエントロピーについての基本関係式が得られました。
最後に単位物質量あたりの物理量を元に戻します。途中で導入した定数も,
と置き直すことで,最初に述べたエントロピー表示の基本関係式
が得られます。これらの導出を経て,式にが現れるのは状態方程式の変形でちょうどや積分が現れるためであったこと,についての指数がなのは単純にやの示量性を確保するためであったと理解できます。
理想気体の化学ポテンシャル(おまけ)
エントロピー表示の基本関係式が得られたため,その偏微分から化学ポテンシャルの表式が計算できます。
最後の行では,第1項と第2項の和が,単純にとなっているため置き換えました。したがって,
が得られます。
実のところ,これは偏微分をしなくても得られます。系の示量性の制約から,一般的に
が成立しなくてはならないためです(これは微分形式ではありません!)。理想気体の場合には,
となり,偏微分で導いた表式と一致していることが分かります。
おわりに
理想気体のエントロピー表示の基本関係式の導出を行いました。清水本では天下り的に与えられ,他の教科書でも主にの変数での扱いが中心なので,高校物理の知識とつなげるためにも直接の導出を試みました。 理想気体の状態方程式が,まるでパズルのピースがそこに嵌るかのようにエントロピーの微分形式と適合しているのは気持ちが良いところです。なお,ここではスルーしましたが熱力学的絶対温度と理想気体温度が一致することは熱力学第二法則での議論を行わないと示せないため,それらが済んだあとの導出ということになります。
数式記述の練習も兼ねていたのですが,思いのほか長くなってしまい良い練習となりました。
今後も熱力学関連で記事を書いていけたらと思います。