使用 Microsoft 语音服务收听 2 个或更多麦克风

Listening for 2 or more microphones using Microsoft speech services

美好的一天

我在 python 中有一个项目,您可以在其中交谈并获得回复,例如聊天。该应用程序运行良好,现在我希望能够安装两个麦克风并通过我的两个麦克风与我的助手交谈。

但问题是,我使用的是 Microsoft 语音服务,在他们的示例中,他们没有展示使用两个音频流或与此相关的东西。我看到他们关于使用 Java、C# 和 C++ 进行多重音频识别的主题。不支持python。

我的问题是,有没有什么方法可以将两个或更多麦克风连接到我的笔记本电脑并同时使用两个音频流来从我的应用程序获得响应?

我安装了 python3.9,我的代码只使用 Microsoft examles 中的 recognize_once() 函数。

我在想有什么方法可以 运行 喜欢多线程并从这些线程中收听音频,我不知道。我确实搜索了与此相关的主题,但人们解释说用 PyAudio 这样做,我使用微软语音服务,因为我的语言不受支持。

任何帮助将不胜感激,对不起我的英语。

对于这种问题,我们可以使用多声道数组。有一项名为“麦克风阵列推荐”的服务。有不同的阵列通道,根据通道数,我们可以包括微 电话。我们可以包含 2、4、7 个通道的数组。

2 个麦克风 - 这是一个线性通道。

查看以下文档以了解间距和麦克风阵列。

Document

您需要确定是否启用了默认的Microsoft Azure Kinect DK。按照下面的python代码,它处于运行状态。

import pyaudio
import wave
import numpy as np

p = pyaudio.PyAudio()

# Find out the index of Azure Kinect Microphone Array
azure_kinect_device_name = "Azure Kinect Microphone Array"
index = -1
for i in range(p.get_device_count()):
    print(p.get_device_info_by_index(i))
    if azure_kinect_device_name in p.get_device_info_by_index(i)["name"]:
        index = i
        break
if index == -1:
    print("Could not find Azure Kinect Microphone Array. Make sure it is properly connected.")
    exit()

# Open the stream for reading audio
input_format = pyaudio.paInt32
input_sample_width = 4
input_channels = 7 #choose your channel count among 2,4,7
input_sample_rate = 48000

stream = p.open(format=input_format, channels=input_channels, rate=input_sample_rate, input=True, input_device_index=index)

# Read frames from microphone and write to wav file
with wave.open("output.wav", "wb") as outfile:
    outfile.setnchannels(1) # We want to write only first channel from each frame
    outfile.setsampwidth(input_sample_width)
    outfile.setframerate(input_sample_rate)

    time_to_read_in_seconds = 5
    frames_to_read = time_to_read_in_seconds * input_sample_rate
    total_frames_read = 0
    while total_frames_read < frames_to_read:
        available_frames = stream.get_read_available()
        read_frames = stream.read(available_frames)
        first_channel_data = np.fromstring(read_frames, dtype=np.int32)[0::7].tobytes()
        outfile.writeframesraw(first_channel_data)
        total_frames_read += available_frames

stream.stop_stream()
stream.close()

p.terminate()