假设我有两个不同的API绘制的函数,即函数A和B.
默认情况下,功能A将音频数据输出到wav文件。
默认情况下,功能B从wav文件中获取音频输入并对其进行处理。
是否可以将数据从功能A流式传输到B?如果是这样,我该怎么做?如果相关,我会在lubuntu上工作。
这是我在PJSUA python API中考虑的函数A:
create_recorder(self,filename) 创建WAV文件记录器。
关键字参数 filename - 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,operation = create(记录器),错误=不支持选项/操作(PJ_ENOTSUP)
我需要使用create_recorder()返回的值,它是一个用于获取wav记录器id的int(它不会直接传递给decode_raw(),而是传递给其他函数。
答案 0 :(得分:2)
答案是高度依赖平台的,需要更多细节。不同的操作系统有不同的方式来处理进程间通信或IPC。
如果您使用的是类UNIX环境,那么可以使用丰富的IPC基元。管道,SYS V消息队列,共享内存,套接字等。在您的情况下,我认为使用管道或套接字是有意义的,这取决于A和B是否在同一进程中运行。
更新
在你的情况下,我会使用python的subprocess
和/或os
模块和管道。这里的想法是在共享父进程的进程中为两个API创建调用上下文,该进程还创建了一个单向命名管道并将其传递给它的子进程。然后,写入create_recorder
中命名管道的数据将立即可用于命名管道中的read()。
答案 1 :(得分: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)