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

Windows 11 TTS语音注册及Pablo/George语音调用失败求助

问题:Django中调用Pablo和George TTS语音失败

问题描述

开发Python/Django应用时,无法正常使用Pablo(西班牙语-西班牙)和George(英语-英国)两款TTS语音。前端发送包含语音类型和文本的JSON,后端通过win32com调用对应语音朗读,但调用这两款语音时触发错误。

相关代码

import win32com.client, pythoncom
from .translator import translate_text


def check_voices():

    pythoncom.CoInitialize()

    try:
        speaker = win32com.client.Dispatch('SAPI.SpVoice')
        voices = speaker.GetVoices()

        for voice in voices:
            print(f"Voice: {voice.GetDescription()}, Id: {voice.Id}")
    finally:
        # Finalizar COM
        pythoncom.CoUninitialize()


def sound_rate(speaker):
    speaker.Rate = -1  # rango -10(lento) - 10(rapido)


def sound_volume(speaker):
    speaker.Volume = 100    # rango 0(bajo) - 100(alto)


def text_to_speech(language, text):

    pythoncom.CoInitialize()

    try:
        speaker = win32com.client.Dispatch('SAPI.SpVoice')
        voices = speaker.GetVoices()

        check_voices()

        if language.startswith('en-'):
            text = translate_text(text, from_code='es', to_code='en')        

        language_map = {
            'es-ES-female': 'Microsoft Helena Desktop - Spanish (Spain)',
            'es-ES-male': 'Microsoft Pablo Desktop - Spanish (Spain)',
            'en-UK-female': 'Microsoft Hazel Desktop - English (Great Britain)',
            'en-UK-male': 'Microsoft George Desktop - English (Great Britain)',
        }


        voice_name = language_map.get(language)
        for voice in voices:
            if voice.GetDescription() == voice_name:
                speaker.Voice = voice
                break

        speaker.Speak(text)

    except Exception as e:
        print(f"An error occurred: {e}")

    finally:
       pythoncom.CoUninitialize()

已尝试的解决方法

  • 用管理员权限PowerShell安装两款语音
  • 修改Windows注册表
  • 将语音文件从C:\Windows\Speech_OneCore\Engines\TTS\es-ES复制到C:\Windows\Speech\Engines\TTS\es-ES

错误日志

[19/Jul/2024 09:11:22] "GET / HTTP/1.1" 200 1580
[19/Jul/2024 09:11:23,062] - Broken pipe from ('127.0.0.1', 55799)
Not Found: /favicon.ico
[19/Jul/2024 09:11:23,099] - Broken pipe from ('127.0.0.1', 55804)
<QueryDict: {}>
Voice: Microsoft Helena Desktop - Spanish (Spain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ES-ES_HELENA_11.0
Voice: Microsoft Zira Desktop - English (United States), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0
Voice: Microsoft George Desktop - English (Great Britain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN_GB_GEORGE_11.0
Voice: Microsoft Hazel Desktop - English (Great Britain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-GB_HAZEL_11.0
Voice: Microsoft Pablo Desktop - Spanish (Spain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ES-ES_PABLO_11.0
[19/Jul/2024 09:11:31] "POST /submit/ HTTP/1.1" 200 93
An error occurred: (-2147352567, 'Ocurrió una excepción.', (0, None, 'Clase no registrada\r\n', None, 0, -2147221164), None)
<QueryDict: {}>
Voice: Microsoft Helena Desktop - Spanish (Spain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ES-ES_HELENA_11.0
Voice: Microsoft Zira Desktop - English (United States), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-US_ZIRA_11.0
Voice: Microsoft George Desktop - English (Great Britain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN_GB_GEORGE_11.0
Voice: Microsoft Hazel Desktop - English (Great Britain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_EN-GB_HAZEL_11.0
Voice: Microsoft Pablo Desktop - Spanish (Spain), Id: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_ES-ES_PABLO_11.0
An error occurred: (-2147352567, 'Ocurrió una excepción.', (0, None, 'Clase no registrada\r\n', None, 0, -2147221164), None)
[19/Jul/2024 09:11:39] "POST /submit/ HTTP/1.1" 200 93

环境信息

  • Django == 5.0.6
  • Python == 3.10.6
  • Windows系统

解决方案

错误代码-2147221164对应「类未注册」,说明语音引擎的COM组件未正确注册或存在位数兼容性问题,可按以下步骤解决:

1. 检查Python与系统位数匹配

如果是64位Windows,必须安装64位Python。部分TTS语音仅提供64位COM组件,32位Python无法调用。

2. 重新注册语音引擎COM组件

打开管理员权限的命令提示符(CMD),执行以下命令替换对应语音的DLL路径:

# 注册Pablo语音组件
regsvr32 "C:\Windows\Speech_OneCore\Engines\TTS\es-ES\MSTTSVoices-esES-Pablo.dll"
# 注册George语音组件
regsvr32 "C:\Windows\Speech_OneCore\Engines\TTS\en-GB\MSTTSVoices-enGB-George.dll"

注:路径需根据实际文件位置调整,若提示「DllRegisterServer成功」则完成注册。

3. 修复代码中的COM初始化问题

原代码中check_voices和text_to_speech重复初始化/反初始化COM,可能导致组件冲突。修改代码如下:

import win32com.client, pythoncom
from .translator import translate_text

def check_voices(speaker):
    voices = speaker.GetVoices()
    for voice in voices:
        print(f"Voice: {voice.GetDescription()}, Id: {voice.Id}")

def sound_rate(speaker):
    speaker.Rate = -1  # rango -10(lento) - 10(rapido)

def sound_volume(speaker):
    speaker.Volume = 100    # rango 0(bajo) - 100(alto)

def text_to_speech(language, text):
    pythoncom.CoInitialize()
    try:
        speaker = win32com.client.Dispatch('SAPI.SpVoice')
        check_voices(speaker)

        if language.startswith('en-'):
            text = translate_text(text, from_code='es', to_code='en')        

        language_map = {
            'es-ES-female': 'Microsoft Helena Desktop - Spanish (Spain)',
            'es-ES-male': 'Microsoft Pablo Desktop - Spanish (Spain)',
            'en-UK-female': 'Microsoft Hazel Desktop - English (Great Britain)',
            'en-UK-male': 'Microsoft George Desktop - English (Great Britain)',
        }

        voice_name = language_map.get(language)
        if voice_name:
            for voice in speaker.GetVoices():
                if voice.GetDescription() == voice_name:
                    speaker.Voice = voice
                    break
        else:
            print(f"Language {language} not found in map")

        sound_rate(speaker)
        sound_volume(speaker)
        speaker.Speak(text)

    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        pythoncom.CoUninitialize()

4. 验证系统语音可用性

进入Windows设置「时间和语言→语音」,确认Pablo和George已设置为可用语音,并通过系统自带的「语音合成器」测试是否能正常朗读。

5. 优化语音匹配逻辑

使用语言代码过滤语音,避免字符串匹配误差:

language_map = {
    'es-ES-female': {'lang': '0C0A', 'name': 'Microsoft Helena Desktop - Spanish (Spain)'},
    'es-ES-male': {'lang': '0C0A', 'name': 'Microsoft Pablo Desktop - Spanish (Spain)'},
    'en-UK-female': {'lang': '0809', 'name': 'Microsoft Hazel Desktop - English (Great Britain)'},
    'en-UK-male': {'lang': '0809', 'name': 'Microsoft George Desktop - English (Great Britain)'},
}

voice_info = language_map.get(language)
if voice_info:
    voices = speaker.GetVoices(f"Language={voice_info['lang']}")
    for voice in voices:
        if voice.GetDescription() == voice_info['name']:
            speaker.Voice = voice
            break

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:14:57