在python中记录输出声音

时间:2010-01-12 04:08:26

标签: python macos audio audio-streaming

我想以编程方式记录我的笔记本电脑中出现的声音。我找到了PyAudio并提出了以下完成任务的程序:

import pyaudio, wave, sys

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = sys.argv[1]

p = pyaudio.PyAudio()
channel_map = (0, 1)

stream_info = pyaudio.PaMacCoreStreamInfo(
    flags = pyaudio.PaMacCoreStreamInfo.paMacCorePlayNice,
    channel_map = channel_map)

stream = p.open(format = FORMAT,
                rate = RATE,
                input = True,
                input_host_api_specific_stream_info = stream_info,
                channels = CHANNELS)

all = []
for i in range(0, RATE / chunk * RECORD_SECONDS):
        data = stream.read(chunk)
        all.append(data)
stream.close()
p.terminate()

data = ''.join(all)
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(data)
wf.close()

问题是我必须将耳机插孔连接到麦克风插孔。我试图替换这些行:

input = True,
input_host_api_specific_stream_info = stream_info,

用这些:

output = True,
output_host_api_specific_stream_info = stream_info,

然后我收到了这个错误:

  

追踪(最近的呼叫最后):
   文件“./test.py”,第25行,中      data = stream.read(chunk)
   文件“/Library/Python/2.5/site-packages/pyaudio.py”,第562行,处于读数
     paCanNotReadFromAnOutputOnlyStream)
  IOError:[Errno Not input stream] -9975

有没有办法实例化PyAudio流,以便从计算机的输出输入,我不必将耳机插孔连接到麦克风?有没有更好的方法来解决这个问题?我宁愿坚持使用python应用程序并避免使用cocoa。

5 个答案:

答案 0 :(得分:5)

您可以安装Soundflower,它允许您创建额外的音频设备并在它们之间路由音频。通过这种方式,您可以将系统的输出定义到Soundflower设备,并使用PyAudio从中读取音频。

您还可以查看PyJackJack音频客户端。

答案 1 :(得分:0)

不幸的是,没有万无一失的方法,但Audio HijackWiretap是最适合的工具。

答案 2 :(得分:0)

我可以通过不使用程序化方式给出答案。 面板>声音>录制>>实现立体声混音。 这需要驾驶员支持。 我还发现这让我的真实声音回响。 至少这解决了我的问题。

答案 3 :(得分:0)

以编程方式执行此操作会很棘手。基本上,不可能截获“输出”前面的音频流量。因此,您要做的就是创建自己的虚拟音频设备,然后将要捕获的任何应用程序制作到该设备上。

其他人也提到过的不同第三方应用程序似乎在MacOS上提供了这样的功能。我可以添加Loopback,但是我对任何一种工具都没有经验。

以编程方式,您必须模仿完全一样的东西。

答案 4 :(得分:0)

pycorder处签出该脚本。它用python记录输出声音。我会考虑修改其中一个功能,以通过sounddevice模块使用输出流来记录输出。您可以查看声音设备here的文档。该脚本可以工作,您可以根据需要实现该脚本,但是用输出流替换记录系统可能会使代码的混乱程度和效率降低。