audio_stream_manager

PyAudio を用いた音声入出力ストリームを シングルトンパターンで一元管理するモジュールです。

class mike.audio_stream_manager.AudioStreamManager(config)

Bases: object

PyAudioストリーム(入出力)の生成・管理を一元化するシングルトンパターンクラス。

このクラスは以下の特徴を持つシングルトンパターンの実装です:

  • PyAudioインスタンスと入出力ストリームを永続保持

  • 音声録音(入力)と再生(出力)を統一管理

  • スレッドセーフなアクセス制御(ロック機構)

  • デバイス情報の自動取得

  • サンプリングレートの自動判定とフォールバック

  • エラー時の自動リカバリ機構

Examples

基本的な使用方法:

>>> manager = AudioStreamManager(config)
>>> manager.initialize(device_index=0, rate=16000)
>>>
>>> if manager.acquire_input(timeout=5.0):
...     data = manager.read_chunk()
...     manager.release_input()
>>>
>>> if manager.acquire_output(timeout=5.0):
...     manager.write_chunk(data)
...     manager.release_output()
>>>
>>> manager.terminate()

Notes

シングルトンパターンで実装されており、全体でインスタンスは1つ。 スレッドセーフなロック機構で並行アクセスを制御する。 PyAudioの低レイヤーAPIを簡潔にラップしている。

acquire_input(timeout=5.0)

入力ストリーム(マイク録音)の使用権を取得。 複数スレッドからの同時アクセスを制御(排他制御)。

Parameters:

timeout (float) – 最大待機時間(秒)。他スレッドが使用中の場合この時間まで待機。

Returns:

True: 使用権取得成功 False: タイムアウト(他スレッドが使用中のまま)

Return type:

bool

acquire_output(timeout=5.0)

出力ストリーム(スピーカー再生)の使用権を取得。 複数スレッドからの同時アクセスを制御(排他制御)。

Parameters:

timeout (float) – 最大待機時間(秒)。他スレッドが使用中の場合この時間まで待機。

Returns:

True: 使用権取得成功 False: タイムアウト(他スレッドが使用中のまま)

Return type:

bool

get_config()

現在の設定を辞書で取得。

Returns:

{rate, output_rate, channels, format, chunk, device_index}

Return type:

dict

get_device_list()

利用可能なオーディオデバイス一覧を取得。

Returns:

デバイス情報の辞書リスト 各要素:{index, name, channels, samplerate}

Return type:

list of dict

get_sample_size()

サンプルサイズ(バイト数)を取得。 PCMデータの1サンプルが占めるバイト数(通常は2バイト=16-bit)。

initialize(device_index=0, rate=16000, channels=1, chunk=1024)

入出力ストリームを初期化。 デバイスが対応していないサンプリングレートの場合は自動調整。

【サンプリングレート戦略】 - 入力(マイク):16kHz を優先(Julius音声認識エンジン対応) - 出力(スピーカー):22050Hz を優先(サーバー側の音声形式) - フォールバック:デバイスがサポートしているレートに自動調整

Parameters:
  • device_index (int) – 使用するデバイスのインデックス

  • rate (int) – 要求するサンプリングレート(Hz)デフォルト: 16000

  • channels (int) – チャネル数(1=モノラル, 2=ステレオ)デフォルト: 1

  • chunk (int) – バッファサイズ(フレーム数)デフォルト: 1024

Returns:

0: 初期化成功, -1: 初期化失敗

Return type:

int

read_chunk()

入力ストリームから1チャンク分のオーディオデータを読み込む(マイク録音)。

Returns:

PCMオーディオデータ(失敗時は None)

Return type:

bytes or None

reinitialize(device_index=0, rate=16000, channels=1, chunk=1024)

ストリームを再初期化(リセット後に initialize を実行)。

既に初期化されている場合、一度終了して再度初期化する。 デバイス変更時などに使用。

Parameters:
  • device_index (int) – 新規デバイスインデックス

  • rate (int) – 新規サンプリングレート

  • channels (int) – 新規チャネル数

  • chunk (int) – 新規バッファサイズ

Returns:

0: 成功, -1: 失敗

Return type:

int

release_input()

入力ストリーム(マイク録音)の使用権を解放。 他のスレッドが使用可能になる。

release_output()

出力ストリーム(スピーカー再生)の使用権を解放。 他のスレッドが使用可能になる。

terminate()

入出力ストリーム・PyAudioインスタンスをクローズ。 リソースの解放と正常なシャットダウンを行う。

write_chunk(data)

出力ストリームに1チャンク分のオーディオデータを書き込む(スピーカー再生)。

Parameters:

data (bytes) – PCMオーディオデータ

Returns:

True: 書き込み成功, False: 書き込み失敗

Return type:

bool