2つの音声の波形の類似率を比較して、どれだけ自分の英語の発音がネイティブと似ているかを実装したい。
文系の高卒なので、物理的な横文字の用語に抵抗を覚えるが、頑張って立ち向かってみる。
使用ライブラリWave-Comparatorはコチラ
5年前のライブラリなので、頑張って調整しながら使わさせていただく。
使用環境はUbuntu20.04, nginx, php8.0-fpm
Pythonはあまり触ったことない。
目次
- Python仮想環境の構築
- PHPから実行
- TypeError: load() takes 1 positional argument but 2 were given
- RuntimeError: cannot cache function '__o_fold': no locator available for file
- TypeError: spectral_centroid() takes 0 positional arguments but 2 were given
- AttributeError: module 'librosa.core' has no attribute 'dtw'
- RuntimeError: cannot cache function '__o_fold': no locator available for file
Python仮想環境の構築
まずはPythonを動かす仮想環境をプロジェクト内に用意する。公式のマニュアルはコチラ
# 仮想環境の作成
$ python3 -m venv ディレクトリ名
# 仮想環境への切り替え
$ . ディレクトリ名/bin/activate
(ディレクトリ名)$
# 必要なパッケージのインストール ここではnumpy(ベクトル演算)とlibrosa(音声データ読み込み)が必要だった
(ディレクトリ名)$ python3 -m pip install numpy librosa
PHPから実行
#webサーバーから起動するpythonは、先ほど用意した環境のものを使う
$command="ディレクトリ名/bin/python3 Wave-Comparator-master/script/comp.py 2>&1";
exec($command,$output,$result);
ここからエラーと格闘していく。
TypeError: load() takes 1 positional argument but 2 were given
x, fs = librosa.load(path, DEFAULT_FS) #35行目のこれの第2引数を取る
↓
x, fs = librosa.load(path)
RuntimeError: cannot cache function '__o_fold': no locator available for file
x, fs = librosa.load(path) #35行目のここでエラー
RuntimeError: cannot cache function '__o_fold': no locator available for file '/var/www/html/Wave-Comparator-master/python/lib/python3.8/site-packages/librosa/core/notation.py
TypeError: spectral_centroid() takes 0 positional arguments but 2 were given
feature = librosa.feature.spectral_centroid(x, fs) #59行目でエラー
feature_type = Feature_Types.SPECTRUM #21行目のfeature_typeをこのように変更
AttributeError: module 'librosa.core' has no attribute 'dtw'
ac, wp = librosa.core.dtw(reference_feature, target_feature) #77行目でエラー
↓
ac, wp = librosa.sequence.dtw(reference_feature, target_feature) #これに置き換える
RuntimeError: cannot cache function '__o_fold': no locator available for file
numbaの新しいバージョンでは、キャッシュディレクトリのパスを環境変数に設定しないとこのエラーが発生するみたい。参照
#pythonから参照できる環境変数をうまく設定できなかったので、とりあえずファイルに直接直書き。
os.environ['NUMBA_CACHE_DIR'] = '/tmp' #これをcomp.pyの上の方に適当に置いたらエラー消えた