首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python SpeechRecognition麦克风在list_microphone_names()中,但不在list_working_microphones()中

Python SpeechRecognition麦克风在list_microphone_names()中,但不在list_working_microphones()中
EN

Stack Overflow用户
提问于 2020-05-19 08:53:01
回答 1查看 669关注 0票数 0

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

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
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()期间不能通过它听到音频。

有人知道这可能是什么原因吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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之后的简单打印(“立即发言”)修复的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61881448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档