Python调用ElevenLabs TTS后playsound报UnicodeDecodeError问题求助
解决Playsound播放音频时的UnicodeDecodeError错误
环境信息
- Python版本:3.9.13
- Playsound版本:1.2.2
- 操作系统:Windows 11
问题代码
import requests import random from playsound import playsound import os from colorama import Fore,init init(autoreset=True) import json from datetime import datetime import time def speak(txt): nows = datetime.now() with open("Library_9500.json", "r", encoding="utf-8") as f: data = json.load(f) CHUNK_SIZE = 1024 url = "https://api.elevenlabs.io/v1/text-to-speech/{}".format(data["tts_voice"]) headers = { "Accept": "audio/mpeg", "Content-Type": "application/json", "xi-api-key": "{}".format(data["tts_api"]) } data = { "text": "{}".format(txt), "model_id": "eleven_multilingual_v2", "voice_settings": { "stability": 0.5, "similarity_boost": 0.5 } } response = requests.post(url, json=data, headers=headers) rand = random.randint(0, 10000) file_name = "audio_" + str(rand) + ".mp3" with open(file_name, 'wb') as f: for chunk in response.iter_content(chunk_size=CHUNK_SIZE): if chunk: f.write(chunk) time.sleep(1) print(Fore.GREEN+"SB-9500: " + Fore.WHITE + "{}".format(txt)) logs4 = open("SystemLog.txt", "a", encoding="utf-8") logs4.write("[{}] > SB-9500: {}\n\n".format(nows, txt)) logs4.close() playsound(file_name) os.remove(file_name) speak("Hello World!")
错误信息
SB-9500: Hello World! Traceback (most recent call last): File "c:\Users\pc\OneDrive\Masaüstü\SB-9500\tts_api.py", line 63, in <module> speak("Hello World!") File "c:\Users\pc\OneDrive\Masaüstü\SB-9500\tts_api.py", line 60, in speak playsound(file_name) File "C:\Users\pc\AppData\Local\Programs\Python\Python39\lib\site-packages\playsound.py", line 35, in _playsoundWin winCommand('open "' + sound + '" alias', alias) File "C:\Users\pc\AppData\Local\Programs\Python\Python39\lib\site-packages\playsound.py", line 30, in winCommand '\n ' + errorBuffer.value.decode()) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 6: invalid start byte
修复方案
这个错误是因为playsound 1.2.2版本在Windows系统下处理错误信息时,强制用utf-8解码包含非utf-8编码的字节导致的,以下是几种可行的修复方式:
方法1:修改playsound源码
找到Python安装目录下的playsound.py文件(示例路径:C:\Users\pc\AppData\Local\Programs\Python\Python39\lib\site-packages\playsound.py),定位到winCommand函数的错误抛出部分,将解码方式改为Windows系统默认的mbcs编码:
原代码:
raise PlaysoundException(exceptionMessage + '\n ' + errorBuffer.value.decode())
修改为:
raise PlaysoundException(exceptionMessage + '\n ' + errorBuffer.value.decode('mbcs'))
方法2:升级playsound到修复版本
playsound的后续版本已修复该编码问题,执行以下命令升级:
pip install --upgrade playsound
升级后重新运行代码即可。
方法3:替换为其他音频播放库
如果不想修改源码或升级,可改用pygame库替代playsound:
- 先安装pygame:
pip install pygame
- 替换代码中
playsound(file_name)的部分为:
import pygame pygame.mixer.init() pygame.mixer.music.load(file_name) pygame.mixer.music.play() # 等待音频播放完成 while pygame.mixer.music.get_busy(): time.sleep(0.1) pygame.mixer.quit()
内容的提问来源于stack exchange,提问作者Salih Bastan
相关产品推荐
相关产品推荐

