赛博户子2.0:改了个能跟户子实时通话的App(简易原理介绍)
一句话版本:把开源的实时语音对话框架、一套用他 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 上跑。
二、用到的现成项目
- VoxEMW(电磁波Studio 开源)——整个骨架。它本身是一个「对着浏览器说话、AI 用克隆音色回答」的框架,已经把判停、转写、大模型、TTS 串成了流水线,并用 WebRTC 把声音推回浏览器。我做的事是在它上面换人设、换音色、加脸、加直播间。
- speech-to-speech(Hugging Face)——VoxEMW 底层的语音管线,各环节都是可插拔的「积木」。
- Silero VAD / Smart Turn / Qwen3-ASR / Qwen3-TTS——语音积木本体,全部开源模型。
- aiortc + aiohttp——WebRTC 音频轨和网页服务。
- Fish Audio——云端音色克隆,用的是平台上的户晨风音色;首个音频块 0.3 秒左右,比本地克隆快。
- Electron——最后把网页包成独立的 macOS App(有自己的图标、菜单和麦克风权限),录屏时看不到任何浏览器痕迹。
三、用到的 Skill
- 女娲 Skill(nuwa-skill)——「造人」用的。它定义了人设文件该长什么样:身份卡、核心特质、回答工作流、表达 DNA、诚实边界。户子的人设就是按这个模板蒸馏出来的。
- hu-chenfeng-skill(社区已有的户晨风 skill)——作为起点参考,但后来做了「反向审计」:拿真实文稿逐条核对,把里面的讹传砍掉(比如「城市要有十条地铁」这条在 524 场直播里出现 0 次,删了)。
整个开发过程是 Vibe Coding:我负责说清楚要什么、判断像不像,代码由 AI 写。
四、调用了哪些知识库
- 户晨风数字档案馆(自建资料站)——他的公开言论、经历、争议事件、2026 年近况的整理。人设里的身份卡、「封号之后的状态」、个人经历词条都从这里来。
- 524 场直播文字稿的词频统计——2023 年 3 月到 2025 年 9 月封号前的全部直播,只统计他本人的台词,约 1300 万字。从中提炼出他的口头禅排序(「对不对?」「知道吧?」「我告诉你」……)、名梗(「你才有婚姻」476 次)、以及哪些网红词他本人其实从不说(「苹果人 / 安卓人」是网友总结的,他自己不解释这些概念)。
- 外挂知识库(触发词词条)——一个 Markdown 文件,每条是「触发词 | 触发词 → 他的原话素材」。你的话命中触发词,这条就临时塞给大模型。买房、手机、山姆、封号、俄乌……目前六十多条。好处是人设主文件保持精简,冷门话题按需加载。
其中有一条是最高优先级的「名场面」词条:2024 年 4 月他直播连麦时,有人突然问他某位领导人是不是「独裁者」,他当场惊恐爆发——「疯了吧?!严重违反直播规范!太可怕了!这种问题不要问!下一个!」——喊完直接挂断连线。这段真实反应被原样写进词条,一旦有人在 App 里问同样的问题,他会照着当年的样子演一遍,而不是给一个平淡的「不方便回答」。
五、做了哪些设定
人设层面
- 语音场景特化:首句 10 字内、直接给结论;口语短句靠逗号串;每一两句挂一个反问尾巴;禁止分点列举、禁止书面语;年份写汉字(「九八年」),否则语音引擎会念错。
- 查户口限量:「你哪个城市、多大、什么学历」是他的招牌,但只在大决策题和被抬杠时用,普通问题直接答。
- 情绪标记:让大模型在句首写
[angry][sarcastic][sighing]这类英文标记,语音引擎照着演,字幕里不显示,肖像也跟着换表情(具体链路见第六节)。 - 敏感度分层(花了不少功夫调):
- 硬红线(点名或用代称评价最高领导人、评价体制优劣)→ 复刻他直播里的真实反应(就是上面那条「独裁者」名场面):「严重违反直播规范!下一个!」
- 踩线但没过线的话题(上访、出国、翻墙、被禁言、俄乌)→ 不许用「不能说」打发,要先认下敏感,再用他自己的逻辑正面答(「我不上访也不闹,该纳税纳税,堂堂正正挣钱,这就是我的方式」)。
- 冲塔黑话(「胖虎」「机器猫」这类代称)→ 识别出来,压着声搪塞,且不能顺着动画往下接。
- 连续追问不复读:被接着问只能推进新细节或收住,不能把上一轮的话原样再说。
直播间层面
肖像:这张脸不是照片,是画出来的,前后生成了近 30 张才定稿。
- 为什么是画而不是照片:一开始就决定用油画风。一是这是 AI 扮演,画出来的脸一眼能看出「不是本人在直播」,比做一张以假乱真的照片更坦荡;二是油画的笔触会把 AI 生成皮肤常见的塑料感、细节错误盖过去,看着反而更顺眼;三是后面要把嘴、眉毛、眼睛抠成图层来回替换,画布质感的接缝比照片好藏得多。
- 为什么是 Gemini:试过 GPT 的图像模型和 Gemini 的 Flash 版,最后主力用 Gemini 3 Pro Image。原因是它吃多张参考照的能力最强——喂两张公开照片,它能把脸型、眼距、眉毛粗细、鼻梁、嘴唇厚薄这些身份特征稳定地保下来,换画风也不走样;而且它支持在原图上做局部修改,后面两轮微调全靠这个。
- 为什么会像:提示词里没写「画一个像户晨风的人」,而是把他的五官逐条写死——长椭圆脸、下巴略窄、眼睛小而微垂、直而低的中粗眉、薄嘴唇、寸头顶部微立、细框眼镜——再配参考照,模型只是在「照着描」。
- 三轮迭代:第一轮出十几张油画 / 数字绘画候选选风格;第二轮针对选中的那张做局部修正;第三轮发现眼睛不够像,让模型只重画眼睛、其余不动,出 6 版并排对比后定稿。
- 定稿后再拆成底图 + 6 档嘴型 + 眉毛 / 眼睛图层,浏览器里按响度切嘴、按情绪切眉眼、隔几秒眨一下眼。
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] 可能被拆成 [an 和 gry]。所以字幕层遇到没闭合的 [ 先扣住不显示,等 ] 到了整体剥掉;不像标记的(里面出现中文、数字)就原样放行。
剥掉的同时把标记喂给肖像:angry → 皱眉 + 撇嘴,sarcastic → 单边挑眉 + 眯眼 + 坏笑,sighing → 眉毛下垂 + 叹气嘴型,表情保持约 6 秒再回中性。所以同一个标记,声音、字幕、表情三边各取所需。
至于「哎呀」「我的天哪」「知道吧」这些口头语气词,不走标记——它们就是正文,按词频统计写进人设的表达 DNA 里,大模型当普通文字生成,Fish 照着念,自然就有那个味道。
七、几个数字
- 说完到他开口:最快 1.3 秒,中位约 1.6 秒
- 首个音频块:Fish Audio 0.3–1.1 秒
- 本地占用:语音积木共约 4 GB 模型文件
- 云端成本:日常闲聊一天几毛钱(弹幕走 DeepSeek,比主脑便宜得多)
八、合规说明
代码 MIT 开源;模型各自遵循 Apache-2.0 等协议。音色和肖像素材来自公开内容,这是一个 AI 扮演 项目,所有回答都是模型基于公开言论的推断,不代表本人。