- 前言 上次写了一个关于使用chattts生成长篇小说朗读的代码(juejin.cn/post/751893… 使用了一段时间后,发现有两个问题
- 速度慢,我生成整个文章需要的时间太长了,两天都没有整完
- 语言有噪音,而且对于朗读来说,太多的语气在里面显得不是那么好,反观index-tts就要好很多
- 但不得不说,index-tts是真的慢,同chatts完全不是一个量级的,是我的配置有问题?
重新查了一下,发现了bibili开源的index-tts,使用infer_fast后,效率有很大的提升,按官方的说明(快速推理:对于“多句长文本”,可实现至少 210 倍以上的速度提升),我试了一下,其实也不是很明显,而且这里的代码没有什么提示,你都搞不清楚系统是死了还是活着的,所以需要自行增加一些进度的日志进去,但确是慢 。。。。
代码如下:
demo.py 文件代码理解
1. 整体功能
该文件是一个文本转语音(TTS)处理脚本,主要功能是将指定目录下的文本文件批量转换为MP3音频文件,包含文本拆分、语音合成、音频格式转换等完整流程。
2. 主要结构与核心函数
2.1 导入模块
from indextts.infer import IndexTTS
import SpiltFile as spilt
from pathlib import Path
import logging as log
import subprocess
- 使用
IndexTTS进行语音合成 SpiltFile用于文本文件拆分Path处理文件路径logging记录程序运行日志subprocess调用外部ffmpeg命令处理音频
2.2 日志配置
log.basicConfig(level=log.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
设置日志级别为INFO,格式化输出包含时间、名称、级别和消息内容。
2.3 核心函数
-
convert_wav_mp3: 音频格式转换函数
- 功能:将多个WAV文件合并为一个文件并转换为MP3格式
- 参数:wav_list(WAV文件列表)、save_file(保存路径)、txt_file(文本文件)、output_file_mp3(输出MP3路径)
- 实现:使用ffmpeg命令进行音频合并和格式转换,处理完成后清理中间文件
-
txt_2_wav: 文本转语音函数
- 功能:读取文本文件内容并调用TTS引擎生成WAV音频
- 参数:voice(语音提示文件)、txt_file(文本文件路径)、output_path(输出WAV路径)
- 实现:使用
with语句安全读取文件,调用tts.infer_fast进行快速语音合成
3. 主程序流程
3.1 初始化配置
voice="7.wav"
project_root = Path(__file__).parent
- 设置语音提示文件为"7.wav"
- 获取当前脚本所在目录作为项目根目录
3.2 文本文件拆分
file = spilt.SpiltFile()
file.Spilt('/Users/timwu/Downloads/天才基本法2.txt')
调用SpiltFile类拆分指定的文本文件(《天才基本法2.txt》)
3.3 处理路径与文件列表
save_file = str(project_root) + "/result/"
txt_list = list((project_root / 'Downloads'/'天才基本法2/').glob("*.txt"))
- 设置结果保存路径为项目根目录下的result文件夹
- 获取拆分后的所有文本文件列表
3.4 文本转语音批量处理
tts = IndexTTS(model_dir="checkpoints",cfg_path="checkpoints/config.yaml")
txt_list = sorted(txt_list, key=lambda x: int(x.stem[0:6]))
for txt_file in txt_list:
# 检查文件是否已处理
output_path= save_file + Path(txt_file).stem + ".wav"
output_file_mp3 = save_file + Path(txt_file).stem + '.mp3'
if Path(output_file_mp3).exists():
log.info('文件已存在,跳过')
continue
# 文本转WAV
txt_2_wav(voice, txt_file, output_path)
# WAV转MP3
wav_list =[output_path]
convert_wav_mp3(wav_list, save_file, txt_file, output_file_mp3)
- 初始化TTS引擎
- 按文件名前6位数字排序文本文件
- 遍历处理每个文本文件:
- 检查目标MP3文件是否已存在,避免重复处理
- 调用txt_2_wav生成WAV音频
- 调用convert_wav_mp3将WAV转换为MP3
4. 关键特性
- 增量处理:通过检查文件是否存在实现增量处理,避免重复工作
- 中间文件清理:自动删除处理过程中生成的临时文件
- 日志记录:详细记录处理过程,便于问题排查
- 路径处理:使用Path类进行跨平台路径管理,提高代码可移植性
- 错误处理:使用subprocess.run的check=True参数确保命令执行成功
5. 依赖与外部工具
- 需要ffmpeg工具用于音频处理
- 依赖indextts库提供TTS功能
- 需要checkpoints目录下的模型文件和配置文件