こんにちは、開発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)
グラフで表示
#横軸(時間)の配列を作成 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)
グラフで表示してみる
#横軸(時間)の配列を作成 #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)
グラフで表示
#横軸(時間)の配列を作成 #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()

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