使用KivyMD开发APK调用SpeechRecognition库时麦克风报错问题求助
解决SpeechRecognition在KivyMD安卓应用中的未知值错误
1. 补全buildozer.spec的依赖与权限配置
你的buildozer.spec缺少speechrecognition核心依赖,同时需要显式声明安卓系统权限:
- 更新
requirements项,加入所需依赖:
requirements = python3,kivy,kivymd,android,speechrecognition,pyjnius
- 添加安卓权限(无此项则新增):
android.permissions = RECORD_AUDIO, INTERNET
注:INTERNET权限用于Google在线语音识别API,若仅使用离线识别可忽略,但多数场景需保留。
2. 完善权限请求与校验逻辑
仅发起权限请求不足以保证操作时权限就绪,需在启动时请求并在识别前校验:
from kivy.utils import platform from android.permissions import request_permissions, Permission, check_permission from kivymd.app import MDApp import speech_recognition as sr class YourApp(MDApp): def on_start(self): if platform == 'android': # 启动时检查并请求权限 required_perms = [Permission.RECORD_AUDIO, Permission.INTERNET] if not all(check_permission(p) for p in required_perms): request_permissions(required_perms, self._handle_perm_result) def _handle_perm_result(self, permissions, grant_results): # 权限请求结果处理,可添加用户提示 for perm, granted in zip(permissions, grant_results): if perm == Permission.RECORD_AUDIO and not granted: # 提示用户必须授予录音权限才能使用功能 pass def trigger_recognition(self): if platform == 'android': # 识别前再次校验权限 if not check_permission(Permission.RECORD_AUDIO): return # 执行语音识别逻辑 r = sr.Recognizer() with sr.Microphone() as source: r.adjust_for_ambient_noise(source) # 适配安卓设备,调整超时和时长参数 audio = r.listen(source, timeout=5, phrase_time_limit=10) try: text = r.recognize_google(audio, language='zh-CN') # 处理识别结果 except sr.UnknownValueError: # 捕获未知值错误,做友好提示 pass except sr.RequestError as e: # 处理网络或API请求失败 pass
3. 适配安卓麦克风输入参数
安卓设备的麦克风输入特性与桌面不同,调整listen()参数避免异常:
- 设置
timeout=5:给用户充足的说话准备时间 - 设置
phrase_time_limit=10:限制单次识别的最长时长 - 必须调用
adjust_for_ambient_noise():适配环境噪音,提升识别稳定性
4. 检查系统权限状态
若上述配置后仍报错,需确认安卓设备的系统设置中,应用已被授予录音权限——用户可能之前拒绝了权限请求且勾选了“不再询问”,需引导用户到系统设置开启。
内容的提问来源于stack exchange,提问作者TS46
相关产品推荐
相关产品推荐

