| Crates.io | novel-tts |
| lib.rs | novel-tts |
| version | 0.1.6 |
| created_at | 2025-10-19 06:31:44.529036+00 |
| updated_at | 2025-11-13 10:19:49.90125+00 |
| description | Terminal reader for novel |
| homepage | |
| repository | https://github.com/yexiyue/parse-book-source |
| max_upload_size | |
| id | 1890092 |
| size | 147,534 |
novel-tts 是一个专门为小说阅读设计的文本转语音(TTS)库。它基于 kokoro-tts 引擎,提供了针对长文本(如小说章节)优化的流式处理功能。
在你的 Cargo.toml 中添加:
[dependencies]
novel-tts = { path = "crates/novel-tts" }
注意:请根据实际发布情况调整依赖配置。
use novel_tts::{NovelTTS, CheckpointModel, VoicesData, ChapterTTS};
use kokoro_tts::Voice;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 初始化模型和语音数据
let mut model = CheckpointModel::default();
let mut voices = VoicesData::default();
// 检查并下载必要的模型文件
if !model.is_downloaded() {
model.async_download(|downloaded, total| {
println!("模型下载进度: {}/{}", downloaded, total);
}).await?;
}
if !voices.is_downloaded() {
voices.async_download(|downloaded, total| {
println!("语音数据下载进度: {}/{}", downloaded, total);
}).await?;
}
// 创建TTS实例
let novel_tts = NovelTTS::new(&model, &voices).await?;
let mut chapter_tts = novel_tts.chapter_tts();
// 准备要转换的文本
let text = "这是小说的第一段落。\n这是第二段落。".to_string();
// 流式处理文本到音频
let (audio_queue, mut position_rx) = chapter_tts.stream(
text,
Voice::Zf006(1),
|error| eprintln!("TTS处理错误: {:?}", error)
)?;
// 监听字符位置更新
tokio::spawn(async move {
while let Some((start, end)) = position_rx.recv().await {
println!("正在朗读字符位置: {} 到 {}", start, end);
}
});
// 播放音频(需要rodio或其他音频播放库配合使用)
// let stream_handle = rodio::OutputStreamBuilder::open_default_stream()?;
// let sink = rodio::Sink::connect_new(stream_handle.mixer());
// sink.append(audio_queue);
// sink.sleep_until_end();
Ok(())
}
MIT
欢迎提交Issue和Pull Request来帮助改善这个库。