生成长篇小说的朗读语音小说(index-tts)

419 阅读4分钟
  • 前言 上次写了一个关于使用chattts生成长篇小说朗读的代码(juejin.cn/post/751893… 使用了一段时间后,发现有两个问题
  1. 速度慢,我生成整个文章需要的时间太长了,两天都没有整完
  2. 语言有噪音,而且对于朗读来说,太多的语气在里面显得不是那么好,反观index-tts就要好很多
  3. 但不得不说,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位数字排序文本文件
  • 遍历处理每个文本文件:
    1. 检查目标MP3文件是否已存在,避免重复处理
    2. 调用txt_2_wav生成WAV音频
    3. 调用convert_wav_mp3将WAV转换为MP3

4. 关键特性

  1. 增量处理:通过检查文件是否存在实现增量处理,避免重复工作
  2. 中间文件清理:自动删除处理过程中生成的临时文件
  3. 日志记录:详细记录处理过程,便于问题排查
  4. 路径处理:使用Path类进行跨平台路径管理,提高代码可移植性
  5. 错误处理:使用subprocess.run的check=True参数确保命令执行成功

5. 依赖与外部工具

  • 需要ffmpeg工具用于音频处理
  • 依赖indextts库提供TTS功能
  • 需要checkpoints目录下的模型文件和配置文件

6.部分代码是通过ai生成和优化的

7,最终的结果如下www.bilibili.com/video/BV18U…