You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:

  1. 打开虚拟环境中speech_recognition/__init__.py文件;
  2. 找到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:20:41