oct2pyを使ってMATLAB版legacy-STRAIGHTをPythonから呼び出す

音声の分析合成ツールの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)。これは知らないとハマる点である。