みなさんの声は、高い声ですか?
それとも低い声ですか?
そもそも、録音した自分の声を聞く機会はそれほどありませんよね。
それに、その声を聞くと気持ち悪くて恥ずかしさすら感じてしまいます。
だから、普通は自分の声の高低は「わからない」でしょう。
せいぜい、人から言われたぐらいのはずです。
じゃあ、自分の声の高低を測定しましょう。
白黒つけましょう!!
「俺の声は、○○ヘルツ(Hz)だぜ」
「私の声は、○○ヘルツ(Hz)なんですの」
このように、自己紹介のときにも使えるかもしれません。
本記事の内容
- 声の高低は基本周波数を基準にする
- librosaで基本周波数を測定する
- 私の声はモテ声なのでしょうか?
それでは、上記に沿って解説していきましょう。
声の高低は基本周波数を基準にする
声の高低は、基本周波数を基準にします。
基本周波数の高低で声の高低を判断するということです。
また、基本周波数は「F0」と呼ばれています。
基本周波数の詳細に関しては、Googleで検索してみてください。
音声の専門家の方たちが、詳しく解説してくれています。
でも、素人には難しいですけどね。
ただ、librosaはそんな素人でも簡単に仕える機能を用意してくれています。
それを実際に利用してみましょう。
librosaで基本周波数を測定する
本記事の本題です。
基本周波数を簡単に測定できるということを解説していきます。
librosaでは、便利なモノが用意されています。
- librosa.yin
- librosa.pyin
正直、内容はよくわかりません。
漠然と基本周波数を算出しているのだということぐらいはわかります。
そして、基本周波数を算出するためにはいろいろなアルゴリズムが存在しているようです。
アルゴリズムが多く存在しているというのは、機械学習の世界と似ていますね。
今回は、librosa.pyinを用いて声の基本周波数(F0)を算出します。
基本的には、公式サイトのサンプルコードをもとにコーディングしています。
というより、ほぼサンプルのままです。
import librosa import librosa.display import matplotlib.pyplot as plt import numpy as np # ファイル読み込み filename = "./data/myvoice.m4a" 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')) times = librosa.times_like(f0) D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max) fig, ax = plt.subplots() img = librosa.display.specshow(D, x_axis='time', y_axis='log', ax=ax) ax.set(title='pYIN fundamental frequency estimation') fig.colorbar(img, ax=ax, format="%+2.f dB") ax.plot(times, f0, label='f0', color='cyan', linewidth=3) ax.legend(loc='upper right')
このコードを実行すると、次の画像が作成されます。
f0は、基本周波数です。
私の声は、64Hz~192Hzぐらいの範囲の基本周波数だということになりますね。
正確には、65.4064Hz~197.133Hzです。
上記コードの「f0」という変数に値が入っています。
以下を追加するとf0の平均や中央値を取得できます。
import pandas as pd df_f0 = pd.Series(f0) df_f0 = df_f0.dropna(how='all') print(df_f0.describe())
describe()で表示される内容は以下。
count 1163.000000 mean 128.183558 std 28.859308 min 65.406391 25% 108.110266 50% 128.565497 75% 151.134901 max 197.133121 dtype: float64
データだけ見ると、128Hzが基本周波数だと言ってもよさそうです。
私の声はモテ声なのでしょうか?
librosaで基本周波数を測定する方法を解説してきました。
そして、私は自分の声を犠牲にして、実際に基本周波数を測定しました。
正直、アプリを使えばここまでは簡単にできるのかもしれません。
しかし、上記でやったようにPythonだとそこからの拡張性に優れています。
具体的には、f0の統計情報をdescribe()で算出しました。
基本周波数をデータとして取得して、それをもとにやりたいことができるのです。
アプリではこうはいきません。
プログラミングだからこそなのです。
さて、真面目な話はここで終わりにしましょう。
結論(?)として、私の声はモテ声なのかどうかですね。
いわゆる、イケボかどうかということです。
そもそものスタートは、声の高低を測定するモノでしたけど・・・
まず、基本周波数(F0)が128Hzというのは男の声なのでしょうか?
甲高い声だったら、モテ声以前です。
男性の基本周波数の平均値は125Hz
この数値がどうやら、学術的には正しい数値とされているようです。
「男性 基本周波数 125Hz」をGoogleで検索すれば、そのような資料が出てきます。
ということは、私の声は成人男性の平均とほぼ同じと言えます。
さて、そもそも論ですが、モテ声・イケボの定義が存在しません。
そのようなデータが存在していません。
ここでは、基本周波数ベースのデータについて言及しています。
よって、私の声がモテ声かどうかは不明です。
あくまで、基本周波数の基準では。
調べるためには、イケボと言われる人たちの基本周波数を集めるところからですね。