chun_qiu f3a71e908e feat: user-customizable event voice rules (gift/blind box/enter/follow/like/guard/super chat)
- New event_rules.py: load/save event_rules.json, robust template renderer
  (missing vars -> empty, empty template -> muted), guard level mapping
- danmaku_handler.py: custom SEND_GIFT callback to extract blind_gift_name;
  implements all event callbacks feeding the TTS queue per user rules
- server.py: GET/POST /api/rules, load rules at startup, pass to client
- Web UI: 'Event Voice Rules' panel (per-event toggle + template + save)
- main.py CLI loads rules; build.py bundles event_rules.json
- skip_free_gift option to mute silver free gifts
- Rebuild portable zip (83.8 MB)
2026-08-08 16:17:28 +08:00

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:源码运行

# 安装依赖
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_num} {gift_price} {gift_coin_type}
blind_box 盲盒礼物 {viewer_name} {gift_name} {gift_num} {blind_box_gift}
enter_room 进房 {viewer_name} {user_uid}
follow 关注 {viewer_name} {user_uid}
like 点赞 {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}

示例模板:

{
  "templates": {
    "gift": "感谢由{viewer_name}投喂的{gift_name}",
    "blind_box": "感谢由{viewer_name}投喂的{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 前端 (参考)

构建便携包

python build.py
# 输出: dist/bililive-touhou-tts-portable.zip

许可

MIT License

               .                                                                                 
            -==- +                                                                                
           ::.    %*%#*:                                                                            
          --.. #***:*+********-.       .-+*#%%%%%%%##*+-:                          ..::-- -.        
          .*---%#=.=*+*+*+******+#@%%#%%%#%%%#%#%#%%%%#%#%%#%@%-     .:-+###**+***+:+**:.-#+=       
        ::+.-+++#+####****+**%#%%#%%#%%#%%#%#%%#%%#%#%%%%#%%#%#%%@@%#+**+****+**+**=-+#*::-+:       
         *-.   #+.=+*+***%%%%%%#%%#%%#%#%#%#%#%%#%%#%#%#%#%#%%#%#%%%@@%%##*+***+**++*:=**#-.-+.     
         *###**::*%%%#%#%#%#%#%%#%%#%%#%%#%%%#%#%#%%#%#%#%%#%#%%#%#%@@@@@%#*+*+**+**=-::-*#.  =     
        +-#=%##%#%#%#%#%%%#%#%#%#%#%#%%#%%#%#%%%#%#%%%%#%%#%%%#%%#%#%#%@@@@@#########=+*+*+=:+.     
       +---:%#%%%#%%#%%#%#%%%#%%#%%#%#%%#%#%%#%#%%%#%#%%#%%#%#%#%%#%#%%#%@%@@@######*++##--==       
        =-##%%#%#%#%%#%%#%#%#%#%%#%%%#%#%%#%#%#%#%#%#%#%#%#%#%%%#%%%%#%#%#%@%@@%##**+++%#==-        
        .%%%#%#%%%#%%#%#%%%#%%%%#%#%#%%#%#%%%#%%%#%%%#%%#%%#%#%#%@##%%#%%%%%%@%#+%##*+#:  :-:+      
       :==#%#%%#%%%%#%%#%#%%#%@#%%%%%#%%#%%%%%#%#%#%#%#%%#%%%%%%%%@%%#%%##+-=-=-=-%#*++##**=:+      
      ===--=--+%%%#%@%#%%#%%@@%%%#%@%%%%%#%@%#%#%%%#%@%%#%#%#%@%#%@**=--=--=+#%@@@%*+#%%=-%*        
     :%#%#@%%%%==-----+*%%@@%@#%%%@%%@@#%%#@@%%%#%@%%#@%%%#*+-----=##@%#%@@@%%@%@%@%%%*-+:%@:       
     %%#%@%%@@#%@@%%@%@%%@%@@%%%#%@@%@%%#%#@@@%%%%%@%@%@@%%%%@%@@@@%@@@%%%@@@%@@@@@%-+%##%@%*       
    *%#%@@%@@#@@%@%@@@@%%@@@@%%%%@@@@#==%@%@%@@%%#%%@@@@@%%%%%%%@%@@@%@%%#%@@@@%@%@@#######%@.      
   .%%%%@%@@%%@%@%%@%@%@@@%@%#@@%@%@#=-:*%@%@@%#%+%%%@%@%@%@@#%@@@%@@@@@%%%%%@@@@@%@####*+*+*%.     
   =%#@@@@@%%@@@%@@@@+@@%@#-#%+@@@@#-=:..*@@@%@=%*=+%@@@@@@%@%%%@@@%@@%@@%%#%@%@%@@@###*+*####%*-*  
   *%#@%@%@%@%@%@%@%-#%@%*+=##-@%@#==:....+@@@%-#*.:=@%@@=-%@@=*@%@@@%@@@@@%%%@@@@%@%##**+*--:++*-  
   ##@@@%%#@@@@%@@*==*@====-%--+@*-=:... ..-%@*=.#%-=*#%%+=-+@*-=%@%@@@%@@%@@%%@%@@@%*+**#+-*%*+.   
   *%@%@- @%@%@@@+==#+ =####%-....=-.........+-:.# :######%=*+%.-+@@@%@@@@@@%@@@@@%@%*####+=%%.     
   =%%%. .@@@-#@=-=*:####*##%... ..... ... ......%####*##*%..*::.:@%@@*%%#%@@@%@%@@@#-:==+@@@@.     
   :%#   -@--%%%--:- %******#........... .... ...*********+  +..+ *.=.-++-%@@@@@@@%@@%@%#%@@%@:     
    :    :-#-==#:::-.=%#%%%%*.. ... .. .......... #######+ .:.:..=*=+#+#%==*%@%@%@@@@%@@@@@@@@:     
           #***%-:---+.-................... .. .......---=+--=:-:-**+###%=*=*@@@@@%@@@@%@%@%@@:     
          .#***%.:...:.......... .. .... ................:.:.:.:.-****###=-==%@%@@@%@%@@@@@@%@.     
          .#*+##...:...:............. ...... .. .................-*+*####=-=-@@@%@@@@@@%@%@@@%.     
           #***#............. .-... .........* ... ..............:**+###*=-=*%@@@%@@%@@@@@@@%%      
          .#+**%.................#@**+========-..................:****##*=-+%@%@@@%@@@%@%@%@@%      
         :=+=*##:......... ... ...*++========*..... .............:+-+*+#*=#@@@@@%@@@%@@@@@@*%*      
          #.=*--*...... .... .... .:#====-==-#.. ..... .........=-*=#*#%+%@%@%@@@@%@@@@%@%@-@=      
           -+ %@%-.. .................*+===*=....... .... .. ...=.+=-+#+=@%%@@%@@%@@@%@@@@*:%:      
           :%%@%@@-..... .. ... ... ......... .. .................@%+@@@@%#%@%@#%@@@%=%@%@-:#       
           :%%@@@%%#.. .......... ....... ........ ... .. ... . ==%#@%@%%%%%@@%-@@%@#:@@@% :*       
           :%%%@%.%%@#:... .. ......... .... .. .... .........+- -%%%@@@%#%@%@:-@#-@+ %@%= =.       
           :%%@@: %%-%@@*:..... ... ................... .. :+.   =#@@%=#*%%@@- =@:.@: #@#           
           :%@@-  %#.-@@@@#%*:....... .. .. .... .. ...:=+.      #%@% -+-#@%=  *- .#. *%.           
           +%@:   #:  @%@- *-  .=*+=-.... ... ...-++=.          .%@#  . .%@=   :   =  *.            
           *@:    +   %#                                        =@-      %:                         
           #.                                                  .*                                   

S
Description
No description provided
Readme
1 MiB
v1.1.0
Latest
2026-08-08 16:23:48 +08:00
Languages
JavaScript 97.7%
Python 1.7%
HTML 0.6%