用python通过麦克风播放mp3文件

时间:2016-05-05 16:35:09

标签: python audio input mp3 microphone

有没有办法使用python(而不是任何外部软件)来播放麦克风输入等mp3文件?

例如,我有一个mp3文件和一个python脚本,它会通过我的麦克风播放它,所以语音室中的其他人会听到它。正如我所说,这只是一个例子。

当然,我做了一些研究。我发现我可以使用软件来创建虚拟设备并做一些事情来获得结果。但我的观点是,如果没有安装软件但有某种python脚本是可能的吗?

4 个答案:

答案 0 :(得分:4)

有可能,但是在python中不是100%,因为它需要安装其他软件。 (据我所知,这个特定的答案仅适用于Windows,但在使用PulseAudio而不是VB-Audio Cable的Linux上应该类似,但我不是Linux的日常用户,所以我不知道。)

首次下载:https://www.vb-audio.com/Cable/,这将创建一条“虚拟音频线”,程序可以在其中将音乐播放到输入设备(看起来像扬声器),然后将其通过管道传输到输出设备(看起来像扬声器)。就像麦克风一样。)

然后在cmd中运行以下命令:pip install pygame==2.0.0.dev8(或py -m pip install pygame==2.0.0.dev8,具体取决于您的python安装)[也是开发版本的原因是它仅需要sdl2中的某些功能,而主分支使用sdl1)

然后:

>>> from pygame._sdl2 import get_num_audio_devices, get_audio_device_name #Get playback device names
>>> from pygame import mixer #Playing sound
>>> mixer.init() #Initialize the mixer, this will allow the next command to work
>>> [get_audio_device_name(x, 0).decode() for x in range(get_num_audio_devices(0))] #Returns playback devices
['Headphones (Oculus Virtual Audio Device)', 'MONITOR (2- NVIDIA High Definition Audio)', 'Speakers (High Definition Audio Device)', 'Speakers (NVIDIA RTX Voice)', 'CABLE Input (VB-Audio Virtual Cable)']
>>> mixer.quit() #Quit the mixer as it's initialized on your main playback device
>>> mixer.init(devicename='CABLE Input (VB-Audio Virtual Cable)') #Initialize it with the correct device
>>> mixer.music.load("Megalovania.mp3") #Load the mp3
>>> mixer.music.play() #Play it

要停止音乐播放,请执行以下操作:mixer.music.stop()

此外,音乐不会通过扬声器播放,因此您将运行另一个python脚本或线程来处理通过扬声器播放的音乐。 (另外,如果您想让它在按钮上弹奏,我建议您使用python库键盘,GitHub文档确实很棒,您应该能够自己弄清楚它。)

PS:这花了我一段时间才能弄清楚,欢迎您。

PPS:我仍在努力寻找一种方法来传送自己的麦克风,因为这种方法显然也不会传送您的真实麦克风,但是查看pygame的源代码会让我头疼由于这些都是用C编写的。

答案 1 :(得分:0)

转到:http://pymedia.org/tut/ 它讲述了有关Microphone,Mp3,媒体文件的所有内容

答案 2 :(得分:0)

如果您的意思是如何使用Python播放MP3,那么这是一个广泛的问题。

是否有可能,没有任何依赖性,是的,但它是不值得的。好吧,播放未压缩的音频,但MP3,嗯,我将在下面解释。

要从Python播放原始音频数据而不安装pyaudio或pygame或类似的,您首先必须知道将运行脚本的平台。

然后实现一组很好的功能来选择音频设备,设置采样率,比特率,单声道/立体声等属性,将流输入音频卡并停止播放。

这并不难,但要做到这一点你必须在Windows上使用ctypes,Mac和Linux上的PyObjC是特殊情况,因为它支持许多音频系统(可能使用套接字连接到PulseAudio或管道到某些进程,如aplay / paplay / mpeg123 ......或者使用gstreamer。)。

但是为什么要通过所有这些只是为了避免依赖,当你有一个很好的库,有简单的接口来访问和使用音频设备。

PyAudio很棒。

嗯,这是你关注的问题。

但是,在没有外部库的情况下,从纯Python中实时播放MP3,嗯,这并非完全不可能,但实现起来非常困难,据我所知,没有人尝试过这样做。

有纯Python MP3解码器实现,但它比实时音频播放所需的慢10倍。它可以几乎全速优化,但没有人有兴趣这样做。

它具有很大的教育价值,适用于不需要实时速度的情况。

这是你应该做的:

安装pygame并使用它直接播放MP3

或:

安装PyAudio和一些解码Mp3的库,在pypi.python.org上有很多这样的库,用它来解码MP3并将输出提供给PyAudio。

还有更多的可能性,包括pymedia,但我认为这些是最简单的解决方案。

好的,我们澄清了你真正需要的是答案。

我会保留第一个答案,因为你也需要那个部分。

现在,您希望在录制流中播放音频,以便录制音频输入的任何应用程序都会记录您正在播放的内容。

在Windows上,这称为立体声混音,可在音量输入下的音量控制中找到。

您选择立体声混音作为默认输入。现在,当您打开一个没有选择其输入通道但使用所选输入通道(例如Skype)的录音应用程序时,它将记录所有扬声器并进入您的麦克风/线路。

我不是100%确定此选项是否会出现在所有Windows上,或者它是您所拥有的声卡的功能。

我很肯定Creative和Realtek声卡支持它。

所以,研究一下。

要从Python中选择该选项,您必须使用ctypes连接到winmm.dll并调用相应的函数。我不知道哪一个以及有什么论据。

如果音量控制中没有此选项,则除了安装虚拟声卡以便为您执行环回之外没有任何内容。

可能会有这样的软件打包成库,以便您可以使用Python或其他任何软件。

在Linux上,使用Pulseaudio应该很容易。我不知道怎么做,但我知道你可以做到,重定向流等等。那里有教程。

然后你可以从Python调用该命令,设置为this并重置回正常状态。

在Mac上,我真的不知道,但它应该是可能的。

如果您希望MP3只能播放到录音流而不是播放到扬声器,那么在Windows上,如果没有环回音频设备,您将无法播放。

在Linux上,我相信你能够做到这一点,而且在Mac上它应该是可能的,但Q是怎样的。

我目前没有时间嗅探库等,为您提供一些有用的代码,因此您必须自己动手。但我希望我的指示能帮到你。

答案 3 :(得分:0)

很好的答案,利亚姆。 如果您也想传送自己的麦克风,建议您使用此视频中的解决方案:https://www.youtube.com/watch?v=TQHP1PZBPvc。转到麦克风的设备属性,然后选中“侦听”,然后将播放设备设置为虚拟音频线。