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

Pro*_*ner 4 python audio mp3 input microphone

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

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

当然,我也做过一些研究。我发现我可以使用一个软件来创建一个虚拟设备并且做一些事情来获得结果。但我的观点是,是否可以不安装软件但使用某种 python 脚本?

PyP*_*lia 12

这是可能的,但在 python 中不是 100%,因为它需要安装其他软件。(据我所知,这个特定的答案仅适用于 Windows,但它在 Linux 上应该与 PulseAudio 而不是 VB-Audio Cable 类似,但我不是 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
Run Code Online (Sandbox Code Playgroud)

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

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

PS:我花了一段时间才弄明白,不客气。

PPS:我仍在尝试找出一种方法将您自己的麦克风也通过管道传输到那里,因为这种方法显然也不会通过管道传输您的真实麦克风,但是查看 pygame 的源代码让我很头疼都是用C写的。


Dal*_*len 4

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

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

要在不安装 pyaudio 或 pygame 或类似软件的情况下播放来自 Python 的原始音频数据,您首先必须知道脚本运行的平台。

然后实现一组不错的功能,用于选择音频设备,设置采样率、比特率、单声道/立体声等属性,将流馈送到声卡并停止播放。

这并不难,但是要做到这一点,你必须在 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 调用该命令,进行设置并重置回正常状态。

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

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

在 Linux 上,我相信你能够做到,在 Mac 上也应该可以,但是 Q.

我目前没有时间嗅探库等来为您提供一些有用的代码,所以您必须自己做。但我希望我的指导能对您有所帮助。