python - 如何以编程方式控制声卡?

标签 python audio pyaudio soundcard

我正在使用 Saffire Pro 40 声卡在 Mac 上玩 pyaudio。 目前我插入了两个输入,我想以编程方式控制第二个输入 channel 的电平。 (使用声卡的混音控制软件效果很好)。

我一直在浏览 pyaudio 文档,但到目前为止还没有发现任何关于这个问题的明显内容。以编程方式本质上执行混合控制软件所做的事情(控制每个 channel 的音量)的最简单方法是什么? (Python API 会很好,但不是必需的)

为简化起见:看起来可以从我想要控制的 channel 中手动读取流,使用 numpy 缩放它们,将它们写为输出,但我希望有一种方法可以简单地发送标准化值每个 channel 来控制它。

所以不是这样的:

stream1 = pyaudioInstance.open( format             = FORMAT,
                                channels           = CHANNELS,
                                rate               = RATE,
                                input              = True,
                                output             = True,
                                input_device_index = 0,
                                frames_per_buffer  = CHUNK
                                )
stream2 = pyaudioInstance.open( format             = FORMAT,
                                channels           = CHANNELS,
                                rate               = RATE,
                                input              = True,
                                input_device_index = 1,
                                frames_per_buffer  = CHUNK
                                )

while processingAudio:
    # manually fetch each channel
    data1In = stream1.read(CHUNK)
    data2In = stream2.read(CHUNK)
    # convert to numpy to easy scale the arrays
    decodeddata1 = numpy.fromstring(data1In, numpy.int16)
    decodeddata2 = numpy.fromstring(data2In, numpy.int16)
    newdata = (decodeddata1 * 0.5 + decodeddata2* 0.1).astype(numpy.int16)
    # finally write the processed data
    stream1.write(result.tostring())

这有点误导,但我需要混合来自同一输入设备索引的不同 channel 。但是我希望是这样的:

someSoundCardAPI.channels[0].setVolume(0.2)

看看 Channel Maps example感觉更接近我所追求的。目前,我发现 API 的 host_api_specific 部分有点困惑,我希望有人已经成功使用过它。

我正在使用 OSX 10.10

最佳答案

我真的没有任何 OSX 经验,所以我不知道,但通常你可以用 AppleScript 远程控制一切。 参见,例如,this question . 不过,它没有说明如何单独控制单个 channel 的音量。

也许你应该问那里......

关于较差的解决方法,您可以使用 python-sounddevice创建一个小的(未经测试的)Python 脚本:

import sounddevice as sd

def callback(indata, outdata, *stuff):
    outdata[:] = indata * [1, 0.5]

with sd.Stream(channels=2, callback=callback):
    input()

此脚本将一直运行,直到您按下 <Return>并且它会降低第二个 channel 的音量。

关于python - 如何以编程方式控制声卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32372911/

相关文章:

python - 在 MySQL 数据库中保存 Python Pickled 对象

audio - Kinect:从固定文件中提取音频和面部跟踪

python - 无法安装和构建 PyAudio

python - Raspberry Pi 将 Pyaudio Wav 转换为 Flac 48000hz + Google Speech

python - 处理实时音频而无需使用pyaudio进行编译

python - Itertools 无序笛卡尔积

python - **recurPower** 我明白了,但我不明白

python - 无法让WAF运行

android - 从sdcard Android Mediaplayer播放音频

audio - GStreamer通过UDP流音频和视频,以便能够在VLC上播放