はじめに
SNSにて、しゃをみん氏が興味深い記事をツイートされていた。
昨日書きました。
— しゃをみん (@syao_ming) November 13, 2022
「コンピューターは遂に「音の高低」を理解した」と言えるほどの大きな進歩です。
【注目論文】Sinusoidal Frequency Estimation by Gradient Descent https://t.co/SbbNlZkdAW #Qiita @syao_mingより
上記の記事で紹介されている論文は、いわゆる複素正弦波オシレータが微分可能な形で定式化されることを示していた。 この「微分可能」なオシレータでは、元の波形を複素正弦波の重ね合わせで近似的に表現する。 そして各サンプル点において計算される波形の近似誤差に基づき、勾配降下法を利用してその誤差が小さくなるようにパラメータ全体を更新(訓練)できる。 ここでオシレータのパラメータとは、すなわち各複素正弦波の周波数、振幅、位相である。 特にPyTorchをはじめとする自動微分が得意な深層学習フレームワークの力を借りて訓練することで、 近似波形とそれにかかるパラメータたちを高速かつ容易に手に入れることができるというわけである。
そこで本記事では、日本語5母音に対して実際に近似を行ってみたので、その結果を紹介する。
実装
しゃをみん氏の記事で紹介されていたサンプルコードをもとに、簡単なクラスを定義して訓練を実施するスクリプトを書いた。
上記のスクリプトで読み込まれる、実験条件が書かれたconfigファイルは以下の通りである。
実験
実験条件
訓練データは下記サイトにて提供されている5母音のファイルを利用した(a_1.wav からo_1.wav)。 wsignal.sakura.ne.jp
音声の分析条件を示す。上記5母音は44100Hzだが、16000Hzにリサンプリングして利用した。
項目 | 設定 |
---|---|
基本周波数 (Hz) | 16000 |
フレーム長 | 1024 |
ホップ長 | 80 |
実際の訓練に使用したのは、パワーが最大となるフレーム(区間)の音声のみである。 上記の分析条件により、各母音ごとに1024点のデータ系列を使用した。
今回は128個の複素正弦波の和によって各母音を近似する。つまり128個の複素正弦波に対応するパラメータ(周波数、振幅、位相)を訓練対象とした。
なおオプティマイザはAdam、学習率は0.0001、エポック数は50,000とした。
計算機環境を示す。
計算機環境 | バージョンなど |
---|---|
OS | Ubuntu 22.04 |
CPU | Intel i9-9900K |
GPU | RTX2070 |
Python | 3.10.6 |
PyTorch | 1.13 |
実験結果
各母音について、元の波形と近似波形をそれぞれ示す。
今回は128個の正弦波なので、ところどころで誤差は目立つが、概ね近似できているといえるだろう。
おわりに
複素正弦波オシレータ を使ってみた、という記事であった。まだまだ可能性を秘めていると思われるので、読者各位も色々とアイディアを試してみると良いだろう。