広告 忘備録

2つの音声比較 - Wave-ComparatorをUbuntu&nginx&php-fpmで動かすときのまとめ

2つの音声の波形の類似率を比較して、どれだけ自分の英語の発音がネイティブと似ているかを実装したい。

文系の高卒なので、物理的な横文字の用語に抵抗を覚えるが、頑張って立ち向かってみる。

使用ライブラリWave-Comparatorはコチラ
5年前のライブラリなので、頑張って調整しながら使わさせていただく。

使用環境はUbuntu20.04, nginx, php8.0-fpm

Pythonはあまり触ったことない。

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の上の方に適当に置いたらエラー消えた
  • この記事を書いた人

たろう

タイ在住のアフィリエイター|総収益 0円 $5|現在アダアフィ挑戦中|英語・タイ語ガチ勢|現地民とお酒を飲むために語学勉強

-忘備録