如何使用 PyAudio 选择特定的输入设备

2024-11-08 09:04:00
admin
原创
26
摘要:问题描述:通过 PyAudio 录制音频时,如何指定要使用的精确输入设备?我的电脑有两个麦克风,一个是内置的,一个是 USB 的,我想使用 USB 麦克风录音。Stream类有一个input_device_index用于选择设备的函数,但不清楚这个索引与设备之间的关系。例如,我怎么知道索引 0 指的是哪个设备...

问题描述:

通过 PyAudio 录制音频时,如何指定要使用的精确输入设备?

我的电脑有两个麦克风,一个是内置的,一个是 USB 的,我想使用 USB 麦克风录音。Stream类有一个input_device_index用于选择设备的函数,但不清楚这个索引与设备之间的关系。例如,我怎么知道索引 0 指的是哪个设备?如果我不得不猜测,我会说 0 指的是内置设备,而 1 指的是 USB 设备,但我想找到一些编程方法来确认这一点。在 Linux 上,有没有办法获取这些索引及其引用的设备的列表?


解决方案 1:

您可以使用 get_device_info_by_host_api_device_index。

例如:

import pyaudio

p = pyaudio.PyAudio()
info = p.get_host_api_info_by_index(0)
numdevices = info.get('deviceCount')

for i in range(0, numdevices):
    if (p.get_device_info_by_host_api_device_index(0, i).get('maxInputChannels')) > 0:
        print("Input Device id ", i, " - ", p.get_device_info_by_host_api_device_index(0, i).get('name'))

解决方案 2:

使用@slegroux 精彩代码查找音频索引:

import pyaudio

p = pyaudio.PyAudio()
info = p.get_host_api_info_by_index(0)
numdevices = info.get('deviceCount')

for i in range(0, numdevices):
    if (p.get_device_info_by_host_api_device_index(0, i).get('maxInputChannels')) > 0:
        print("Input Device id ", i, " - ", p.get_device_info_by_host_api_device_index(0, i).get('name'))

一旦找到要使用的麦克风所在的索引,请将 input_device_index 选项后跟麦克风的索引(在我的情况下,麦克风位于索引 1)添加到 p.open() 中,如下所示:

stream = p.open(
    format=FORMAT,
    channels=CHANNELS,
    rate=RATE,
    input=True,
    frames_per_buffer=FRAMES_PER_BUFFER,
    input_device_index=1
)

希望这有帮助!

解决方案 3:

我没有看过,pyaudio但是我也曾多次使用过声音设备。

input 下面是列出可用和的示例代码output audio devices

import sounddevice as sd
print sd.query_devices() 

从下面的输出可以看出,当我将耳机插入麦克风插孔时,Index 1就可以作为输入。
1 Jack Mic (IDT High Definition A, MME (2 in, 0 out)

虽然默认的笔记本电脑音频麦克风显示为index 2

2 Microphone Array (IDT High Defi, MME (2 in, 0 out)

输出

Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
   0 Microsoft Sound Mapper - Input, MME (2 in, 0 out)
>  1 Jack Mic (IDT High Definition A, MME (2 in, 0 out)
   2 Microphone Array (IDT High Defi, MME (2 in, 0 out)
   3 Microsoft Sound Mapper - Output, MME (0 in, 2 out)
<  4 Speakers / Headphones (IDT High, MME (0 in, 2 out)
   5 Communication Headphones (IDT H, MME (0 in, 2 out)
   6 Primary Sound Capture Driver, Windows DirectSound (2 in, 0 out)
   7 Jack Mic (IDT High Definition Audio CODEC), Windows DirectSound (2 in, 0 out)
   8 Microphone Array (IDT High Definition Audio CODEC), Windows DirectSound (2 in, 0 out)
   9 Primary Sound Driver, Windows DirectSound (0 in, 2 out)
  10 Speakers / Headphones (IDT High Definition Audio CODEC), Windows DirectSound (0 in, 2 out)
  11 Communication Headphones (IDT High Definition Audio CODEC), Windows DirectSound (0 in, 2 out)
  12 Communication Headphones (IDT High Definition Audio CODEC), Windows WASAPI (0 in, 2 out)
  13 Speakers / Headphones (IDT High Definition Audio CODEC), Windows WASAPI (0 in, 2 out)
  14 Jack Mic (IDT High Definition Audio CODEC), Windows WASAPI (2 in, 0 out)
  15 Microphone Array (IDT High Definition Audio CODEC), Windows WASAPI (2 in, 0 out)
  16 Headset Microphone (Bluetooth Hands-free Audio), Windows WDM-KS (1 in, 0 out)
  17 Headphones (Bluetooth Hands-free Audio), Windows WDM-KS (0 in, 2 out)
  18 Headphones (HpOut), Windows WDM-KS (0 in, 2 out)
  19 Microphone Array (MicIn2), Windows WDM-KS (2 in, 0 out)
  20 Jack Mic (MuxedIn), Windows WDM-KS (2 in, 0 out)
  21 Dock Mic (MuxedIn), Windows WDM-KS (2 in, 0 out)
  22 Rec. Playback (MuxedIn), Windows WDM-KS (2 in, 0 out)
  23 Speakers (Speaker/HP), Windows WDM-KS (0 in, 2 out)

解决方案 4:

您的麦克风(您当前正在使用的)的索引始终为 1。您可以使用@Anil_M 的代码对此进行测试:

import sounddevice as sd
print(sd.query_devices())

运行此代码,然后查看索引 1。现在拔下麦克风并再次运行代码。麦克风仍将处于 1 状态

仅当您想使用其他设备时,例如在我的情况下,我需要操作系统音频,您可以使用以下代码:

p = pyaudio.PyAudio()

# if there is no speaker device this all makes no sense anyways
try:
    wasapi_info = p.get_host_api_info_by_type(pyaudio.paWASAPI)
except OSError:
    exit()

#choosing the speaker device 
default_speakers=p.get_device_info_by_index(wasapi_info["defaultOutputDevice"]) 

# or "defaultInputDevice"

我必须提一下,此代码仅适用于 Windows

解决方案 5:

PyAudio 文档中指出您可以定义一个input_device_index

要找出该设备索引是什么,您可以按照此Github Gist中提供的代码或按照Raspberry Pi 论坛上提供的代码进行操作,该论坛提供了输出代码的示例。

解决方案 6:

您可以使用PulseAudio选择输入设备。

解决方案 7:

我不了解 PyAudio,但是使用sounddevice模块它是这样的:

python3 -m sounddevice

解决方案 8:

只需arecord -l列出所有可用的输入设备。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用