1

假设我有两个函数来自两个不同的 API,函数 A 和 B。

默认情况下,函数 A 将音频数据输出到 wav 文件。

默认情况下,函数 B 从 wav 文件中获取音频输入并进行处理。

是否可以将数据从函数 A 流式传输到 B?如果是这样,我该怎么做?如果相关的话,我在 lubuntu 上工作。

这是我从 PJSUA python API 考虑的函数 A:

create_recorder(self, filename) 创建 WAV 文件记录器。

关键字参数文件名 -- WAV 文件名

返回:WAV 录音机 ID

这是来自 Pocketsphinx Python API 的函数 B

解码原始(...)

从文件中解码原始音频。参数: fh (file) - 从中​​读取音频的文件句柄。uttid (str) - 赋予此话语的标识符。maxsamps (int) - 要读取的最大样本数。如果未指定或 -1,则将读取文件的其余部分。

更新:

当我尝试传递套接字或命名管道的文件名时,它会输出此错误消息,似乎 python 绑定使用的 C 函数除了 .wav 文件之外什么都不喜欢......为什么会这样?

pjsua_aud.c .pjsua_recorder_create() 错误:无法确定 /tmp/t_fifo 的文件格式。例外:对象:LIb,操作=创建(记录器),错误=不支持选项/操作(PJ_ENOTSUP)

我需要使用 create_recorder() 返回的值,它是一个 int,用于获取 wav 记录器 id(它不直接传递给 decode_raw(),而是传递给其他函数。

4

2 回答 2

2

答案高度依赖于平台,需要更多细节。不同的操作系统具有不同的处理进程间通信或 IPC 的方式。

如果您使用的是类 UNIX 环境,则可以使用一组丰富的 IPC 原语。管道、SYS V 消息队列、共享内存、套接字等。在您的情况下,我认为使用管道或套接字是有意义的,具体取决于 A 和 B 是否在同一进程中运行。

更新:

在您的情况下,我会使用 python 的subprocessand oros模块和管道。这里的想法是为共享父进程的进程中的两个 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 回答