0

我在 python 中遇到了“sounddevice”包的问题。具体来说,该软件包能够识别我笔记本电脑(Windows 10)中默认麦克风的音频,但是当我将它连接到 airpods 时,它似乎没有检测到任何音频。此外,我也能够从 PyAudio 流中检测到类似的行为。

为了确认,airpod 的麦克风和扬声器确实可以正常工作。另外,我正在使用 vosk 库。我将提供一个片段代码(我怀疑导致错误的代码部分)和整个代码。

片段代码:

#Snip..
with sd.RawInputStream(samplerate=samplerate, blocksize=16000, device=device, dtype='int16',
                            channels=1, callback=callback):
            print('#' * 80)
            print('Press Ctrl+C to stop the recording')
            print('#' * 80)

            rec = vosk.KaldiRecognizer(model, samplerate) #Recognizer from vosk
            while True:
                sleep(0.1)
                data = q.get()
                if rec.AcceptWaveform(data):
                    dat = json.loads(rec.Result()) #Prints final results
                    print(dat["text"]) #Prints 
                    break
                else:
                    partial_dat = json.loads(rec.PartialResult())
                    print(partial_dat["partial"]) #Prints assumed text
#Snip..

完整代码:

#!/usr/bin/env python3

import json
import traceback
import os
import queue
import sounddevice as sd
import vosk
import sys
from time import sleep

q = queue.Queue()

def callback(indata, frames, time, status):
    if status:
        print(status, file=sys.stderr)
    q.put(bytes(indata))

try:
    model = None
    samplerate = None
    device = None
    if model is None:
        model = os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__))), "Audio Model")
    if samplerate is None:
        device_info = sd.query_devices(device, 'input')
        samplerate = int(device_info['default_samplerate'])

    model = vosk.Model(model)

    with sd.RawInputStream(samplerate=samplerate, blocksize=16000, device=device, dtype='int16',
                            channels=1, callback=callback):
            print('#' * 80)
            print('Press Ctrl+C to stop the recording')
            print('#' * 80)

            rec = vosk.KaldiRecognizer(model, samplerate)
            while True:
                sleep(0.1)
                data = q.get()
                if rec.AcceptWaveform(data):
                    dat = json.loads(rec.Result())
                    print(dat["text"])
                    break
                else:
                    partial_dat = json.loads(rec.PartialResult())
                    print(partial_dat["partial"])

except KeyboardInterrupt:
    print('\nDone')
    exit()
except Exception:
    print(traceback.format_exc())

此外,上面的完整代码是可复制的,但您必须下载 1.0 GB 的模型(https://alphacephei.com/vosk/models/vosk-model-en-us-daanzu-20200905.zip)或者您可以下载127 MB 的更轻版本(https://alphacephei.com/vosk/models/vosk-model-en-us-daanzu-20200905-lgraph.zip)[但我不确定更轻的版本 nas 我还没有尝试过],然后提取脚本所在的 .zip 文件并将其命名为“音频模型”。对于依赖项,pip3 install vosk并且pip3 install sounddevice.

这是我第一次在这个网站上发布问题,所以我提前为错误的格式道歉。

编辑
我不知道它是否有帮助,但是当我在通话(Zoom、Teams、Discord 等)并连接了我的 airpods 并且我尝试应用程序来识别它时,它会识别它。但是,当通话结束并且我断开连接时,它会停止识别。

4

0 回答 0