goo blog サービス終了のお知らせ 

日々適当

hibitekitou

PyAudioを入れてみた

pc |2014-11-28

PyAudio。PortAudioっていう音関係のライブラリをPythonにバインドしたもんってことらしい。インストーラが各プラットホーム向けに出ているからインストールは簡単でございました。
いれたはいいものの音に関しては全くの素人。さっぱり分かりません。

とりあえず既存のwaveファイルを再生するというのは、PyAudioのドキュメントに書かれているサンプルコードで出来ました。

import pyaudio
import wave
import sys
import time

if len(sys.argv) < 2:
	print("Plays a wave file. \n\nUsage:%s "%sys.argv[0])
	sys.exit(-1)

wf = wave.open( sys.argv[1], 'rb')

p = pyaudio.PyAudio()

def callback( in_data, frame_count, time_info, status ):
	data = wf.readframes(frame_count)
	return (data, pyaudio.paContinue)

stream = p.open( format=p.get_format_from_width(wf.getsampwidth()),\
				channels = wf.getnchannels(),\
				rate = wf.getframerate(),\
				output=True,\
				stream_callback=callback )

stream.start_stream()

while( stream.is_active() ):
	time.sleep(0.1)

stream.stop_stream()
stream.close()
wf.close()

p.terminate()

続いて録音です。入力デバイスがどんだけあるか調べたり、各々のデバイスがどんなものかの情報を得るにはこんな感じに書けばいいようです。

import pyaudio

p = pyaudio.PyAudio()

apiCnt = p.get_host_api_count()
print("Host API Count: %d"%apiCnt)
for cnt in range(apiCnt):
	print(p.get_host_api_info_by_index(cnt))

これを走らせると、僕のMacBook Proではこんな風に返事が返ってきました。

Host API Count: 1
{'index': 0, 'name': u'Core Audio', 'defaultOutputDevice': 1L, 'type': 5L, 'deviceCount': 5L, 'defaultInputDevice': 0L, 'structVersion': 1L}

入力デバイスは一つしかなく、そのインデックスは0と。ということで、こちら [工作と競馬] をほぼ丸写しで、input_device_indexの値だけ0にする事で、MacBook Proのマイクからの音を録音したファイルを作成する事が出来ました。

import pyaudio
import wave
import time

wf = wave.open('text.wav', 'w')
wf.setsampwidth(2)
wf.setframerate(44100)
wf.setnchannels(2)

p = pyaudio.PyAudio()

input_device_index = 0

def callback(in_data, frame_count, time_info, status):
	wf.writeframes(in_data)
	return (None, pyaudio.paContinue)

stream = p.open( format = p.get_format_from_width(wf.getsampwidth()),\
			channels = wf.getnchannels(),\
			rate = wf.getframerate(),\
			input_device_index = input_device_index,\
			input = True,\
			stream_callback = callback)

stream.start_stream()

time.sleep(5)

stream.stop_stream()
stream.close()

wf.close()
p.terminate()

まずはとりあえず…。

 

コメント ( 0 )|Trackback ( )
 
コメント(10/1 コメント投稿終了予定)
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。