見出し画像

音の三大要素について 第五回

この記事を書いたのは 山岡さん.

0. 前回の記事の内容

前回は、pythonを用いて音量を算出しました。
まだご覧になってない方はぜひ下のリンクから読んでみてください。

1. この記事から理解できることは?

Pythonを用いて音の高さを算出する方法

2. Pythonを用いた音高の算出

音の三要素について第三回の記事で、音の高さに関する紹介をしました。
第3回の記事は理論ベースの話でしたが今回は、実際にプログラミングを用いて音の高さを数値化してみます。
第4回で音量を用いたライブラリーと同じlibrosaを用いて、音高を算出してみます。
LibROSAでは YIN, pYINという基本周波数(声の高さ)を推定するアルゴリズムが実装されています。

2.1 YIN

YINのアルゴリズムを用いて音高を算出したい場合は以下で求めることが可能です。

【音高算出 YIN】

import librosa

filename = "001.wav"
y, sr = librosa.load(filename)
F0 = librosa.yin(y, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7')) #音高の計算

fminとfmaxは算出する値を制限するための変数で、音階の記号であらわされていてC2~C7まで対応しています。
音階のドレミファソラシドはそれぞれ、C, D, E, F, G, A, Bの記号であらわされ後ろにつく数が大きいほど高い音を表しています。

具体的にC2はピアノの下から2番目に低いドの音の周波数を表しており、約65hzをC7はピアノの上から2番目に高いドの音の周波数を表しており、約2093hzです。

計算された結果を出力してみると以下のような結果になります

[103.14397034 105.21896022 102.14335294 99.86089726 100.77543819
111.02311969 133.02925268 160.1601554 174.27531092 188.15520282
204.17721582 208.11741207 211.79716577 223.53359609 225.07977455
225.13167656 223.70423999 209.95694285 209.6200734 209.81739495
209.68901061 207.84391152 203.36915855 157.81408502 147.91741232
141.57595729]

また実際にfminとfmaxを共に以下のCodeのようにC2にしてみると

import librosafilename = "001.wav"

y, sr = librosa.load(filename)
F0 = librosa.yin(y, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C2')) #音高の計算
print(F0)

結果は

[65.43026706 65.43026706 65.23668639 65.23668639 65.43026706 65.43026706 65.23668639 65.43026706 65.43026706 65.43026706 65.43026706 65.43026706 65.43026706 65.23668639 65.23668639 65.23668639 65.43026706 65.43026706 65.43026706 65.43026706 65.43026706 65.43026706 65.43026706 65.23668639 65.23668639 65.43026706]

となり、65hz以上の音であっても、65hzと出力されてしまうことが分かります。
これは、ある一定のhzを計算時に強制的に丸め込みたい時などに便利な機能です。

以下のCodeを用いて、算出された配列の平均を算出すると

Pitch_yin = np.average(F0)
print(Pitch_yin)

172.95887260791258[Hz]

が得られ、001.wavファイルの平均的な音の高さが約172hzであることが求められた。

2.2 pYIN

pYINのアルゴリズムを用いて音高を算出したい場合は以下で求めることが可能です。(YINとほとんどかわらないです。)

【音高算出 pYIN】

import librosa

filename = "001.wav"
y, sr = librosa.load(filename)
f0, voiced_flag, voiced_probs = librosa.pyin(y, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7')) #音高の計算
print(f0)

pYINを用いて、算出された配列の平均を算出すると以下のような結果になり
ました。

175.7481598681638[Hz]

上記から分かるようにYINとpYINの結果には大きな差は見受けられないです。

3. Praat

pythonの使い方が分からない場合にはPrratを用いることもおすすめです。
Prratを開いて、open>Read open file… を押して音高を算出したいファイルを選択すると以下のような画面になります。

Prratの起動画面

次に赤枠で囲まれているView&Editを押します。

Prratの起動画面

そうすると、次のような画面になります。

Prratの画面2

Praatでは音高のみならず、音量やフォルマントなども算出可能です。
音高を算出したい場合には、Pitch>Show Pitchを選択します。
するとPrratの画面3のように青い曲線が表示されます。

Prratの画面3

上記の状態で、音高の平均値を算出したい区間をPrratの画面4のように選択した状態で、Pitch>Get Pitchを選択することで、音高の平均を算出することが出来ます。

Prratの画面4

以下が得られた結果です。

177.31690356955323 Hz

4. まとめ

今回は、Pythonを用いて音高を算出してみました。音高を算出することにより、音階メーカーを作成してカラオケ採点の仕組みを再現したり、situationごとの自分の声の高さの違いを知ることが出来ます。

Pitchの算出アルゴリズムには様々な手法が提案されていますが[1]に手法毎の違いや特徴が述べられています。

再現実験を行うと各アルゴリズムの違いについての理解がより深まるので時間を見つけて行ってみたいと思います。

参考文献


[1] Hideki Kawahara , Kohei Yatabe , Ken-Ichi Sakakibara , Tatsuya Kitamura , Hideki Banno , Masanori Morise, An objective test tool for pitch extractors’ response attributes , InterSpeech 2022
kawahara22_interspeech.pdf (isca-speech.org)

この記事が参加している募集

学問への愛を語ろう

この記事が気に入ったらサポートをしてみませんか?