人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

WAVEファイルの再生

Pythonで音声信号処理(2011/05/14)

まずは基本ということでWAVEファイルを再生してみます。Pythonにはwaveモジュールが用意されていてWAVEファイルの読み書き、情報の抽出はできます。しかし、waveモジュールだけでは音を再生できないのでpyaudioという別のモジュールと組み合わせて使います。pyaudioは別途インストールが必要。

#coding: utf-8
import wave
import pyaudio

def printWaveInfo(wf):
    """WAVEファイルの情報を取得"""
    print "チャンネル数:", wf.getnchannels()
    print "サンプル幅:", wf.getsampwidth()
    print "サンプリング周波数:", wf.getframerate()
    print "フレーム数:", wf.getnframes()
    print "パラメータ:", wf.getparams()
    print "長さ(秒):", float(wf.getnframes()) / wf.getframerate()
    
if __name__ == '__main__':
    wf = wave.open("sineWithNoise.wav", "r")

    printWaveInfo(wf)

    # ストリームを開く
    p = pyaudio.PyAudio()
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    # チャンク単位でストリームに出力し音声を再生
    chunk = 1024
    data = wf.readframes(chunk)
    while data != '':
        stream.write(data)
        data = wf.readframes(chunk)
    stream.close()
    p.terminate()

実行すると、

チャンネル数: 1
サンプル幅: 2
サンプリング周波数: 44100
フレーム数: 132300
パラメータ: (1, 2, 44100, 132300, 'NONE', 'not compressed')
長さ(秒): 3

上のプログラムで使った

この音声ファイルは440Hzのサイン波にノイズを乗せた音です。Praatという音声分析ツールで作りました。かなり使い勝手にクセがあるソフトなんですが、スペクトル解析やピッチ編集も簡単にできるため研究でもよく使われているようです。440Hzの音(ドレミの「ラ」)にランダムノイズを乗せた音を作るための波形の式は、

1/2 * sin(2*pi*440*x) + randomGauss(0,0.1)

スクリプトを実行すると、ポーというサイン波にサーというノイズが乗った音が聞こえます。1秒間に44100回サンプリングしているので長さ3秒の音声ファイルは132300個のフレームがあります。

単に音を鳴らしたいだけならpyaudio以外のライブラリもあります。

ではもっと手軽に鳴らせます。しかし、波形を編集してから再生したいなどなってくるとpyaudioのように波形データを直接ストリームに流す方法がベストだと思います。OSの違いも自動的に吸収してくれるし便利です。wav以外にmp3やoggなど他の音声ファイルの再生方法、変換方法もいずれ紹介したいと思います。