TextChunk: 最小逻辑单元,包含状态追踪
Chapter: 章节,包含chunk列表
Book: 书籍,包含章节列表和播放状态
PlaybackState: 播放器状态机
TTSConfig: TTS配置
AUDIOBOOK_CONFIG: 默认配置参数
2. ChunkManager (chunk_manager.py)
文本解析(支持章节识别)
智能chunk切分(人声友好)
音频路径管理
缓存hash计算
3. AudioCache (audio_cache.py)
4. TTSScheduler (tts_scheduler.py)
优先级队列(URGENT > HIGH > NORMAL > LOW)
后台工作线程
预合成机制
自动缓存管理
5. AudioPlayer (audio_player.py)
简化播放器(基于mpv)
播放控制(play/stop/pause)
异步播放支持
6. PlaybackController (playback_controller.py)
核心状态机
seek/pause/resume
章节跳转
自动调度TTS和播放
from novel_reader .core .playback_controller import PlaybackController
from novel_reader .core .models import PlaybackState
# 创建播放控制器
controller = PlaybackController ()
# 加载书籍
book = controller .load_book (
book_id = 1 ,
file_path = "path/to/book.txt"
)
# 设置回调
controller .on_state_changed = lambda state : print (f"State: { state } " )
controller .on_chunk_changed = lambda chunk : print (f"Chunk: { chunk .chunk_id } " )
controller .on_chapter_changed = lambda ch : print (f"Chapter: { ch .title } " )
# 开始播放
controller .play ()
# 暂停
controller .pause ()
# 恢复
controller .resume ()
# Seek到指定位置
controller .seek (chunk_index = 100 )
# 下一章
controller .next_chapter ()
# 上一章
controller .prev_chapter ()
优先级队列确保当前chunk最高优先级
缓存机制避免重复TTS
预合成减少等待
章节内seek(不跨章)
缓存命中直接播放
未缓存时立即调度TTS
80个chunk缓存(可配置)
LRU淘汰策略
磁盘持久化
AUDIOBOOK_CONFIG = {
"text_chunk_size" : 100 , # 每个chunk约100字
"tts_batch_chunks" : 3 , # 每批TTS处理3个chunk
"prefetch_chunks" : 2 , # 预取2个chunk
"audio_cache_size" : 80 , # 缓存80个chunk
"max_tts_queue" : 5 , # TTS队列最多5个任务
"first_chunk_timeout" : 3000 , # 首个chunk超时3秒
"auto_play_next_chapter" : True ,# 自动播放下一章
}
Main Thread (UI)
↓
PlaybackController (logic)
↓
├─→ TTS Worker Thread (synthesis)
└─→ Audio Player Thread (playback)
文本文件 → ChunkManager → TextChunk[]
↓
TTSScheduler
↓
AudioCache ← Piper
↓
AudioPlayer → 扬声器
UI 不碰 TTS
TTS 不碰播放
全部通过 PlaybackController 协调
明确的状态机
每个chunk状态追踪
播放进度精确管理