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

Python3.10.4 x64环境pyttsx3切换语音报索引越界问题求解

问题根源

pyttsx3本身不内置语音资源,直接调用操作系统本地的TTS引擎服务。你触发IndexError: list index out of range的原因是当前64位Python环境下,pyttsx3只检测到1个可用语音,voices列表长度为1,访问索引1自然会越界。

解决步骤

1. 先打印所有已识别的语音信息

不要硬编码列表索引,先运行以下代码输出当前环境能识别到的全部语音属性,确认现有语音情况:

import pyttsx3

engine = pyttsx3.init()
voices = engine.getProperty('voices')

for index, voice in enumerate(voices):
    print(f"索引:{index}")
    print(f"语音ID:{voice.id}")
    print(f"语音名称:{voice.name}")
    print(f"对应语言:{voice.languages}")
    print(f"性别:{voice.gender}")
    print("-" * 40)

如果运行后只输出1条女声记录,说明系统没有安装能被64位Python识别到的男声语音包,按下一步操作安装。

2. 安装系统男声语音包

以你使用的Windows系统为例:

  • 打开系统设置 → 时间和语言 → 语音
  • 在「管理语音」区域点击「添加语音」
  • 选择对应语言的男声资源(比如英文男声Microsoft David、中文男声云扬等),等待安装完成
  • 安装后完全关闭当前Python进程,重新运行第一步的打印代码,就能看到新增的男声条目

*注意:64位Python只能识别64位的系统语音包,部分老旧的第三方32位语音包无法被识别,优先安装系统官方提供的语音资源。

3. 切换到目标男声

不要硬编码索引值(不同设备的语音排序不固定,硬写索引容易再次出现越界或切错语音的问题),通过语音名称匹配目标男声即可,参考代码:

import pyttsx3

engine = pyttsx3.init()
voices = engine.getProperty('voices')

# 替换判断条件里的关键词为你第一步打印出来的男声名称关键词
for voice in voices:
    if "David" in voice.name or "云扬" in voice.name:
        engine.setProperty('voice', voice.id)
        break

engine.say('I\'m a little teapot...')
engine.runAndWait()

内容的提问来源于stack exchange,提问作者Ömer Yılmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:15:28