写入音频文件时触发PermissionError权限拒绝问题求助
解决音频文件写入权限错误(PermissionError: [Errno 13])
问题原因
Windows系统中,playsound播放音频后不会立即释放文件的占用权限,导致第二次调用audio.save()覆盖audio.mp3时,因文件被占用无法写入,触发权限错误。
修复方案
方案1:使用临时文件避免重复覆盖
每次生成唯一的临时音频文件,播放完成后删除,彻底避免文件占用冲突。修改代码如下:
from gtts import gTTS from playsound import playsound import tempfile import os def speak(text, language): audio = gTTS(text=text, lang=language, slow=False, tld="com") # 创建临时文件 with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file: temp_filename = temp_file.name audio.save(temp_filename) playsound(temp_filename) # 播放完成后删除临时文件 os.remove(temp_filename) if __name__ == "__main__": print("--------------------- Welcome to RoboSpeaker -----------------------") print("Press 'q' to quit.") while True: print("Please Enter the Text Which You Want this Programm to Play(Don't Include any Punctuation).") text = input(":- ") language = "en" if text == "q": break speak(text, language)
方案2:替换playsound为pygame(更稳定)
playsound在Windows上存在文件句柄泄漏的已知问题,改用pygame播放音频能更好地管理资源:
- 先安装pygame:
pip install pygame
- 修改代码:
from gtts import gTTS import pygame import time def speak(text, language): audio = gTTS(text=text, lang=language, slow=False, tld="com") audio.save("audio.mp3") # 初始化pygame音频模块 pygame.mixer.init() pygame.mixer.music.load("audio.mp3") pygame.mixer.music.play() # 等待播放完成 while pygame.mixer.music.get_busy(): time.sleep(0.1) # 卸载音频文件,释放占用 pygame.mixer.music.unload() if __name__ == "__main__": print("--------------------- Welcome to RoboSpeaker -----------------------") print("Press 'q' to quit.") while True: print("Please Enter the Text Which You Want this Programm to Play(Don't Include any Punctuation).") text = input(":- ") language = "en" if text == "q": break speak(text, language)
方案3:强制关闭文件句柄(临时 workaround)
如果坚持使用playsound,可以尝试用ctypes强制释放文件句柄,但这种方法兼容性较差,不推荐:
from gtts import gTTS from playsound import playsound import ctypes def release_file_handle(filename): handle = ctypes.windll.kernel32.CreateFileW(filename, 128, 0, None, 3, 128, None) ctypes.windll.kernel32.CloseHandle(handle) def speak(text, language): audio.save("audio.mp3") playsound("audio.mp3") # 播放后释放句柄 release_file_handle("audio.mp3") # 主程序部分不变
内容的提问来源于stack exchange,提问作者PRADDYUMN YADAV
相关产品推荐
相关产品推荐

