機械学習

音の高さと大きさを可視化する

こんにちは、開発Gエンジニアの高山です。

トライステージでも、DXを支える技術である「AI」や「データ分析」にも力を入れております。そんな要素の一つの機械学習分野より、音データに関する基礎をおさらいしました。


映像データの音を前処理している際に
以下のグラフで、オレンジと青の2chのグラフです!と説明しても・・・

「そのグラフの値、音の大きさ?高さ?」と聞かれて
確かに、このグラフの高さが何を示しているかわからなかった・・・ので
音のデータの基礎を確認しました。

音のデータを構成する単語

音をデータで処理する場合、
サンプリング周波数(サンプリングレート)・ビット深度・チャンネル数
を知っていれば、データでの処理が出来そうです。
それぞれの言葉の詳細はWikiペディアをご参照。


サンプリング周波数(サンプリングレート)・・・44.1KHzは代表例でCDとか

1秒間に、横軸の何回データ化するか。音色のきめの細かさが決まる。
以下の図で横が1秒なら、サンプリングレートは8Hzということになる。

ビット深度 ・・・CDでは16bit。縦軸で、音の大きさを記録するマス目(データ化)の細やかさを表す。
上のグラフの絵だと、8個の縦マス目にデータ化出来る。3bitの例。

チャンネル数・・・右と左があれば、2チャンネル

以下の図のイメージ

音をデータ化する とは?

先のグラフのイメージをデータ化すると、各マス目の部分を数値データとして記録することでデータ化される。
それを「サンプリング」と「量子化」という。


その「サンプリング」と「量子化」の
データ化する値を高くすると、以下の様なイメージで
データ化するキメが細かくなる。たぶんそれが、音が良くなるということ。



その波形グラフ、音の高さ?大きさ?

波の多さ(振幅の多さ)が、音程(音の高さ)になり
縦の大きさが音量になります。

音が小さくて、低い音のラ

波が緩いので低い音で、-0.3~0.3くらいまでの小さな音になっております。

音が大きくて高い音のラ

波が細かく、1まで波が高くなっています。

「ラ」の音のサンプル (jupyter Notebook)

※GoogleColabだと、IPython.display.Audioのオプションnormalize=Falseが使えないので、jupyter Notebookでのサンプルです。

楽器のチューニングの音は「ラ」と決まっていますので
ラの音を利用して、「そのグラフの値、音の大きさ?高さ?」が分かる
再現をしました。

① 440Hzのラ

import warnings
warnings.simplefilter('ignore')

# グラフの日本語化
!pip install japanize_matplotlib

import matplotlib.pyplot as plt
import japanize_matplotlib 
import numpy as np
import matplotlib.pyplot as plt
import IPython.display
rate=44100 #サンプリングレート 適当で構わないが、CDと同じにしておく
duration = 3 #再生秒数
# 440という値=ラの音 で波を作る
sin_1ch_A4 = np.sin(440 * 2 * np.pi * np.linspace(0, duration, duration * rate))
# そのデータを音再生する
IPython.display.Audio(sin_1ch_A4, rate=rate, normalize=False)
ラの440Hz

グラフで表示

#横軸(時間)の配列を作成
time = np.arange(0, sin_1ch_A4.shape[0]/rate, 1/rate)  

#プロット
plt.plot(time[0:440], sin_1ch_A4[0:440])

plt.title('音データの中身' )
plt.xlabel('時間')
plt.ylabel('振幅')
plt.show()

② 音を小さくした440Hzのラ

rate=44100
duration = 3
# 音を小さくする 3で割っている
sin_1ch_A4_min = np.sin(440 * 2 * np.pi * np.linspace(0, duration, duration * rate)) /3
IPython.display.Audio(sin_1ch_A4_min, rate=rate, normalize=False)
小さいラの440Hz

グラフで表示してみる

#横軸(時間)の配列を作成  #np.arange(初項, 等差数列の終点, 等差)
time = np.arange(0, sin_1ch_A4_min.shape[0]/rate, 1/rate)  

#プロット
plt.plot(time[0:440], sin_1ch_A4_min[0:440])

plt.title('音データの中身' )
plt.xlabel('時間')
plt.ylabel('振幅')
plt.ylim([-1,1])
plt.show()

③ 音程が2オクターブ高いラの音

# 1760Hz ラ 2オクターブ高い
rate=44100
duration = 3
sin_1ch_A6 = np.sin(1760 * 2 * np.pi * np.linspace(0, duration, duration * rate))
IPython.display.Audio(sin_1ch_A6, rate=rate, normalize=False)
音程が2オクターブ高いラ

グラフで表示

#横軸(時間)の配列を作成  #np.arange(初項, 等差数列の終点, 等差)
time = np.arange(0, sin_1ch_A6.shape[0]/rate, 1/rate)  

#プロット
plt.plot(time[0:440], sin_1ch_A6[0:440])

plt.title('音データの中身' )
plt.xlabel('時間')
plt.ylabel('振幅')
plt.show()

簡単な音のデータ処理のご紹介でした。
次回以降で、もう少し掘り下げていきたいと思います。

ABOUT ME
高山 和芳
高山 和芳
トライステージのシステム部門のマネージャー。 仕様検討とか調整事項を業務とすることが多い。 趣味は釣り。