たけし備忘録

自分の好奇心の赴くままに勉強メモ LL系が大好き Python bash Julia C

PyAudioの基本メモ1

PyAudioの使い方を時々忘れてしまうのでメモ書き
用語の名前は私が勝手に読んでいる名前もあるので一般的な呼び方では無いこともあります。

基本的な用語

音源
 基本的には全てバイナリデータ(16進数 0x13 0x76など)

静的な音源
 wavファイル, rawファイル, mp3ファイルなど

動的な音源
 マイクに現在入力している音声など

wav, raw, mp3の違い
 通常の静的な音源は

 ヘッダ(サンプル周波数などのメタデータ)
       +
   ボディ(音源の本体)

 という構成になっている。

 rawファイル→ヘッダ無し, ボディ有り
 wavファイル→ヘッダ有り, ボディ有り
 mp3ファイル→ヘッダ有り, ボディ有り

 htmlみたいなもんだと思っていいかもしれない。たまにフッタも付いてるやつもある。

wavファイルとmp3ファイルの違い
 wavファイルはrawファイルにヘッダを付けたもの
 mp3ファイルは音源のある周波数(44.1kHz? 22.05kHzだったかな)以上の音をカットしてサイズ小さくしている。

 まとめると
 wavファイル→生音声
 mp3ファイル→加工された音声(音楽聞けりゃオッケー程度)

動的な音源からの読み込み
 後述するチャンクというサイズごとに読み取る必要がある。

静的な音源からの読み込み
 チャンク毎に読み取ってもいいし、全部一気に読み取ってもOK。

ストリーム
 データストリームとも言う。ストリーミング方式の動画などがある。データの流れ。
 音声で言うと、マイクからは常に音声データが流れて来ていて、ストリームに流れている。河みたいなものだと思えばいい。
 ストリームに書き込むとは 河にデータを流すこと
 ストリームを読み込むとは 河からデータを取ってくること
 

パラメータなどの用語

チャンク(CHUNK)
 音源から1回読み込むときのデータサイズ。1024(=2の10乗) とする場合が多い

サンプル周波数
 サンプルレートだとか、フレームレートとも言われる。よくfsとかsrと書く。次元は[個/sec]。
 データを読み取るときに、何秒ごとに1点のデータを取ってくるかを決める値。
 逆数はサンプル周期と言われTsなどと書く。
 よく使われるのは 44.1kHz, 16kHzなど。

 (例) fs = 44.1[kHz]の場合
   1/fs=Ts=22.7[μsec]毎に1点データを取ってくる。
 
 たまにナイキスト周波数とか言われることがあるけどナイキスト周波数はサンプル周波数の半分の周波数のこと(標本化定理)。

フレーム数
 少なくともPythonのwaveモジュール上ではバイナリデータの個数。
 0x00 などが1024個入ってるデータは1024フレームと言う。
 たぶん分野だとか動画だとかそういうジャンルによって使われ方が違う。
 よくわかってない。

音源の秒数の計算
 音源の秒数の計算には
 サンプル周波数 バイナリデータ数
 の2つが必要。
 
 (秒数)=バイナリデータ数/サンプル周波数

 という計算で出せる。

 (例) CHUNK個のデータをfsというサンプル周波数で取ってきた。
  (秒数)=CHUNK/fs

読み込んだバイナリデータを数値に変換

 マイクから音声を読み込んで、プロットする時の基本的な動きは

 1. ストリームから音声をCHUNK(ここでは1024とする)の長さでバイナリ形式で読み込む

 2. 読み込んだバイナリデータはCHUNKの2倍の長さの2048(罠!)

 3. バイナリデータをint16型に変換
  ただしint16型に変換するのが通常なだけでfloat64型などにも変換できる。意味は無い。

 4. int16型に変換すると長さがCHUNKと同じになる
   バイナリ2つ "0x16 0x08" などのセットで1つの値になる。
   バイナリ1つは8bitなのでint16の16bit数値にするには2つ分必要。なので2048個のバイナリデータを先頭から2つずつint16型の数値に変換すると全体として1/2のサイズ、1024個のint16データになる。
   意味は無いがfloat64型に変換すると8個ずつ読み込んでfloat64の数値にするので2048個の1/8のサイズになる。

 5. int16に変換した1024個のデータをプロット
  フィルタなどを掛けるときはint型に戻してからのほうがPythonでは扱いやすい(そもそもバイナリのままバイナリとして扱えるのか?)