音声の分析合成ツールの1つであるlegacy-STRAIGHTが公開されている。
github.com
このライブラリはMATLAB/Octaveで利用可能なm-fileとして書かれているため、Pythonからは利用できないと諦めていたのだが、最近、m-fileをPythonから起動できるoct2pyなるパッケージの存在を知った。
github.com
タイトルにある通り、oct2py経由でlegacy-STRAIGHTを呼び出すことができたので、本記事はその記録である。
まず公式にある通りoct2pyをインストールする:
pip install oct2py
次にlegacy-STRAIGHTをダウンロードし、src/にある各種ライブラリ群を適切なディレクトリに置く。
Octave forgeからsignalパッケージをダウンロードし、適切なディレクトリに置く。
octave.sourceforge.io
テスト用のwavを用意して、以下のPythonスクリプトを実行する。ちなみにvaiueo2d.wavはlegacy-STRAIGHTのsrc/内にある。
from oct2py import octave octave.addpath('/path/to/straight') octave.addpath('/path/to/signal') x, fs = octave.audioread('vaiueo2d.wav', nout=2) f0raw = octave.MulticueF0v14(x, fs) ap = octave.exstraightAPind(x, fs, f0raw) n3sgram = octave.exstraightspec(x, f0raw, fs) synthesized_signal = octave.exstraightsynth(f0raw, n3sgram, ap, fs) octave.audiowrite('out_file.wav', synthesized_signal / 32768, fs)
なお上記のスクリプトにおいて、audioreadの第2引数noutが曲者であった。oct2pyは仕様として、出力の戻り値の個数は明示的に指定する必要がある(noutのデフォルト値は1)。これは知らないとハマる点である。