Foundations

基础知识

MiniMind-O 之所以适合学习,是因为它把语言、语音、图像、音色和实时交互都压进了一个足够小的代码对象。先把术语捋顺,后面读源码会轻很多。

Omni 到底是什么

在这个项目里,Omni 指一个模型系统同时处理文本、语音和图像输入,并输出文本和流式语音。它不是把语音识别、语言模型、语音合成三个独立服务简单串起来,而是让语音特征、图像特征和文本 token 进入同一条建模链路。

路线输入处理优点代价
级联系统语音先转文字,再由 LLM 生成文字,最后 TTS 合成语音。工程清晰,组件容易替换。转写会丢掉语气、停顿、音色等信息,延迟也更高。
MiniMind-O语音和图像经 encoder/projector 注入语言隐空间,Talker 从 Thinker 中间表征生成音频 codes。更接近端到端,能学习语义到语音的统一条件。训练数据、序列格式和解码调度更复杂。

语言模型底座

MiniMind-O 继承 MiniMind 的 Transformer 主干。你需要知道四个基础件:

Tokenizer

把文本切成 token id。仓库里的 `model/tokenizer.json` 和 `model/tokenizer_config.json` 决定特殊 token、chat template 和词表。

Transformer Block

由注意力、前馈层、RMSNorm、RoPE 等组成。代码入口在 `model/model_minimind.py`。

Next Token Prediction

Thinker 仍然预测下一个文本 token,训练时只对 assistant 回复区间计算文本 loss。

MoE 变体

`use_moe=1` 会启用稀疏专家结构,发布模型包括 dense 和 MoE 两条线。

语音基础

MiniMind-O 的音频链路由三类概念组成:输入理解、输出编码、实时交互。

SenseVoice-Small

冻结的语音 encoder,把 16 kHz 输入语音变成隐藏特征,再由 `MMAudioProjector` 映射到语言隐空间。

Mimi Codec

冻结的音频编解码器。Talker 不直接生成波形,而是生成 8 层 Mimi codebook 序列,再解码为 24 kHz 音频。

VAD

Voice Activity Detection。仓库用 Silero VAD 判断用户开始/结束说话,并支持生成时打断。

理解 codebook:可以把 Mimi codes 看成音频的离散 token。文本 token 代表词片段,audio code 代表短时间内的声学状态;MiniMind-O 的 Talker 负责预测这些声学 token。

图像基础

视觉侧使用 SigLIP2 作为冻结 encoder。图像统一处理为 256×256,编码成 64 个 patch token 的视觉表征,再由 MMVisionProjector 映射到 Thinker 隐空间。训练数据里 <image> 会被替换成连续的 <|image_pad|> 占位符,模型在这些位置接收真实视觉特征。

输入 token 布局
文本、音频、图像和音色条件在输入序列中的布局示意。

训练术语

术语在项目里的含义代码线索
SFT监督微调。用对话、音频 codes、图像字段把模型调成可交互形态。`trainer/train_sft_omni.py`
T2AText-to-Audio,文本输入,输出文本和语音。`sft_t2a*.parquet`
A2AAudio-to-Audio,语音输入,输出文本和语音。`question_audios` / `answer_audios`
I2T/I2A图像输入,Thinker 生成文本,Talker 可继续渲染语音。image_bytes / <image>
MTPMulti-Token Prediction。Talker 同步预测多层 audio codebook。`TalkerHead` 8 个输出头
Bridge LayerThinker 中间层传给 Talker 的语义条件,默认 `num_hidden_layers // 2 - 1`。`OmniConfig.bridge_layer`