在python中将音频输出从一个函数重定向到另一个函数

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

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

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

是否有可能将数据从功能A流式传输到B? 如果是这样,我该怎么做? 如果这是相关的,我在研究lubuntu。

这是我从PJSUA python API中想到的函数:

create_recorder(self,filename)创建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()返回的值,它是一个用于获取wav记录器id的int(它不会直接传递给decode_raw(),而是传递给其他某个函数。


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

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

更新:

在你的情况下,我会使用python的subprocess和/或os模块和一个管道。 这里的想法是在共享父进程的进程中为这两个API创建调用上下文,该进程还创建了一个单向的命名管道并将其传递给子进程。 然后,在create_recorder写入命名管道的create_recorder将立即可用于在命名管道中读取()。


您可以使用命名管道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)
链接地址: http://www.djcxy.com/p/33821.html

上一篇: Redirecting audio output from one function to another function in python

下一篇: XAudio2 delay with small buffer size