Rust 编写的 Bilibili 直播弹幕采集与分析系统,使用 SQLite + FTS5 存储与检索,后端接口基于 Axum,前端界面基于 React。
crates/core/:数据模型、SQLite、分析逻辑crates/live/:Bilibili 直播 websocket 采集apps/cli/:录制与命令行查询apps/server/:Axum HTTP 接口frontend/:React 控制台
这样 bili_server 不会链接直播采集依赖,bili_cli 也不会链接 Axum,编译后的二进制更小。
- 持续录制
DANMU_MSG - FTS5 + LIKE 回退的模糊搜索
- 按时间范围查看弹幕
- 用户最关注问题 Top 排行
- 基于规则词典的情绪分析
tokenizers分词 +ort跑中文 ONNX embeddingndarray存储向量并做 mean poolinglinfa-clusteringKMeans 聚类- 基于规则的情绪与问题标签
- 按时间桶聚合的弹幕时间轴
录制弹幕:
cargo run -p bili_cli -- record --room-id 30263297 --db danmaku.db --print命令行搜索:
cargo run -p bili_cli -- search "普洱" --db danmaku.db --room-id 30263297 --limit 20启动 API 服务:
cargo run -p bili_server -- --db danmaku.db --addr 127.0.0.1:3000 --model-dir models --tag-config tag-config.json命令行跑 embedding 聚类:
cargo run -p bili_cli -- cluster \
--db danmaku.db \
--room-id 30263297 \
--tokenizer /path/to/tokenizer.json \
--model /path/to/model.onnx \
--k 8 \
--limit 500GET /api/messagesGET /api/messages/timelineGET /api/analysis/overviewGET /api/analysis/questions/topGET /api/analysis/sentimentGET /api/analysis/clustersGET /api/modelsPOST /api/models/downloadGET /api/config/tagsPUT /api/config/tags
常用参数:
room_idqueryexclude_keywords:逗号分隔,例如复读,抽奖,送钛杯start_tsend_tslimitbucket_secs
聚类接口额外参数:
tokenizer_pathmodel_pathkmax_lensamples
模型下载接口请求体:
{
"repo_id": "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
"revision": "main",
"model_file": "onnx/model.onnx",
"tokenizer_file": "tokenizer.json"
}标签配置接口返回/保存的是完整 JSON,服务启动时如果 tag-config.json 不存在会自动生成默认配置。
cd frontend
npm install
npm run dev前端开发服务器默认在 5173,并代理 /api 到 127.0.0.1:3000。
- embedding 聚类依赖本地可访问的
tokenizer.json与中文 embedding ONNX 模型 - 前端模型分析页支持从 Hugging Face 下载模型到本地
model-dir,并从本地列表中直接选择 - 前端提供“标签配置”页面,可直接编辑
tag-config.json对应的规则 JSON - 私有仓库可通过
HF_TOKEN或HUGGINGFACE_TOKEN环境变量透传认证 ort采用动态加载模式,运行时需要可用的 ONNX Runtime 动态库sent_at统一按毫秒时间戳处理- 首次构建需要本机能够下载 Rust / npm 依赖