智能语音处理+1.3用SpeechLib实现文本转语音(100%教会)
欢迎来到智能语音处理系列的第三篇文章(用SpeechLib实现文本转语音)
这是前两篇文章的地址:
第一篇:智能语音处理+1.1下载需要的库(100%实现)-CSDN博客
第二篇:智能语音识别+1.2用SAPI实现文本转语音(100%教会)-CSDN博客
不好意思啊,各位读者,没把握好力度,原本预设的3篇文章,预计会多出两章.
请大家见谅,
一.简单介绍使用的库
comtypes
是另一个 Python 库,用于操作 Windows COM 对象,与 pywin32
类似,但实现方式不同。
SpeechLib
是 comtypes
自动生成的类型库(Type Library)用于访问 Windows 语音接口(如语音合成或识别)
pip install comtypes
二.介绍导入的方法
CreateObject
的作用
-
- 创建 COM 对象实例:类似
win32com
的Dispatch
,但comtypes
更强调静态类型绑定(需预先生成类型库)。
- 创建 COM 对象实例:类似
# CreateObject创建语音合成对象
from comtypes.client import CreateObject
# 创建语音合成引擎
voice = CreateObject("SAPI.SpVoice")
voice.Speak("Hello, world!") # 朗读文本
这代码,我没试过,你们可以试着运行一下.(这里只是想介绍作用而已,并非为了实现效果)
SpeechLib
的作用
- 预生成的类型库:
comtypes
需要先通过GetModule
生成 COM 组件的 Python 接口定义,才能使用具体接口(如ISpVoice
)。
from comtypes.client import GetModule
# 生成 SpeechLib 类型库(通常只需一次)
GetModule("SpeechLib.dll") # 生成后可从 comtypes.gen 导入
这代码,我也没试过,你们可以试着运行一下.(这里只是想介绍作用而已,并非为了实现效果)
三.comtypes和win32对比
特性 | comtypes | win32com (pywin32) |
---|---|---|
类型绑定 | 静态类型(需生成类型库) | 动态调度(无需预生成) |
性能 | 更高(类型已知) | 较低(动态解析) |
接口支持 | 适合复杂接口(如自定义 COM 组件) | 适合简单自动化(如 Office) |
代码复杂度 | 较复杂(需生成类型库) | 较简单 |
四.正式的来实现效果(使用SpeechLib技术)
首先导入方法和库,并实例化engine类(调用语音转文本你的技术)和stream类(调用语音文件流的技术)
# 导入能调用复杂接口的方法CreateObject
from comtypes.client import CreateObject
# SpeechLib(此方法通过接口定义,才能使用具体的接口功能)
from comtypes.gen import SpeechLib
engine = CreateObject("SAPI.SpVoice")
stream = CreateObject('SAPI.SpFileStream')
五.完整程序及代码注释
圆满结束,呜呼~
# 导入必要的 COM 类型库和生成接口
from comtypes.client import CreateObject
from comtypes.gen import SpeechLib # 使用预生成的 SpeechLib 类型库# ----------------------------- 初始化 COM 对象 -----------------------------
# 创建语音合成引擎实例(使用 Windows 自带的 SAPI.SpVoice 接口)
engine = CreateObject("SAPI.SpVoice")
# 创建音频流对象(用于将语音输出到文件,接口为 SAPI.SpFileStream)
stream = CreateObject("SAPI.SpFileStream")# ----------------------------- 文件路径配置 -----------------------------
# 指定要读取的文本文件路径(需要确保文件存在)
infile = 'demo.txt'
# 指定要输出的音频文件路径(格式通常为 .wav)
outfile = 'demo_audio.wav'# ----------------------------- 配置音频输出流 -----------------------------
# 打开音频文件流,模式为写入(SpeechLib.SSFMCreateForWrite 表示创建新文件)
# SSFMCreateForWrite 是 SpeechLib 中定义的常量,值为 0x3(创建并写入)
stream.Open(outfile, SpeechLib.SSFMCreateForWrite)
# 将语音引擎的音频输出重定向到文件流(而不是默认的扬声器)
engine.AudioOutputStream = stream# ----------------------------- 读取文本并合成语音 -----------------------------
# 打开文本文件并读取内容(假设文件编码为 utf-8)
with open(infile, 'r', encoding='utf-8') as f:text = f.read()# 调用语音引擎合成语音并输出到文件流
# Speak 方法的第二个参数指定标志位(SpeechLib.SPFDFactory 表示默认行为)
engine.Speak(text, SpeechLib.SPFD_Default) # SPFD_Default = 0# ----------------------------- 清理资源 -----------------------------
# 关闭文件流(确保数据写入磁盘)
stream.Close()
# 释放 COM 对象(避免内存泄漏)
del engine
del stream