【问题标题】:Python SpeechRecognition mic in list_microphone_names() but not in list_working_microphones()list_microphone_names() 中的 Python SpeechRecognition 麦克风,但 list_working_microphones() 中没有
【发布时间】:2020-05-20 01:01:04
【问题描述】:

我正在按照here 列出的代码构建我自己的智能扬声器。我购买了this 蓝牙扬声器/麦克风。当我用它大胆地录制音频时,麦克风工作得很好,当我使用以下使用 PyAudio 但不使用 SpeechRecognition 的代码时工作正常

import pyaudio
import wave
from array import array

FORMAT=pyaudio.paInt16
CHANNELS=2
RATE=44100*2
CHUNK=1024
RECORD_SECONDS=5
FILE_NAME="RECORDING.wav"

audio=pyaudio.PyAudio() #instantiate the pyaudio

#recording prerequisites
stream=audio.open(format=FORMAT,channels=CHANNELS,
                  rate=RATE,
                  input=True,
                  frames_per_buffer=CHUNK)

#starting recording
frames=[]

for i in range(0,int(RATE/CHUNK*RECORD_SECONDS)):
    data=stream.read(CHUNK)
    data_chunk=array('h',data)
    vol=max(data_chunk)
    if(vol>=500):
        print("something said")
        frames.append(data)
    else:
        print("nothing")
    print("\n")


#end of recording
stream.stop_stream()
stream.close()
audio.terminate()
#writing to file
wavfile=wave.open(FILE_NAME,'wb')
wavfile.setnchannels(CHANNELS)
wavfile.setsampwidth(audio.get_sample_size(FORMAT))
wavfile.setframerate(RATE)
wavfile.writeframes(b''.join(frames))#append frames recorded to file
wavfile.close()

但是当我尝试使用以下代码时

import speech_recognition as sr
import pyaudio

r = sr.Recognizer()

mic = sr.Microphone(device_index=1)

with mic as source:
    r.adjust_for_ambient_noise(source)
    audio = r.listen(source, timeout=5)

print(r.recognize_google(audio))

有了这个扬声器/麦克风,它可以无限期地挂起。我使用了一个 USB 麦克风,切换了 device_index,它工作正常。当我 list_microphone_names() 我可以在我的选项列表中看到蓝牙麦克风为“耳机麦克风(蓝牙 H”以及我的 USB 麦克风“麦克风(蓝色雪球)”,但是当我 list_working_microphones() 时,蓝牙麦克风不见了。本质上,它识别出设备存在,但在 r.listen() 期间没有通过它听到音频。

有人知道是什么原因造成的吗?

【问题讨论】:

    标签: python bluetooth speech-recognition pyaudio


    【解决方案1】:

    我深入研究了 Recognizer.listen() 的源代码,发现问题与它用作开始和停止录制音频的阈值的“能量”水平有关。默认能量水平(由 audioop.rms(buffer, source.SAMPLE_WIDTH) 测量)用作确定某人是否在说话的截止值是 300,并且会降低直到音频水平首次突破此阈值。然后,在录制时,它会检查音频的多个并发实例是否低于截止值(pause_buffer_count,默认为 35)以结束一个短语。

    我使用的蓝牙麦克风似乎会吸收很多环境噪音(和/或只是热垃圾),即使我不说话也会有 100-400 的能量,所以程序会认为我还在说话。我通过让 adjust_for_ambient_noise 在尝试收听音频之前运行更长的时间来解决此问题。

    我的次要问题是在说话之前没有等待足够长的时间来运行adjust_for_ambient_noise,这会切断我的短语,有时会低于转录的音频长度限制,这会导致它默默地尝试重新录制语句。在 adjust_for_ambient_noise 之后通过简单的 print("speak now") 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-04
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2019-12-26
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多