Tu Tech
开源的实时语音对话框架、一套用他500多场直播文稿蒸馏出来的“人设”、一张会动嘴的2D肖像,装进一个独立的桌面app里。
文章信息
发布日期
2026.8.28
账号
TuTu
话题
户晨风开源方案对话机器人对话botbot
摘要
开源的实时语音对话框架、一套用他500多场直播文稿蒸馏出来的“人设”、一张会动嘴的2D肖像,装进一个独立的桌面app里。

赛博户子2.0:改了个能跟户子实时通话的App(简易原理介绍)

2026.8.28 · TuTu

一句话版本:把开源的实时语音对话框架、一套用他 500 多场直播文稿蒸馏出来的「人设」、一张会动嘴的 2D 肖像,装进一个独立的桌面 App 里。你说话,≈1.5 秒后他用自己的声音、自己的口吻回你,手机屏幕上还有 AI 观众在刷弹幕。

资料与素材来源

资料 是什么 链接
户晨风直播文字稿 2023–2025 年 524 场直播的完整文字稿(Olcmyk 整理) github.com/Olcmyk/HuChenFeng
户晨风数字档案馆 我自建的资料站:公开言论、经历、争议事件、近况 huchenfeng-memorial.vercel.app
户晨风音色 Fish Audio 上的克隆音色 fish.audio · 户晨风

本视频用到的第三方项目(一览)

项目 干什么 链接
VoxEMW 实时语音对话框架(本项目骨架) github.com/emwstudio/VoxEMW
speech-to-speech Hugging Face 语音管线 github.com/huggingface/speech-to-speech
Silero VAD 语音活动检测 github.com/snakers4/silero-vad
Smart Turn 语义判停 github.com/pipecat-ai/smart-turn
Qwen3-ASR 语音转文字 github.com/QwenLM/Qwen3-ASR
Qwen3-TTS 本地音色克隆(备用) github.com/QwenLM/Qwen3-TTS
Fish Audio 云端音色克隆 fish.audio
aiortc WebRTC github.com/aiortc/aiortc
aiohttp 网页服务 github.com/aio-libs/aiohttp
Electron 桌面 App 壳 electronjs.org
DeepSeek 弹幕生成用的大模型 deepseek.com
Gemini 3 Pro Image 肖像生成(多参考图保脸型) ai.google.dev
女娲 Skill(nuwa-skill) 人设蒸馏模板 github.com/alchaincyf/nuwa-skill
hu-chenfeng-skill 社区已有的户晨风 skill github.com/Janlaywss/hu-chenfeng-skill

一、它是怎么工作的(五步)

你说话 → ① 判停 → ② 转文字 → ③ 大模型用「户子人设」想回答 → ④ 克隆音色念出来 → ⑤ 肖像对口型
步骤 干什么 用的是什么
① 判停 判断你什么时候说完了,停顿不抢答 Silero VAD+Smart Turn(语义复核)
② 转文字 语音转文字,内置「户晨风 / 山姆 / 安卓」这类热词,不会写错 Qwen3-ASR(本地跑)
③ 大脑 读人设 + 命中的知识库词条,生成回复 云端大模型(OpenAI 兼容接口)
④ 声音 用他本人的音色合成,句首带情绪标记(生气 / 讥讽 / 叹气……) Fish Audio户晨风音色,也可切本地Qwen3-TTS
⑤ 脸 根据播放响度张嘴、根据情绪标记换眉眼 自绘 2D 分层肖像 + 浏览器 Canvas,零 GPU

全程只有「大脑」在云端,其余都在一台 Apple Silicon 的 Mac 上跑。

二、用到的现成项目

三、用到的 Skill

整个开发过程是 Vibe Coding:我负责说清楚要什么、判断像不像,代码由 AI 写。

四、调用了哪些知识库

  1. 户晨风数字档案馆(自建资料站)——他的公开言论、经历、争议事件、2026 年近况的整理。人设里的身份卡、「封号之后的状态」、个人经历词条都从这里来。
  2. 524 场直播文字稿的词频统计——2023 年 3 月到 2025 年 9 月封号前的全部直播,只统计他本人的台词,约 1300 万字。从中提炼出他的口头禅排序(「对不对?」「知道吧?」「我告诉你」……)、名梗(「你才有婚姻」476 次)、以及哪些网红词他本人其实从不说(「苹果人 / 安卓人」是网友总结的,他自己不解释这些概念)。
  3. 外挂知识库(触发词词条)——一个 Markdown 文件,每条是「触发词 | 触发词 → 他的原话素材」。你的话命中触发词,这条就临时塞给大模型。买房、手机、山姆、封号、俄乌……目前六十多条。好处是人设主文件保持精简,冷门话题按需加载。

其中有一条是最高优先级的「名场面」词条:2024 年 4 月他直播连麦时,有人突然问他某位领导人是不是「独裁者」,他当场惊恐爆发——「疯了吧?!严重违反直播规范!太可怕了!这种问题不要问!下一个!」——喊完直接挂断连线。这段真实反应被原样写进词条,一旦有人在 App 里问同样的问题,他会照着当年的样子演一遍,而不是给一个平淡的「不方便回答」。

五、做了哪些设定

人设层面

直播间层面

肖像:这张脸不是照片,是画出来的,前后生成了近 30 张才定稿。

AI 观众弹幕:手机屏上滚的弹幕不是真观众,是另一个模型演的。规则是:开场只有系统欢迎语,没发生过对话就没有弹幕;每轮他播完(不是生成完,否则他还在说、弹幕已经在评价,出戏)2–5 秒后,模型一次生成 10 条围绕刚才话题的评论,并给这轮对话打一个 1–5 的「热度分」——平淡寒暄少冒几条,争议大、好笑的多冒几条;冒不完的当余量,之后每隔 10–25 秒零星冒一条,最多 3 条,没有新对话就安静下来。昵称由模型起,要求像真人网名、最好沾户子的梗(「山姆会员卡欠费」「安卓机有回音」这种)。

弹幕这一路用的是 DeepSeek(deepseek-v4-flash,关掉思考模式),和主脑不是同一个模型,原因有两个:一是弹幕内容不需要躲审查——全是普通观众的家常评论,不会碰任何敏感话题,所以主脑那边为了能正面聊踩线话题而选海外模型的顾虑,在这里不存在;二是它便宜,弹幕每轮都要生成十条,一天下来调用次数比主脑多得多,这笔账算下来 DeepSeek 划算。速度上实测首字 0.7 秒左右,够用但不是选它的理由——弹幕本来就故意延迟 2–5 秒才出现,快慢无所谓。

礼物彩蛋:点 🎁 会打断当前回复,播一段 25 秒的「苹果祝福」——「哎呀呀呀!感谢我兔兔总!太性情了,太通透了!……祝兔兔总手机越换越新,出门特斯拉,购物去山姆」。这段不是实时生成的:感谢词是事先用 Fish Audio 合成好的,配乐直接取自他的视频「游京(悠悠的户晨风)」——那是他的标志性配乐,一响观众就知道是他——两轨混音、软限幅、结尾淡出,做成一个音频文件;口型数据也是提前算好存着的。用户点击就直接播放,零延迟,而且每次都是同一段,保证效果稳定。最早版本用的是他真人视频里的原声,后来换成了 Fish 合成的精简版,好配上游京的音乐、把感谢对象写进去。

回声防线:外放时他自己的声音会被麦克风收回去,服务端会识别并整轮掐掉,否则他会跟自己聊起来。

六、声音里的情绪是怎么来的(Fish Audio 的语气处理)

户子说话的特点一半在措辞,一半在语气:怼人时上头、讲道理时突然平静、被夸时轻笑。光有克隆音色是不够的,得让每一句都「演」对情绪。做法是一条四段的流水线。

1. 大模型负责「标」情绪

人设里给了一张固定的 16 个词的表:[angry] 发火、[sarcastic] 阴阳、[disdainful] 不屑、[confident] 下定论、[excited][surprised][calm] 平静讲道理、[soft tone] 真心话放软、[sighing] 叹气、[chuckling] 轻笑、[laughing][in a hurry tone] 催促、[emphasis] 强调、[whispering] 说暗语、[happy][sad]

规则是:只在情绪明显时标,写在句首,一轮通常 1–2 个,标记一直生效到下一个标记;可以叠两个([sighing][soft tone] 说实话,我心都是很心酸。);不许自己发明词,不许写中文。

2. Fish Audio 负责「演」

Fish Audio 的 s2 系列模型原生支持这种写在文本里的英文情绪提示,所以标记不用单独传参数,带着标记的原文直接送过去就行。上线前把这 16 种情绪各合成了一段样本做 A/B 对比,把听起来不像他的去掉、像的留下,才定下这张表。

还有两个小设置:延迟档选 low(首个音频块 0.36 秒,balanced 要 1.5 秒);Fish 出来的音量偏轻,加了 +8 dB 增益带软限幅,再在每句开头加 8 毫秒淡入,磨掉起音的毛刺。

3. 括号动作要拦下来

大模型偶尔会写「(笑)」「(拍桌)」这种舞台指示,语音引擎会一本正经地念成「括号笑」。人设里禁了,但没强制力,所以代码里再拦一道:整句级别把括号内容删掉。之所以强调「整句级别」,是因为流式生成时括号会被拆成好几个字块到达,按字块拦永远配不上一对括号——这个坑踩过,最早版本「(乐)」就是被原样念出来的。

4. 前端负责「藏」和「联动」

字幕不能把 [angry] 显示出来,但流式字幕也是一块一块到的,[angry] 可能被拆成 [angry]。所以字幕层遇到没闭合的 [ 先扣住不显示,等 ] 到了整体剥掉;不像标记的(里面出现中文、数字)就原样放行。

剥掉的同时把标记喂给肖像:angry → 皱眉 + 撇嘴,sarcastic → 单边挑眉 + 眯眼 + 坏笑,sighing → 眉毛下垂 + 叹气嘴型,表情保持约 6 秒再回中性。所以同一个标记,声音、字幕、表情三边各取所需。

至于「哎呀」「我的天哪」「知道吧」这些口头语气词,不走标记——它们就是正文,按词频统计写进人设的表达 DNA 里,大模型当普通文字生成,Fish 照着念,自然就有那个味道。

七、几个数字

八、合规说明

代码 MIT 开源;模型各自遵循 Apache-2.0 等协议。音色和肖像素材来自公开内容,这是一个 AI 扮演 项目,所有回答都是模型基于公开言论的推断,不代表本人。