我正在按照列出的代码here来构建我自己的智能扬声器。我购买了this蓝牙扬声器/麦克风。当我在audacity中录制音频时,麦克风工作得很好,当我使用以下使用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()期间不能通过它听到音频。
有人知道这可能是什么原因吗?
发布于 2020-05-20 00:51:50
我深入研究了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之后的简单打印(“立即发言”)修复的。
https://stackoverflow.com/questions/61881448
复制相似问题