2012-12-14 44 views
1

假設我有來自兩個不同的API,功能A和B重定向從一個功能到另一種功能的音頻輸出在python

默認情況下繪製的兩個功能,功能A的音頻數據輸出到一個wav文件。

默認情況下,函數B從wav文件獲取音頻輸入並進行處理。

是否可以將數據從函數A流式傳輸到B?如果是這樣,我該怎麼做?如果這是相關的,我在研究lubuntu。

這是一個功能我想從PJSUA蟒蛇API:

create_recorder(個體經營,文件名) 創建WAV文件記錄。

關鍵字參數 名 - WAV文件名

返回: WAV記錄器ID

而且從Pocketsphinx的Python API,這是函數B

decode_raw(...)

解碼來自文件的原始音頻。 參數: fh(文件) - 從中​​讀取音頻的文件句柄。 uttid(str) - 給這個話語的標識符。 maxsamps(int) - 要讀取的最大采樣數。如果未指定或-1,則將讀取文件的其餘部分。

更新:

當我試圖通過一個套接字或命名管道的文件名,它輸出此錯誤信息,似乎是Python綁定使用C函數不喜歡什麼,但.wav文件。 ..爲什麼會這樣?

pjsua_aud.c .pjsua_recorder_create()錯誤:無法確定/ tmp/t_fifo的文件格式。異常:對象:LIb,操作=創建(記錄器),錯誤=選項/操作不支持(PJ_ENOTSUP)

我需要使用create_recorder()返回的值,它是一個int,用於獲取wav recorder id(不直接傳遞給decode_raw(),而是傳遞給其他某個函數)

+0

這取決於,你通過什麼函數'A'?你傳遞一個文件名或文件對象嗎?如果函數'A'可以帶一個文件對象,那麼您可以改爲給它一個StreamIO對象。 – mgilson

+0

這是一個文件名....我要編輯我原來的帖子,以提供更多信息。 –

+1

您是否嘗試過傳遞不同的名稱:'/ tmp/t_fifo.wav'而不是'/ tmp/t_fifo'? – jfs

回答

2

答案是高度依賴於平臺,需要更多細節不同的操作系統有不同的處理進程間通信的方式,或工業IPC

如果您使用的是一個類似於UNIX的環境,那麼可以使用一組豐富的IPC原語來處理管道,SYS V消息隊列,共享內存,套接字等等。認爲使用管道或套接字是有意義的,這取決於A和B是否在相同的進程中運行。

更新:

在你的情況,我會使用Python的subprocess和或os模塊和管道。這裏的想法是在共享父進程的進程中爲這兩個API創建調用上下文,該進程還創建了一個單向的命名管道並將其傳遞給子進程。然後,寫入到create_recorder的命名管道中的數據將立即可用於在命名管道中讀取()。

+0

我認爲它們運行在相同的過程中......它們當然在同一個python腳本中,並且我沒有碰過任何像多處理一樣的花式(我不知道怎麼說) –

+0

謝謝我現在就試試 –

+2

@MaxPie:測試最簡單的東西 - 因爲它可能工作 - 是創建一個Unix套接字,並將它的文件名傳遞給'create_recorder',看它是否寫入套接字,用普通文件替換套接字還是失敗。如果它寫入套接字,只需將套接字的文件描述符傳遞給'decode_raw'即可。 – abarnert

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) 
+0

這也沒有工作,create_recorder抱怨,它不能識別文件名/不支持 –

+0

@MaxPie:[更新你的問題](http://stackoverflow.com/posts/13884439/edit)包括你得到的完整回溯 – jfs

+0

它只是在控制檯中這樣說:pjsua_aud.c .pjsua_recorder_create()錯誤:無法確定文件格式爲/ tmp/t_fi FO。例外:對象:LIb,操作=創建(記錄器),錯誤=不支持選項/操作(PJ_ENOTSUP),我如何獲得 –