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

写入音频文件时触发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播放音频能更好地管理资源:

  1. 先安装pygame:
pip install pygame
  1. 修改代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:30:24