树莓派Python 3.7 TTS生成音频9次后无声音问题求助
问题
环境:Raspberry PI、Python 3.7
程序读取城市列表,用gTTS生成并播报城市名音频,前9个城市音频正常,之后仅生成空音频文件,无声音输出;程序无报错持续运行。循环周期240秒,每小时调用15次TTS,在gTTS每小时100次的调用限制内。重启程序后,仍仅前9次音频正常,后续再次出现无声音情况。
相关代码:
# TTS Name def tts_name(name): global saveit # TTS and Save City Name tts = gtts.gTTS(name) saveit = "Name.mp3" tts.save(saveit) # Play City Name def Play_Name(): # Define Media Player file media = vlc.MediaPlayer("/home/pi/Nextion/OpenWeather_10/" + saveit) # setting volume media.audio_set_volume(90) # Play Name media.play()
分析与修复
核心原因
每次生成的音频都复用Name.mp3文件名,而vlc的play()是非阻塞调用,前一次播放的进程可能还没释放文件锁,导致后续gTTS写入失败,生成空文件。另外,重复创建vlc播放器实例也可能积累资源引发异常。
修复步骤
- 使用唯一文件名避免冲突
每次生成音频时生成唯一文件名,播放完成后删除临时文件,彻底解决文件占用问题:
import os import time import uuid import gtts import vlc def tts_name(name): global saveit # 生成8位随机字符串作为文件名后缀,确保唯一 saveit = f"Name_{uuid.uuid4().hex[:8]}.mp3" tts = gtts.gTTS(name) tts.save(saveit) def Play_Name(): media_path = f"/home/pi/Nextion/OpenWeather_10/{saveit}" media = vlc.MediaPlayer(media_path) media.audio_set_volume(90) media.play() # 等待播放完成,避免文件被占用 while media.is_playing(): time.sleep(0.1) # 停止播放并释放资源 media.stop() # 删除临时音频文件 os.remove(media_path)
- 复用vlc播放器实例(可选优化)
频繁创建播放器实例可能消耗资源,复用同一个实例能提升稳定性:
# 全局初始化播放器实例 player = vlc.MediaPlayer() def Play_Name(): media_path = f"/home/pi/Nextion/OpenWeather_10/{saveit}" media = vlc.Media(media_path) player.set_media(media) player.audio_set_volume(90) player.play() while player.is_playing(): time.sleep(0.1) player.stop() os.remove(media_path)
- 显式关闭gTTS连接(可选)
连续调用gTTS可能存在会话缓存问题,显式关闭连接可避免异常:
def tts_name(name): global saveit saveit = f"Name_{uuid.uuid4().hex[:8]}.mp3" tts = gtts.gTTS(name) with open(saveit, 'wb') as f: tts.write_to_fp(f) # 关闭gTTS底层HTTP连接 tts.client.close()
内容的提问来源于stack exchange,提问作者Robert E. Smith
相关产品推荐
相关产品推荐

