使用SpeechRecognition的recognize_whisper()方法时遇权限拒绝错误
问题描述
测试SpeechRecognition模块的转写功能时,recognize_google()可正常完成转写,但调用recognize_whisper()时,系统会在%LocalAppData%\Temp\下创建随机命名的临时WAV文件,随后抛出Permission denied错误。错误栈如下:
Traceback (most recent call last): File "D:\Users\Renato\Documents\Code\projects\transcriber\.venv\lib\site-packages\whisper\audio.py", line 42, in load_audio ffmpeg.input(file, threads=0) File "D:\Users\Renato\Documents\Code\projects\transcriber\.venv\lib\site-packages\ffmpeg\_run.py", line 325, in run raise Error('ffmpeg', out, err) ffmpeg._run.Error: ffmpeg error (see stderr output for detail) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "d:\Users\Renato\Documents\Code\projects\transcriber\main.py", line 15, in <module> print("Transcription: " + r.recognize_whisper(audio_data=audio_data, model="medium", language="uk")) File "D:\Users\Renato\Documents\Code\projects\transcriber\.venv\lib\site-packages\speech_recognition\__init__.py", line 1697, in recognize_whisper result = self.whisper_model[model].transcribe( File "D:\Users\Renato\Documents\Code\projects\transcriber\.venv\lib\site-packages\whisper\transcribe.py", line 85, in transcribe mel = log_mel_spectrogram(audio) File "D:\Users\Renato\Documents\Code\projects\transcriber\.venv\lib\site-packages\whisper\audio.py", line 111, in log_mel_spectrogram audio = load_audio(audio) File "D:\Users\Renato\Documents\Code\projects\transcriber\.venv\lib\site-packages\whisper\audio.py", line 47, in load_audio libavdevice 59. 7.100 / 59. 7.100 libavfilter 8. 44.100 / 8. 44.100 libswscale 6. 7.100 / 6. 7.100 libswresample 4. 7.100 / 4. 7.100 libpostproc 56. 6.100 / 56. 6.100C:\Users\Renato\AppData\Local\Temp\tmps_pfkh0z.wav: Permission denied
测试代码:
import speech_recognition as sr r = sr.Recognizer() with sr.AudioFile("audio.wav") as src: audio_data = r.record(src) print("Transcription: " + r.recognize_whisper(audio_data=audio_data, model="medium", language="en"))
已尝试的解决方法:安装不同版本的ffmpeg(gyan.dev、BtbN预编译包、chocolatey安装)、取消Temp文件夹只读属性,均无效。运行环境为Windows下的venv虚拟环境。
解决方案
1. 直接传入音频文件路径而非audio_data
recognize_whisper()支持直接传入文件路径,无需先读取为audio_data,可绕过临时文件创建步骤,直接让Whisper读取原音频文件:
import speech_recognition as sr r = sr.Recognizer() # 直接传入音频文件路径,避免生成临时文件 result = r.recognize_whisper(audio_data="audio.wav", model="medium", language="en") print("Transcription: " + result)
2. 指定自定义临时目录
系统默认Temp目录可能存在权限限制或被安全软件拦截,可手动指定项目内的临时目录:
import speech_recognition as sr import tempfile import os # 创建项目内的临时目录 custom_temp_dir = os.path.join(os.getcwd(), "temp") os.makedirs(custom_temp_dir, exist_ok=True) # 设置临时文件目录 tempfile.tempdir = custom_temp_dir r = sr.Recognizer() with sr.AudioFile("audio.wav") as src: audio_data = r.record(src) print("Transcription: " + r.recognize_whisper(audio_data=audio_data, model="medium", language="en"))
3. 检查安全软件拦截
Windows Defender或第三方杀毒软件的受控文件夹访问、实时防护功能可能阻止ffmpeg访问临时文件。尝试:
- 临时关闭安全软件,测试是否能正常运行;
- 将Python解释器、ffmpeg.exe添加到安全软件信任列表;
- 将系统Temp目录或自定义临时目录添加到安全软件允许访问列表。
4. 以管理员身份运行脚本
右键点击命令提示符/PowerShell,选择「以管理员身份运行」,再激活虚拟环境并执行脚本,普通用户权限可能无法对系统Temp目录进行某些操作。
5. 修改SpeechRecognition临时文件处理逻辑(临时 workaround)
如果上述方法都无效,可临时修改SpeechRecognition库中recognize_whisper的代码,确保临时文件被正确关闭后再调用Whisper:
- 打开虚拟环境中
speech_recognition/__init__.py文件; - 找到
recognize_whisper函数中保存临时文件的代码段,修改为:temp_file_path = None with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f: f.write(audio_data.get_wav_data()) temp_file_path = f.name # 确保文件流关闭后再处理 result = self.whisper_model[model].transcribe( temp_file_path, language=language, **kwargs ) # 最后删除临时文件 os.unlink(temp_file_path)
注意:修改库文件会在更新库时被覆盖,仅作为临时解决方案。
内容的提问来源于stack exchange,提问作者rodrigues
相关产品推荐
相关产品推荐

