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

Python文本转语音程序输出不符合预期问题求助

文本转语音程序不符合预期的问题排查与修复

我是编程新手,编写了一个基于gTTS和pygame的文本转语音程序。程序虽能运行,但输出不符合预期:输入以逗号分隔的名字(如a,b,c,d)时,实际会朗读“Shoutout to a, b, c, and d”,而我期望逐个朗读“Shoutout to a”“Shoutout to b”等。以下是我的代码:

from gtts import gTTS
import time
from pygame import mixer

a = input("Enter shoutout names separated by a comma: ")

a.split(",")

list = []

for i in a:
    list.append(a)

for i in list:
    g = gTTS("Shoutout to "+i,lang="en",tld="com.au")
    speech_file = 'spf.mp3'
    g.save(speech_file)
    mixer.init()
    mixer.music.load('spf.mp3')
    mixer.music.play()
    time.sleep(len(list))

问题原因

  • split方法未赋值:a.split(",")执行后会返回分割后的列表,但你没把结果存回变量,a还是原来的完整输入字符串,等于没做分割操作。
  • 循环逻辑错误:for i in a是遍历字符串的每个字符,不是分割后的名字;而且每次append的都是整个a,导致list里全是原输入的完整字符串,循环时生成的语音自然包含所有名字。
  • 初始化与睡眠逻辑问题:每次循环都调用mixer.init()属于重复初始化;time.sleep(len(list))用列表长度当睡眠时间完全不合理,没法准确等待当前语音播放完毕。

修正后的代码

from gtts import gTTS
import time
from pygame import mixer

# 获取输入并分割成名字列表,同时清理每个名字的空格与空条目
names = input("Enter shoutout names separated by a comma: ").split(",")
names = [name.strip() for name in names if name.strip()]

# 仅初始化一次mixer
mixer.init()

for name in names:
    # 生成单个名字的语音
    tts = gTTS(f"Shoutout to {name}", lang="en", tld="com.au")
    speech_file = f"shoutout_{name}.mp3"  # 不同文件名避免覆盖
    tts.save(speech_file)
    
    # 播放语音
    mixer.music.load(speech_file)
    mixer.music.play()
    
    # 等待语音播放完毕,直到播放状态结束
    while mixer.music.get_busy():
        time.sleep(0.1)

关键修改说明

  1. 把split结果赋值给names,用列表推导式清理无效内容,确保每个元素都是干净的名字。
  2. 直接遍历分割后的names列表,每次处理单个名字,生成对应语音内容。
  3. 将mixer.init()移到循环外,避免重复初始化。
  4. 用mixer.music.get_busy()判断播放状态,代替固定时长sleep,确保每个语音完整播放。
  5. 给每个语音文件设置独特名称,防止被后续文件覆盖(可选但更稳妥)。

内容的提问来源于stack exchange,提问作者BigNerd1000101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:51:12