質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

378閲覧

log_mel_spectrogram から mfcc への変換について

take_take9

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/09 18:13

編集2022/05/09 18:15

Librosaを用いて直接mfccを算出するのではなく、
一度log_mel_spectrogramを算出し、離散コサイン変換をした後にmfccを求めようとしています。

しかし、mel_spectrogramを求めるまでは、どのサイトもほぼ同じ書き方でしたが、
mel_spectrogramの対数変換を行う方法を2通り見つけてしまいました。


  1. https://qiita.com/koshian2/items/ca99b4a489d164e9cec6
  2. https://work-in-progress.hatenablog.com/entry/2020/02/23/121049

  1. は対数変換する際に、librosa.power_to_db() を用いて対数ベースの特徴量であるdBに変換しています。
  2. は対数変換する際に、np.log() を用いて自然対数をとることで対数変換しています。

どちらも試してみたのですが、値が異なりすぎてどちらを用いればよいのか分からず、つまずいてしまいました。

以下に実際に書いたプログラムを記載しておきます。

python

1import librosa 2import librosa.display 3import IPython.display as ipd 4import matplotlib.pyplot as plt 5import numpy as np 6 7#音声ファイル 8audio_file = "input_(1).wav" 9#音声ファイルの読み込み 10signal, sr= librosa.load(audio_file, sr=16000) 11 12# fftサイズ 13fft_size = 2048 14# フレーム幅 25ミリ秒 15frame_size = int(sr * 0.025) 16# シフト幅 10ミリ秒 17frame_shift = int(sr * 0.010) 18 19#メルパワースペクトルの抽出 20mel_spectrogram = librosa.feature.melspectrogram(signal, sr=sr, n_fft=fft_size, win_length=frame_size, hop_length=frame_shift, n_mels=20, htk=True) 21 22#対数に変換し、メル対数パワースペクトルを抽出 23#方法1 24#log_mel_spectrogram = librosa.power_to_db(mel_spectrogram) 25 26#方法2 27#log_mel_spectrogram = np.log(mel_spectrogram) 28 29#自然対数ではなく、常用対数をとる場合 30#log_mel_spectrogram = np.log10(mel_spectrogram)

方法1の出力結果
[[-49.1288 -43.47363 -32.42871 ... -48.20053 -45.65087 -50.479008]
[-48.834778 -43.627296 -30.684395 ... -52.470383 -56.832424 -50.452557]
[-58.84404 -58.917442 -46.022305 ... -59.980434 -60.86388 -61.25717 ]
...
[-76.13585 -71.91855 -67.92332 ... -72.16338 -72.69927 -73.85922 ]
[-71.149414 -70.26639 -68.14095 ... -68.84623 -69.680954 -67.69995 ]
[-68.29411 -63.593628 -65.46418 ... -63.86496 -64.462524 -64.53293 ]]


方法2の出力結果
[[-11.312325 -10.010173 -7.4669867 ... -11.098582 -10.511502 -11.623221 ]
[-11.244622 -10.045556 -7.0653434 ... -12.081752 -13.086149 -11.61713 ]
[-13.549341 -13.566242 -10.597027 ... -13.811006 -14.014427 -14.104985 ]
...
[-17.530926 -16.559856 -15.639922 ... -16.616234 -16.739626 -17.006714 ]
[-16.38276 -16.179434 -15.690033 ... -15.85243 -16.044632 -15.588489 ]
[-15.725302 -14.642974 -15.073684 ... -14.705451 -14.843045 -14.859256 ]]


自然対数ではなく、常用対数をとった場合は、方法1の出力結果1/10の値となって出力されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

デシベルを表すときに、自然対数と常用対数を使う時があり、
藤原さんの解説によれば

自然対数(ln)をつかう時は ネーパ (Np) という単位になります。 ネーパは電力比の自然対数に 1/2 を掛けたものです。 1Np = 8.686dB です。

だそうです。
ですので、これが、

自然対数ではなく、常用対数をとった場合は、方法1の出力結果1/10の値となって出力されました。

の答えと思います。


以下私の勝手な意見です。

デシベルについて詳しいことは分かりませんが、librosaの解説

This computes the scaling 10 * log10(S / ref) in a numerically stable way.

さらに、引数の説明には、

ref: scalar or callable

とありますので、この変換では都合の良いようにスケーリングすることはよくある話で、大事なことは最大最小の幅よりもスペクトラム全体の形にあるように思います。

変換した後のデータをどうするのかわかりませんが、もし機械学習に用いるのであれば、物理屋さんが卒倒するような「適当に精度が上がるように都合良く根拠のないスケーリングやノイズ付与」みたいなことはよくやっている話です。数学的物理的な用途に使うのであればちゃんとした方がよいですが、何かの機械学習に使うのであれば、とりあえず両方やってみてスコアが良さそうな方を使えばOKと思います。

投稿2022/05/09 21:18

編集2022/05/09 21:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

take_take9

2022/05/10 13:07

回答ありがとうございます! 機械学習を行う予定ですので、どちらの数値も試してみようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問