1

2つの異なるAPI、関数AとBから引き出された2つの関数があるとします。

デフォルトでは、関数Aはオーディオデータをwavファイルに出力します。

デフォルトでは、関数Bはwavファイルからオーディオ入力を取得して処理します。

関数AからBにデータをストリーミングすることは可能ですか?もしそうなら、どうすればこれを行うことができますか?それが適切であれば、私はlubuntuに取り組んでいます。

これは私がPJSUApythonAPIから考えている関数Aです。

create_recorder(self、filename) WAVファイルレコーダーを作成します。

キーワード引数filename-WAVファイル名

戻り値:WAVレコーダーID

そしてこれはPocketsphinxPythonAPIの関数Bです

decode_raw(...)

ファイルから生のオーディオをデコードします。パラメータ:fh(ファイル)-オーディオを読み取るファイルハンドル。uttid(str)-この発話に与える識別子。maxsamps(int)-読み取るサンプルの最大数。指定しない場合または-1の場合、ファイルの残りの部分が読み取られます。

アップデート:

ソケットまたは名前付きパイプのファイル名を渡そうとすると、このエラーメッセージが出力されます。これは、Pythonバインディングが使用するC関数が.wavファイル以外のものを好まないようです...なぜでしょうか。

pjsua_aud.c .pjsua_recorder_create()エラー:/ tmp/t_fifoのファイル形式を判別できません。例外:オブジェクト:LIb、operation = create(recorder)、error = Option / operationはサポートされていません(PJ_ENOTSUP)

create_recorder()によって返される値を使用する必要があります。これは、wavレコーダーID(decode_raw()に直接渡されるのではなく、他の関数に渡される)を取得するために使用されるintです。

4

2 に答える 2

2

答えはプラットフォームに大きく依存しており、詳細が必要です。オペレーティングシステムが異なれば、プロセス間通信(IPC)の処理方法も異なります。

UNIXライクな環境を使用している場合は、操作できるIPCプリミティブの豊富なセットがあります。パイプ、SYS Vメッセージキュー、共有メモリ、ソケットなど。あなたの場合、AとBが同じプロセスで実行されているかどうかに応じて、パイプまたはソケットを使用するのが理にかなっていると思います。

アップデート:

あなたの場合、私はpythonsubprocessosモジュールとパイプを使用します。ここでの考え方は、親プロセスを共有するプロセスで2つのAPIへの呼び出しコンテキストを作成することです。これにより、単方向の名前付きパイプも作成され、その子に渡されます。次に、名前付きパイプに書き込まれたデータは、名前付きパイプでcreate_recorderすぐにread()に使用できるようになります。

于 2012-12-14T18:44:37.310 に答える
1

名前付きパイプos.mkfifo()を使用して、関数を別のスレッド/プロセスに移動できます。

import os
from multiprocessing import Process

os.mkfifo(filename)
try:
    Process(target=obj.create_recorder, args=[filename]).start()
    decode_raw(filename, ...)
finally:
    os.remove(filename)
于 2012-12-14T19:18:52.227 に答える