# bililive-touhou-tts Bilibili 直播弹幕 + ゆっくり TTS 语音朗读器。 自动连接指定 Bilibili 直播间,将弹幕实时转换为日语片假名,通过 **AquesTalk** 引擎以ゆっくり语音朗读出来。 ## 功能 - 实时接收 Bilibili 直播弹幕 - 中文 → 拼音 → 片假名自动转换 - 英文转片假名(english-to-kana 49K 词库 + 字母拼读兜底) - 可选扫码登录(获取未打码用户名) - Web 控制面板(暗色主题) - 支持 8 种ゆっくり音色 + 语速/音量调节 - 即开即用,无需安装任何运行时 ## 快速开始 ### 方式 1:便携版(推荐) 解压 `bililive-touhou-tts-portable.zip`,双击 `start.bat`,浏览器自动打开控制面板。 无需安装 Python 或 Node.js。 ### 方式 2:源码运行 ```bash # 安装依赖 pip install -r requirements.txt cd aquestalk.js && npm install && npx tsc && cd .. npm install # 启动服务 python server.py # 打开浏览器 # http://127.0.0.1:8080 ``` ## 使用说明 1. 浏览器打开 `http://127.0.0.1:8080` 2. (可选)点击「Login with QR」用 Bilibili 客户端扫码登录 3. 输入直播间房间号 4. 选择音色、语速、音量 5. 点击「Start」 弹幕会实时显示在日志区域,同时通过扬声器朗读。 ## 命令行参数 ``` python server.py [--port PORT] [--host HOST] [--debug] python main.py --room-id ROOM_ID [--voice VOICE] [--speed SPEED] ``` ### server.py 参数 | 参数 | 默认值 | 说明 | |------|--------|------| | `--port` / `-p` | `8080` | HTTP 服务端口 | | `--host` | `127.0.0.1` | 绑定地址 | | `--debug` / `-d` | 关闭 | 调试日志 | ### main.py 参数(纯 CLI 模式) | 参数 | 默认值 | 说明 | |------|--------|------| | `--room-id` / `-r` | 必填 | Bilibili 直播房间号 | | `--voice` / `-v` | `f1` | 音色 | | `--speed` / `-s` | `100` | 语速 (50-300) | | `--sessdata` | 空 | Bilibili cookie | | `--list-devices` | — | 列出音频设备 | ## 语音类型 | 音色 | 说明 | |------|------| | `f1` | 靈夢 (标准ゆっくり女声) | | `f2` | 魔理沙 | | `m1` | 男声1 | | `m2` | 男声2 | | `r1` | 机器人 | | `dvd` | DVD | | `imd1` | imd1 | | `jgr` | jgr | ## 事件语音规则 除弹幕外,礼物、盲盒、进房、上舰、醒目留言等事件也可以自定义语音。规则保存在 `event_rules.json`(首次运行自动生成),可在 Web UI 的 "Event Voice Rules" 面板编辑。 模板为空字符串 = 该事件静音。`enabled` 控制整类事件开关,`skip_free_gift` 跳过银瓜子免费礼物。 ### 事件与变量 | 事件 | 变量 | |------|------| | `danmaku` 弹幕 | `{uname}` `{msg}` | | `gift` 普通礼物 | `{viewer_name}` `{gift_name}` `{gift_count}` `{gift_price}` `{gift_coin_type}` | | `blind_box` 盲盒礼物 | `{viewer_name}` `{gift_name}` `{gift_count}` `{blind_box_gift}` | | `enter_room` 进房 | `{viewer_name}` `{user_uid}` | | `follow` 关注 | `{viewer_name}` `{user_uid}` | | `interact_other` 其他互动 | `{viewer_name}` `{user_uid}` `{interact_type}`(分享/特别关注/互粉) | | `buy_guard` 上舰 | `{ships_viewer_name}` `{ships_level}`(舰长/提督/总督) `{ships_num}` `{ships_price}` | | `guard_toast` 上舰提示 | `{ships_viewer_name}` `{ships_level}` `{guard_days}` `{toast_msg}` | | `super_chat` 醒目留言 | `{viewer_name}` `{super_chat_content}` `{super_chat_price}` `{super_chat_duration}` | 示例模板: ```json { "templates": { "gift": "感谢由{viewer_name}投喂的{gift_count}个{gift_name}", "blind_box": "感谢由{viewer_name}投喂的{gift_count}个{gift_name}爆出了{blind_box_gift}", "enter_room": "欢迎{viewer_name}进入直播间", "buy_guard": "恭喜{ships_viewer_name}成为尊贵的{ships_level}", "super_chat": "{viewer_name}的醒目留言:{super_chat_content}" } } ``` ## 技术架构 ``` Bilibili 弹幕 (blivedm) │ ▼ 中文→片假名 (pypinyin + 映射表) │ ▼ 英文→片假名 (english-to-kana 49K 词库 + phonemize G2P 兜底) │ ▼ AquesTalk TTS (aquestalk.js + v86 WASM 模拟) │ ▼ WAV 音频播放 (sounddevice) ``` ## 子项目 | 目录 | 说明 | |------|------| | `aquestalk.js/` | AquesTalk TTS 引擎 (WebAssembly x86 模拟) | | `blivedm/` | Bilibili 直播弹幕 Python 库 | | `zh-yukuuri/` | 中文→ゆっくり Web 前端 (参考) | ## 构建便携包 ```bash python build.py # 输出: dist/bililive-touhou-tts-portable.zip ``` ## 许可 MIT License ``` . -==- + ::. %*%#*: --.. #***:*+********-. .-+*#%%%%%%%##*+-: ..::-- -. .*---%#=.=*+*+*+******+#@%%#%%%#%%%#%#%#%%%%#%#%%#%@%- .:-+###**+***+:+**:.-#+= ::+.-+++#+####****+**%#%%#%%#%%#%%#%#%%#%%#%#%%%%#%%#%#%%@@%#+**+****+**+**=-+#*::-+: *-. #+.=+*+***%%%%%%#%%#%%#%#%#%#%#%%#%%#%#%#%#%#%%#%#%%%@@%%##*+***+**++*:=**#-.-+. *###**::*%%%#%#%#%#%#%%#%%#%%#%%#%%%#%#%#%%#%#%#%%#%#%%#%#%@@@@@%#*+*+**+**=-::-*#. = +-#=%##%#%#%#%#%%%#%#%#%#%#%#%%#%%#%#%%%#%#%%%%#%%#%%%#%%#%#%#%@@@@@#########=+*+*+=:+. +---:%#%%%#%%#%%#%#%%%#%%#%%#%#%%#%#%%#%#%%%#%#%%#%%#%#%#%%#%#%%#%@%@@@######*++##--== =-##%%#%#%#%%#%%#%#%#%#%%#%%%#%#%%#%#%#%#%#%#%#%#%#%#%%%#%%%%#%#%#%@%@@%##**+++%#==- .%%%#%#%%%#%%#%#%%%#%%%%#%#%#%%#%#%%%#%%%#%%%#%%#%%#%#%#%@##%%#%%%%%%@%#+%##*+#: :-:+ :==#%#%%#%%%%#%%#%#%%#%@#%%%%%#%%#%%%%%#%#%#%#%#%%#%%%%%%%%@%%#%%##+-=-=-=-%#*++##**=:+ ===--=--+%%%#%@%#%%#%%@@%%%#%@%%%%%#%@%#%#%%%#%@%%#%#%#%@%#%@**=--=--=+#%@@@%*+#%%=-%* :%#%#@%%%%==-----+*%%@@%@#%%%@%%@@#%%#@@%%%#%@%%#@%%%#*+-----=##@%#%@@@%%@%@%@%%%*-+:%@: %%#%@%%@@#%@@%%@%@%%@%@@%%%#%@@%@%%#%#@@@%%%%%@%@%@@%%%%@%@@@@%@@@%%%@@@%@@@@@%-+%##%@%* *%#%@@%@@#@@%@%@@@@%%@@@@%%%%@@@@#==%@%@%@@%%#%%@@@@@%%%%%%%@%@@@%@%%#%@@@@%@%@@#######%@. .%%%%@%@@%%@%@%%@%@%@@@%@%#@@%@%@#=-:*%@%@@%#%+%%%@%@%@%@@#%@@@%@@@@@%%%%%@@@@@%@####*+*+*%. =%#@@@@@%%@@@%@@@@+@@%@#-#%+@@@@#-=:..*@@@%@=%*=+%@@@@@@%@%%%@@@%@@%@@%%#%@%@%@@@###*+*####%*-* *%#@%@%@%@%@%@%@%-#%@%*+=##-@%@#==:....+@@@%-#*.:=@%@@=-%@@=*@%@@@%@@@@@%%%@@@@%@%##**+*--:++*- ##@@@%%#@@@@%@@*==*@====-%--+@*-=:... ..-%@*=.#%-=*#%%+=-+@*-=%@%@@@%@@%@@%%@%@@@%*+**#+-*%*+. *%@%@- @%@%@@@+==#+ =####%-....=-.........+-:.# :######%=*+%.-+@@@%@@@@@@%@@@@@%@%*####+=%%. =%%%. .@@@-#@=-=*:####*##%... ..... ... ......%####*##*%..*::.:@%@@*%%#%@@@%@%@@@#-:==+@@@@. :%# -@--%%%--:- %******#........... .... ...*********+ +..+ *.=.-++-%@@@@@@@%@@%@%#%@@%@: : :-#-==#:::-.=%#%%%%*.. ... .. .......... #######+ .:.:..=*=+#+#%==*%@%@%@@@@%@@@@@@@@: #***%-:---+.-................... .. .......---=+--=:-:-**+###%=*=*@@@@@%@@@@%@%@%@@: .#***%.:...:.......... .. .... ................:.:.:.:.-****###=-==%@%@@@%@%@@@@@@%@. .#*+##...:...:............. ...... .. .................-*+*####=-=-@@@%@@@@@@%@%@@@%. #***#............. .-... .........* ... ..............:**+###*=-=*%@@@%@@%@@@@@@@%% .#+**%.................#@**+========-..................:****##*=-+%@%@@@%@@@%@%@%@@% :=+=*##:......... ... ...*++========*..... .............:+-+*+#*=#@@@@@%@@@%@@@@@@*%* #.=*--*...... .... .... .:#====-==-#.. ..... .........=-*=#*#%+%@%@%@@@@%@@@@%@%@-@= -+ %@%-.. .................*+===*=....... .... .. ...=.+=-+#+=@%%@@%@@%@@@%@@@@*:%: :%%@%@@-..... .. ... ... ......... .. .................@%+@@@@%#%@%@#%@@@%=%@%@-:# :%%@@@%%#.. .......... ....... ........ ... .. ... . ==%#@%@%%%%%@@%-@@%@#:@@@% :* :%%%@%.%%@#:... .. ......... .... .. .... .........+- -%%%@@@%#%@%@:-@#-@+ %@%= =. :%%@@: %%-%@@*:..... ... ................... .. :+. =#@@%=#*%%@@- =@:.@: #@# :%@@- %#.-@@@@#%*:....... .. .. .... .. ...:=+. #%@% -+-#@%= *- .#. *%. +%@: #: @%@- *- .=*+=-.... ... ...-++=. .%@# . .%@= : = *. *@: + %# =@- %: #. .* ```