Reader Companion 是一个 iPhone 优先的 SwiftUI MVP,用来做本地文档朗读、授权音色创建,以及 App 内虚拟人伴读。
- SwiftUI iOS 工程,目标 iOS 18+。
- 首页改为单页舞台:全屏虚拟播讲人 + 带进度条的悬浮播放条。
- 播放条从左到右为:字幕播放详情、停止、大播放键、语速、资源。
资源页合并文档和音色管理,顶部左侧为文档、音色两个标签,右侧加号按当前标签导入文档或创建音色。- 使用系统
fileImporter导入本地文件。 - 支持 TXT、Markdown、RTF、HTML、PDF、图片 OCR、EPUB 文本提取。
- PDF 使用 PDFKit 提取文本,扫描型 PDF 会走 Vision OCR 兜底。
- 图片文字识别使用 Apple Vision OCR。
- 支持通过直接录音、音频文件、视频文件创建授权音色 Profile。
- 视频文件会抽取音轨为 M4A,作为音色参考音频。
- 创建音色前必须勾选声音授权确认。
- 已接入过 sherpa-onnx / Kokoro 本地 TTS 试验链路;当前 GitHub 仓库不上传模型和本地运行库。
- 模型缺失时,App 会自动回退到 iOS 系统
AVSpeechSynthesizer朗读。 - 如果恢复本地 TTS,TTS 生成在后台线程执行,按段生成 WAV,再由
AVAudioPlayer播放。 - 系统朗读降级会优先选择 iOS premium / enhanced 语音,听感比默认语音更好。
- 保存阅读进度、文档列表、音色列表和当前播放会话。
- 已配置后台音频能力。
- App 内有虚拟播讲人舞台,会根据播放状态和朗读回调驱动状态动画。
舞台整页已接入原创男女全身播讲人图片资产,可悬浮切换性别,并叠加实时声波状态。
- 首页是首屏核心:展示全屏原创男女播讲人和悬浮播放条。
- 点击字幕图标进入播放详情:展示当前文档、当前段落、播放控制、进度和当前音色。
- 点击资源图标进入合并资源页:文档和音色用顶部标签切换,右上角加号负责新增。
- 圆角统一使用 12pt continuous,强调色收敛到系统 teal。
测试用 EPUB 小说不上传到公开 GitHub。需要在本机测试时,可以把 EPUB 文件放到:
ReaderCompanion/Resources/
如果要把 EPUB 作为 App 内置样例,需要在 Xcode 中确认它们被加入 Copy Bundle Resources;公开仓库默认不包含这些测试书。
用 Xcode 打开工程:
open /Users/wf/t2s/ReaderCompanion.xcodeproj也可以在命令行构建:
xcodebuild -project ReaderCompanion.xcodeproj \
-scheme ReaderCompanion \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
build CODE_SIGNING_ALLOWED=NO工程曾使用 sherpa-onnx (https://github.com/k2-fsa/sherpa-onnx) 做离线 TTS。由于模型和运行库体积较大,GitHub 仓库只保留代码和放置说明,不上传模型本体。
- 运行库位置:
Frameworks/onnxruntime.xcframework、Frameworks/sherpa-onnx.xcframework。 - 模型位置:
ReaderCompanion/Resources/SherpaModels/。 - 具体文件清单见 Frameworks/README.md 和 ReaderCompanion/Resources/SherpaModels/README.md。
- Swift 层通过官方 C-API wrapper (
SherpaOnnx.swift) 调用。
如果 sherpa-onnx 初始化或生成失败,自动回退到系统 AVSpeechSynthesizer 朗读,保证播放不中断。当前阶段建议优先打磨系统朗读主链路,把本地模型作为后续增强项。
构建结果:
BUILD SUCCEEDED
- 增加 PDF、扫描 PDF、图片 OCR、TXT、EPUB 的样例文件测试。
- 完善锁屏播放信息和远程控制。
- 根据 Claude Design 输出,对 SwiftUI 页面做完整视觉升级。