alt.freeweights.minicpm / MiniCPM-o-2_6
From: openbmb <huggingface.co/openbmb>Newsgroups: alt.freeweights.minicpmSubject:

MiniCPM-o-2_6

Date: 2026-11-14Commit: cf0b69aSigned: 2DC28CC7B26A283B ✓

Any to any model with 8.7B parameters. Safetensors weights, 17.4 GB in all. Published by openbmb under Apache-2.0.

8.7B params17.4GBMiniCPM-o-2_6safetensorspermissive
FactsParams8.7BSize17.4 GBFormatssafetensorsTaskany to anyLicenseApache-2.0From sourcepermissive
$ fw get openbmb/MiniCPM-o-2_6
# manifest sha256 3e7d5211af2f… · 17.4 GB · 40 files
$ fw verify ./MiniCPM-o-2_6 openbmb/MiniCPM-o-2_6
From sourceHosted (signed)openbmb/MiniCPM-o-2_6Last check: 2026-11-14 21:25 UTC

Get help: custom fine-tune or private deploy. We review your setup before we quote.

Works with

Runs with

Ranked by fit to this model (safetensors), then by GitHub stars.

Overview

Size
17.4 GB
Weights
17.4 GB (safetensors)
Parameters
8.7B
Formats
safetensors
Task
any to any
License
Apache-2.0 (permissive)
Files
40, each with a sha256
Publisher
openbmb
Added
2026-11-14
Section
alt.freeweights.minicpm
Lineage

Original release from the publisher.

Where these bytes come from
Publisher at the pinned commit→You

Sources are tried in order. A file counts only when its size and sha256 match the manifest. Sources are checked when you ask for them, not on a timer.

Sources
BadgeHostLast checkResult
From sourcehuggingface.co2026-11-14 21:25 UTCpassed

Model card

From the publisher at commit cf0b69a. Shown as plain text with links; images open at the publisher.

A GPT-4o Level MLLM for Vision, Speech and Multimodal Live Streaming on Your Phone#

GitHub | MiniCPM Wiki(Chinese) | Online Demo | Technical Blog | Join Us

News#
  • [2025.06.20] ⭐️⭐️⭐️ Our official ollama repository is released. Try our latest models with one click!
  • [2025.03.01] 🚀🚀🚀 RLAIF-V, which is the alignment technique of MiniCPM-o, is accepted by CVPR 2025!The code, dataset, paper are open-sourced!
  • [2025.01.24] 📢📢📢 MiniCPM-o 2.6 technical report is released! See Here.
  • [2025.01.19] ⭐️⭐️⭐️ MiniCPM-o tops GitHub Trending and reaches top-2 on Hugging Face Trending!

MiniCPM-o 2.6#

MiniCPM-o 2.6 is the latest and most capable model in the MiniCPM-o series. The model is built in an end-to-end fashion based on SigLip-400M, Whisper-medium-300M, ChatTTS-200M, and Qwen2.5-7B with a total of 8B parameters. It exhibits a significant performance improvement over MiniCPM-V 2.6, and introduces new features for real-time speech conversation and multimodal live streaming. Notable features of MiniCPM-o 2.6 include:

  • 🔥 Leading Visual Capability. MiniCPM-o 2.6 achieves an average score of 70.2 on OpenCompass, a comprehensive evaluation over 8 popular benchmarks. With only 8B parameters, it surpasses widely used proprietary models like GPT-4o-202405, Gemini 1.5 Pro, and Claude 3.5 Sonnet for single image understanding. It also outperforms GPT-4V and Claude 3.5 Sonnet in mutli-image and video understanding, and shows promising in-context learning capability.
  • 🎙 State-of-the-art Speech Capability. MiniCPM-o 2.6 supports bilingual real-time speech conversation with configurable voices in English and Chinese. It outperforms GPT-4o-realtime on audio understanding tasks such as ASR and STT translation, and shows state-of-the-art performance on speech conversation in both semantic and acoustic evaluations in the open-source community. It also allows for fun features such as emotion/speed/style control, end-to-end voice cloning, role play, etc.
  • 🎬 Strong Multimodal Live Streaming Capability. As a new feature, MiniCPM-o 2.6 can accept continous video and audio streams independent of user queries, and support real-time speech interaction. It outperforms GPT-4o-202408 and Claude 3.5 Sonnet and shows state-of-art performance in open-source community on StreamingBench, a comprehensive benchmark for real-time video understanding, omni-source (video & audio) understanding, and multimodal contextual understanding.
  • 💪 Strong OCR Capability and Others.

Advancing popular visual capabilites from MiniCPM-V series, MiniCPM-o 2.6 can process images with any aspect ratio and up to 1.8 million pixels (e.g., 1344x1344). It achieves state-of-the-art performance on OCRBench for models under 25B, surpassing proprietary models such as GPT-4o-202405. Based on the the latest RLAIF-V and VisCPM techniques, it features trustworthy behaviors, outperforming GPT-4o and Claude 3.5 Sonnet on MMHal-Bench, and supports multilingual capabilities on more than 30 languages.

  • 🚀 Superior Efficiency. In addition to its friendly size, MiniCPM-o 2.6 also shows state-of-the-art token density (i.e., number of pixels encoded into each visual token). It produces only 640 tokens when processing a 1.8M pixel image, which is 75% fewer than most models. This directly improves the inference speed, first-token latency, memory usage, and power consumption. As a result, MiniCPM-o 2.6 can efficiently support multimodal live streaming on end-side devices such as iPad.
  • 💫 Easy Usage.

MiniCPM-o 2.6 can be easily used in various ways: (1) llama.cpp support for efficient CPU inference on local devices, (2) int4 and GGUF format quantized models in 16 sizes, (3) vLLM support for high-throughput and memory-efficient inference, (4) fine-tuning on new domains and tasks with LLaMA-Factory, (5) quick local WebUI demo setup with Gradio, and (6) online web demo on server.

Model Architecture.

  • End-to-end Omni-modal Architecture. Different modality encoder/decoders are connected and trained in an end-to-end fashion to fully exploit rich multimodal knowledge.
  • Omni-modal Live Streaming Mechanism. (1) We change the offline modality encoder/decoders into online ones for streaminig inputs/outputs. (2) We devise a time-division multiplexing (TDM) mechanism for omni-modality streaminig processing in the LLM backbone. It divides parallel omni-modality streams into sequential info within small periodic time slices.
  • Configurable Speech Modeling Design. We devise a multimodal system prompt, including traditional text system prompt, and a new audio system prompt to determine the assistant voice. This enables flexible voice configurations in inference time, and also facilitates end-to-end voice cloning and description-based voice creation.

Image: image

Evaluation#

Image: image

Visual understanding results#

Image Understanding:

| Model | Size | Token Density+ | OpenCompass | OCRBench | MathVista mini | ChartQA | MMVet | MMStar | MME | MMB1.1 test | AI2D | MMMU val | HallusionBench | TextVQA val | DocVQA test | MathVerse mini | MathVision | MMHal Score

| Proprietary

| GPT-4o-20240513 | - | 1088 | 69.9 | 736 | 61.3 | 85.7 | 69.1 | 63.9 | 2328.7 | 82.2 | 84.6 | 69.2 | 55.0 | - | 92.8 | 50.2 | 30.4 | 3.6

| Claude3.5-Sonnet | - | 750 | 67.9 | 788 | 61.6 | 90.8 | 66.0 | 62.2 | 1920.0 | 78.5 | 80.2 | 65.9 | 49.9 | - | 95.2 | - | - | 3.4

| Gemini 1.5 Pro | - | - | 64.4 | 754 | 57.7 | 81.3 | 64.0 | 59.1 | 2110.6 | 73.9 | 79.1 | 60.6 | 45.6 | 73.5 | 86.5 | - | 19.2 | -

| GPT-4o-mini-20240718 | - | 1088 | 64.1 | 785 | 52.4 | - | 66.9 | 54.8 | 2003.4 | 76.0 | 77.8 | 60.0 | 46.1 | - | - | - | - | 3.3

| Open Source

| Cambrian-34B | 34B | 1820 | 58.3 | 591 | 50.3 | 75.6 | 53.2 | 54.2 | 2049.9 | 77.8 | 79.5 | 50.4 | 41.6 | 76.7 | 75.5 | - | - | -

| GLM-4V-9B | 13B | 784 | 59.1 | 776 | 51.1 | - | 58.0 | 54.8 | 2018.8 | 67.9 | 71.2 | 46.9 | 45.0 | - | - | - | - | -

| Pixtral-12B | 12B | 256 | 61.0 | 685 | 56.9 | 81.8 | 58.5 | 54.5 | - | 72.7 | 79.0 | 51.1 | 47.0 | 75.7 | 90.7 | - | - | -

| DeepSeek-VL2-27B (4B) | 27B | 672 | 66.4 | 809 | 63.9 | 86.0 | 60.0 | 61.9 | 2253.0 | 81.2 | 83.8 | 54.0 | 45.3 | 84.2 | 93.3 | - | - | 3.0

| Qwen2-VL-7B | 8B | 784 | 67.1 | 866 | 58.2 | 83.0 | 62.0 | 60.7 | 2326.0 | 81.8 | 83.0 | 54.1 | 50.6 | 84.3 | 94.5 | 31.9 | 16.3 | 3.2

| LLaVA-OneVision-72B | 72B | 182 | 68.1 | 741 | 67.5 | 83.7 | 60.6 | 65.8 | 2261.0 | 85.0 | 85.6 | 56.8 | 49.0 | 80.5 | 91.3 | 39.1 | - | 3.5

| InternVL2.5-8B | 8B | 706 | 68.3 | 822 | 64.4 | 84.8 | 62.8 | 62.8 | 2344.0 | 83.6 | 84.5 | 56.0 | 50.1 | 79.1 | 93.0 | 39.5 | 19.7 | 3.4

| MiniCPM-V 2.6 | 8B | 2822 | 65.2 | 852* | 60.6 | 79.4 | 60.0 | 57.5 | 2348.4* | 78.0 | 82.1 | 49.8* | 48.1* | 80.1 | 90.8 | 25.7 | 18.3 | 3.6

| MiniCPM-o 2.6 | 8B | 2822 | 70.2 | 897* | 71.9* | 86.9* | 67.5 | 64.0 | 2372.0* | 80.5 | 85.8 | 50.4* | 51.9 | 82.0 | 93.5 | 41.4* | 23.1* | 3.8

  • We evaluate this benchmark using chain-of-thought prompting. Specifically, for MME, we used this technique only for the Cognition set.
  • Token Density: number of pixels encoded into each visual token at maximum resolution, i.e., # pixels at maximum resolution / # visual tokens.

Note: For proprietary models, we calculate token density based on the image encoding charging strategy defined in the official API documentation, which provides an upper-bound estimation.

Multi-image and Video Understanding:

click to view

| Model | Size | BLINK val | Mantis Eval | MIRB | Video-MME (wo / w subs)

| Proprietary

| GPT-4o-20240513 | - | 68.0 | - | - | 71.9/77.2

| GPT4V | - | 54.6 | 62.7 | 53.1 | 59.9/63.3

| Open-source

| LLaVA-NeXT-Interleave 14B | 14B | 52.6 | 66.4 | 30.2 | -

| LLaVA-OneVision-72B | 72B | 55.4 | 77.6 | - | 66.2/69.5

| MANTIS 8B | 8B | 49.1 | 59.5 | 34.8 | -

| Qwen2-VL-7B | 8B | 53.2 | 69.6* | 67.6* | 63.3/69.0

| InternVL2.5-8B | 8B | 54.8 | 67.7 | 52.5 | 64.2/66.9

| MiniCPM-V 2.6 | 8B | 53.0 | 69.1 | 53.8 | 60.9/63.6

| MiniCPM-o 2.6 | 8B | 56.7 | 71.9 | 58.6 | 63.9/67.9

  • We evaluate officially released checkpoints by ourselves.
Audio understanding and speech conversation results.#

Audio Understanding:

| Task | Size | ASR (zh) | ASR (en) | AST | Emotion

| Metric | | CER↓ | WER↓ | BLEU↑ | ACC↑

| Dataset | | AISHELL-1 | Fleurs zh | WenetSpeech test-net | LibriSpeech test-clean | GigaSpeech | TED-LIUM | CoVoST en2zh | CoVoST zh2en | MELD emotion

| Proprietary

| GPT-4o-Realtime | - | 7.3* | 5.4* | 28.9* | 2.6* | 12.9* | 4.8* | 37.1* | 15.7* | 33.2*

| Gemini 1.5 Pro | - | 4.5* | 5.9* | 14.3* | 2.9* | 10.6* | 3.0* | 47.3* | 22.6* | 48.4*

| Open-Source

| Qwen2-Audio-7B | 8B | - | 7.5 | - | 1.6 | - | - | 45.2 | 24.4 | 55.3

| Qwen2-Audio-7B-Instruct | 8B | 2.6* | 6.9* | 10.3* | 3.1* | 9.7* | 5.9* | 39.5* | 22.9* | 17.4*

| GLM-4-Voice-Base | 9B | 2.5 | - | - | 2.8 | - | - | - | -

| MiniCPM-o 2.6 | 8B | 1.6 | 4.4 | 6.9 | 1.7 | 8.7 | 3.0 | 48.2 | 27.2 | 52.4

  • We evaluate officially released checkpoints by ourselves.

Speech Generation:

| Task | Size | SpeechQA

| Metric | | ACC↑ | G-Eval (10 point)↑ | Semantic ELO score↑ | Acoustic ELO score↑ | Overall ELO score↑ | UTMOS↑ | ASR-WER↓

| Dataset | | Speech Llama Q. | Speech Web Q. | Speech Trivia QA | Speech AlpacaEval | AudioArena

| Proprietary

| GPT-4o-Realtime | | 71.7 | 51.6 | 69.7 | 7.4 | 1157 | 1203 | 1200 | 4.2 | 2.3

| Open-Source

| GLM-4-Voice | 9B | 50.0 | 32.0 | 36.4 | 5.1 | 999 | 1147 | 1035 | 4.1 | 11.7

| Llama-Omni | 8B | 45.3 | 22.9 | 10.7 | 3.9 | 960 | 878 | 897 | 3.2 | 24.3

| Moshi | 7B | 43.7 | 23.8 | 16.7 | 2.4 | 871 | 808 | 875 | 2.8 | 8.2

| Mini-Omni | 1B | 22.0 | 12.8 | 6.9 | 2.5 | 926 | 803 | 865 | 3.4 | 10.0

| MiniCPM-o 2.6 | 8B | 61.0 | 40.0 | 40.2 | 5.1 | 1088 | 1163 | 1131 | 4.2 | 9.8

All results are from AudioEvals, and the evaluation methods along with further details can be found in UltraEval-Audio.

End-to-end Voice Cloning

| Task | Voice cloning

| Metric | SIMO↑ | SIMO↑

| Dataset | Seed-TTS test-zh | Seed-TTS test-en

| F5-TTS | 76 | 67

| CosyVoice | 75 | 64

| FireRedTTS | 63 | 46

| MiniCPM-o 2.6 | 57 | 47

Multimodal live streaming results.#

Multimodal Live Streaming: results on StreamingBench

| Model | Size | Real-Time Video Understanding | Omni-Source Understanding | Contextual Understanding | Overall

| Proprietary

| Gemini 1.5 Pro | - | 77.4 | 67.8 | 51.1 | 70.3

| GPT-4o-202408 | - | 74.5 | 51.0 | 48.0 | 64.1

| Claude-3.5-Sonnet | - | 74.0 | 41.4 | 37.8 | 59.7

| Open-source

| VILA-1.5 | 8B | 61.5 | 37.5 | 26.7 | 49.5

| LongVA | 7B | 63.1 | 35.9 | 30.2 | 50.7

| LLaVA-Next-Video-34B | 34B | 69.8 | 41.7 | 34.3 | 56.7

| Qwen2-VL-7B | 8B | 71.2 | 40.7 | 33.1 | 57.0

| InternVL2-8B | 8B | 70.1 | 42.7 | 34.1 | 57.0

| VITA-1.5 | 8B | 70.9 | 40.8 | 35.8 | 57.4

| LLaVA-OneVision-7B | 8B | 74.3 | 40.8 | 31.0 | 58.4

| InternLM-XC2.5-OL-7B | 8B | 75.4 | 46.2 | 33.6 | 60.8

| MiniCPM-V 2.6 | 8B | 72.4 | 40.2 | 33.4 | 57.7

| MiniCPM-o 2.6 | 8B | 79.9 | 53.4 | 38.5 | 66.0

Examples#

We deploy MiniCPM-o 2.6 on end devices. The demo video is the raw-speed recording on an iPad Pro and a Web demo.

https://youtu.be/JFJg9KZ_iZk

Image: math Image: diagram Image: bike

Online Demo#

Click here to try the online demo of MiniCPM-o 2.6.

Usage#

Inference using Huggingface transformers on NVIDIA GPUs. Please ensure that transformers==4.44.2 is installed, as other versions may have compatibility issues. We are investigating this issue. Requirements tested on python 3.10:

Pillow==10.1.0
torch==2.3.1
torchaudio==2.3.1
torchvision==0.18.1
transformers==4.44.2
librosa==0.9.0
soundfile==0.12.1
vector-quantize-pytorch==1.18.5
vocos==0.1.0
decord
moviepy
Model initialization#

import torch
from PIL import Image
from transformers import AutoModel, AutoTokenizer

# load omni model default, the default init_vision/init_audio/init_tts is True
# if load vision-only model, please set init_audio=False and init_tts=False
# if load audio-only model, please set init_vision=False
model = AutoModel.from_pretrained(
    'openbmb/MiniCPM-o-2_6',
    trust_remote_code=True,
    attn_implementation='sdpa', # sdpa or flash_attention_2
    torch_dtype=torch.bfloat16,
    init_vision=True,
    init_audio=True,
    init_tts=True
)


model = model.eval().cuda()
tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-o-2_6', trust_remote_code=True)

# In addition to vision-only mode, tts processor and vocos also needs to be initialized
model.init_tts()

If you are using an older version of PyTorch, you might encounter this issue "weight_norm_fwd_first_dim_kernel" not implemented for 'BFloat16', Please convert the TTS to float32 type.

model.tts.float()
Omni mode#

We provide two inference modes: chat and streaming

Chat inference#
import math
import numpy as np
from PIL import Image
from moviepy.editor import VideoFileClip
import tempfile
import librosa
import soundfile as sf

def get_video_chunk_content(video_path, flatten=True):
    video = VideoFileClip(video_path)
    print('video_duration:', video.duration)
    
    with tempfile.NamedTemporaryFile(suffix=".wav", delete=True) as temp_audio_file:
        temp_audio_file_path = temp_audio_file.name
        video.audio.write_audiofile(temp_audio_file_path, codec="pcm_s16le", fps=16000)
        audio_np, sr = librosa.load(temp_audio_file_path, sr=16000, mono=True)
    num_units = math.ceil(video.duration)
    
    # 1 frame + 1s audio chunk
    contents= []
    for i in range(num_units):
        frame = video.get_frame(i+1)
        image = Image.fromarray((frame).astype(np.uint8))
        audio = audio_np[sr*i:sr*(i+1)]
        if flatten:
            contents.extend(["<unit>", image, audio])
        else:
            contents.append(["<unit>", image, audio])
    
    return contents

video_path="assets/Skiing.mp4"
# if use voice clone prompt, please set ref_audio
ref_audio_path = 'assets/demo.wav'
ref_audio, _ = librosa.load(ref_audio_path, sr=16000, mono=True)
sys_msg = model.get_sys_prompt(ref_audio=ref_audio, mode='omni', language='en')
# or use default prompt
# sys_msg = model.get_sys_prompt(mode='omni', language='en')

contents = get_video_chunk_content(video_path)
msg = {"role":"user", "content": contents}
msgs = [sys_msg, msg]

# please set generate_audio=True and output_audio_path to save the tts result
generate_audio = True
output_audio_path = 'output.wav'

res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    temperature=0.5,
    max_new_tokens=4096,
    omni_input=True, # please set omni_input=True when omni inference
    use_tts_template=True,
    generate_audio=generate_audio,
    output_audio_path=output_audio_path,
    max_slice_nums=1,
    use_image_id=False,
    return_dict=True
)
print(res)

## You will get the answer: The person in the picture is skiing down a snowy slope.
# import IPython
# IPython.display.Audio('output.wav')
Streaming inference#
# a new conversation need reset session first, it will reset the kv-cache
model.reset_session()

contents = get_video_chunk_content(video_path, flatten=False)
session_id = '123'
generate_audio = True

# 1. prefill system prompt
res = model.streaming_prefill(
    session_id=session_id,
    msgs=[sys_msg], 
    tokenizer=tokenizer
)

# 2. prefill video/audio chunks
for content in contents:
    msgs = [{"role":"user", "content": content}]
    res = model.streaming_prefill(
        session_id=session_id,
        msgs=msgs, 
        tokenizer=tokenizer
    )

# 3. generate
res = model.streaming_generate(
    session_id=session_id,
    tokenizer=tokenizer,
    temperature=0.5,
    generate_audio=generate_audio
)

audios = []
text = ""

if generate_audio:
    for r in res:
        audio_wav = r.audio_wav
        sampling_rate = r.sampling_rate
        txt = r.text

        audios.append(audio_wav)
        text += txt
        
    res = np.concatenate(audios)
    sf.write("output.wav", res, samplerate=sampling_rate)
    print("text:", text)
    print("audio saved to output.wav")
else:
    for r in res:
        text += r['text']
    print("text:", text)
Speech and Audio Mode#

Model initialization

import torch
import librosa
from transformers import AutoModel, AutoTokenizer

model = AutoModel.from_pretrained('openbmb/MiniCPM-o-2_6', trust_remote_code=True,
    attn_implementation='sdpa', torch_dtype=torch.bfloat16) # sdpa or flash_attention_2, no eager
model = model.eval().cuda()
tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-o-2_6', trust_remote_code=True)

model.init_tts()
model.tts.float()

Mimick#

Mimick task reflects a model's end-to-end speech modeling capability. The model takes audio input, and outputs an ASR transcription and subsequently reconstructs the original audio with high similarity. The higher the similarity between the reconstructed audio and the original audio, the stronger the model's foundational capability in end-to-end speech modeling.

mimick_prompt = "Please repeat each user's speech, including voice style and speech content."
audio_input, _ = librosa.load('./assets/input_examples/Trump_WEF_2018_10s.mp3', sr=16000, mono=True) # load the audio to be mimicked

# can also try `./assets/input_examples/cxk_original.wav`, 
# `./assets/input_examples/fast-pace.wav`, 
# `./assets/input_examples/chi-english-1.wav` 
# `./assets/input_examples/exciting-emotion.wav` 
# for different aspects of speech-centric features.

msgs = [{'role': 'user', 'content': [mimick_prompt, audio_input]}]
res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    temperature=0.3,
    generate_audio=True,
    output_audio_path='output_mimick.wav', # save the tts result to output_audio_path
)

General Speech Conversation with Configurable Voices#

A general usage scenario of MiniCPM-o-2.6 is role-playing a specific character based on the audio prompt. It will mimic the voice of the character to some extent and act like the character in text, including language style. In this mode, MiniCPM-o-2.6 sounds more natural and human-like. Self-defined audio prompts can be used to customize the voice of the character in an end-to-end manner.

ref_audio, _ = librosa.load('./assets/input_examples/icl_20.wav', sr=16000, mono=True) # load the reference audio
sys_prompt = model.get_sys_prompt(ref_audio=ref_audio, mode='audio_roleplay', language='en')

# round one
user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]}
msgs = [sys_prompt, user_question]
res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    generate_audio=True,
    temperature=0.3,
    output_audio_path='result_roleplay_round_1.wav',
)

# round two
history = msgs.append({'role': 'assistant', 'content': res})
user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]}
msgs = history.append(user_question)
res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    generate_audio=True,
    temperature=0.3,
    output_audio_path='result_roleplay_round_2.wav',
)
print(res)

Speech Conversation as an AI Assistant#

An enhanced feature of MiniCPM-o-2.6 is to act as an AI assistant, but only with limited choice of voices. In this mode, MiniCPM-o-2.6 is less human-like and more like a voice assistant. In this mode, the model is more instruction-following. For demo, you are suggested to use assistant_female_voice, assistant_male_voice, and assistant_default_female_voice. Other voices may work but not as stable as the default voices.

Please note that, assistant_female_voice and assistant_male_voice are more stable but sounds like robots, while assistant_default_female_voice is more human-alike but not stable, its voice often changes in multiple turns. We suggest you to try stable voices assistant_female_voice and assistant_male_voice.

ref_audio, _ = librosa.load('./assets/input_examples/assistant_female_voice.wav', sr=16000, mono=True) # or use `./assets/input_examples/assistant_male_voice.wav`
sys_prompt = model.get_sys_prompt(ref_audio=ref_audio, mode='audio_assistant', language='en') 
user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]} # load the user's audio question

# round one
msgs = [sys_prompt, user_question]
res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    generate_audio=True,
    temperature=0.3,
    output_audio_path='result_assistant_round_1.wav',
)

# round two
history = msgs.append({'role': 'assistant', 'content': res})
user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]}
msgs = history.append(user_question)
res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    generate_audio=True,
    temperature=0.3,
    output_audio_path='result_assistant_round_2.wav',
)
print(res)

Instruction-to-Speech#

MiniCPM-o-2.6 can also do Instruction-to-Speech, aka Voice Creation. You can describe a voice in detail, and the model will generate a voice that matches the description. For more Instruction-to-Speech sample instructions, you can refer to https://voxinstruct.github.io/VoxInstruct/.

instruction = 'Speak like a male charming superstar, radiating confidence and style in every word.'

msgs = [{'role': 'user', 'content': [instruction]}]

res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    generate_audio=True,
    temperature=0.3,
    output_audio_path='result_voice_creation.wav',
)

Voice Cloning#

MiniCPM-o-2.6 can also do zero-shot text-to-speech, aka Voice Cloning. With this mode, model will act like a TTS model.

ref_audio, _ = librosa.load('./assets/input_examples/icl_20.wav', sr=16000, mono=True) # load the reference audio
sys_prompt = model.get_sys_prompt(ref_audio=ref_audio, mode='voice_cloning', language='en')
text_prompt = f"Please read the text below."
user_question = {'role': 'user', 'content': [text_prompt, "content that you want to read"]}

msgs = [sys_prompt, user_question]
res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    generate_audio=True,
    temperature=0.3,
    output_audio_path='result_voice_cloning.wav',
)

Addressing Various Audio Understanding Tasks#

MiniCPM-o-2.6 can also be used to address various audio understanding tasks, such as ASR, speaker analysis, general audio captioning, and sound scene tagging.

For audio-to-text tasks, you can use the following prompts:

  • ASR with ZH(same as AST en2zh): 请仔细听这段音频片段,并将其内容逐字记录。
  • ASR with EN(same as AST zh2en): Please listen to the audio snippet carefully and transcribe the content.
  • Speaker Analysis: Based on the speaker's content, speculate on their gender, condition, age range, and health status.
  • General Audio Caption: Summarize the main content of the audio.
  • General Sound Scene Tagging: Utilize one keyword to convey the audio's content or the associated scene.
task_prompt = "Please listen to the audio snippet carefully and transcribe the content." + "\n" # can change to other prompts.
audio_input, _ = librosa.load('./assets/input_examples/audio_understanding.mp3', sr=16000, mono=True) # load the audio to be captioned

msgs = [{'role': 'user', 'content': [task_prompt, audio_input]}]

res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    max_new_tokens=128,
    use_tts_template=True,
    generate_audio=True,
    temperature=0.3,
    output_audio_path='result_audio_understanding.wav',
)
print(res)
Vision-Only mode#

MiniCPM-o-2_6 has the same inference methods as MiniCPM-V-2_6

Chat with single image#
# test.py
image = Image.open('xx.jpg').convert('RGB')
question = 'What is in the image?'
msgs = [{'role': 'user', 'content': [image, question]}]
res = model.chat(
    image=None,
    msgs=msgs,
    tokenizer=tokenizer
)
print(res)

## if you want to use streaming, please make sure sampling=True and stream=True
## the model.chat will return a generator
res = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    sampling=True,
    stream=True
)
generated_text = ""
for new_text in res:
    generated_text += new_text
    print(new_text, flush=True, end='')
Chat with multiple images#

Click to show Python code running MiniCPM-o 2.6 with multiple images input.

image1 = Image.open('image1.jpg').convert('RGB')
image2 = Image.open('image2.jpg').convert('RGB')
question = 'Compare image 1 and image 2, tell me about the differences between image 1 and image 2.'
msgs = [{'role': 'user', 'content': [image1, image2, question]}]
answer = model.chat(
    msgs=msgs,
    tokenizer=tokenizer
)
print(answer)
In-context few-shot learning#

Click to view Python code running MiniCPM-o 2.6 with few-shot input.

question = "production date" 
image1 = Image.open('example1.jpg').convert('RGB')
answer1 = "2023.08.04"
image2 = Image.open('example2.jpg').convert('RGB')
answer2 = "2007.04.24"
image_test = Image.open('test.jpg').convert('RGB')
msgs = [
    {'role': 'user', 'content': [image1, question]}, {'role': 'assistant', 'content': [answer1]},
    {'role': 'user', 'content': [image2, question]}, {'role': 'assistant', 'content': [answer2]},
    {'role': 'user', 'content': [image_test, question]}
]
answer = model.chat(
    msgs=msgs,
    tokenizer=tokenizer
)
print(answer)
Chat with video#

Click to view Python code running MiniCPM-o 2.6 with video input.

MAX_NUM_FRAMES=64 # if cuda OOM set a smaller number
def encode_video(video_path):
    def uniform_sample(l, n):
        gap = len(l) / n
        idxs = [int(i * gap + gap / 2) for i in range(n)]
        return [l[i] for i in idxs]
    vr = VideoReader(video_path, ctx=cpu(0))
    sample_fps = round(vr.get_avg_fps() / 1)  # FPS
    frame_idx = [i for i in range(0, len(vr), sample_fps)]
    if len(frame_idx) > MAX_NUM_FRAMES:
        frame_idx = uniform_sample(frame_idx, MAX_NUM_FRAMES)
    frames = vr.get_batch(frame_idx).asnumpy()
    frames = [Image.fromarray(v.astype('uint8')) for v in frames]
    print('num frames:', len(frames))
    return frames
video_path ="video_test.mp4"
frames = encode_video(video_path)
question = "Describe the video"
msgs = [
    {'role': 'user', 'content': frames + [question]}, 
]
# Set decode params for video
params={}
params["use_image_id"] = False
params["max_slice_nums"] = 2 # use 1 if cuda OOM and video resolution >  448*448
answer = model.chat(
    msgs=msgs,
    tokenizer=tokenizer,
    **params
)
print(answer)

Please look at GitHub for more detail about usage.

Inference with llama.cpp#

MiniCPM-o 2.6 (vision-only mode) can run with llama.cpp. See our fork of llama.cpp and readme for more detail.

Int4 quantized version#

Download the int4 quantized version for lower GPU memory (7GB) usage: MiniCPM-o-2_6-int4.

License#

Model License#
  • The MiniCPM-o/V model weights and code are open-sourced under the Apache-2.0 license.
  • To help us better understand and support our users, we would deeply appreciate it if you could consider optionally filling out a brief registration "questionnaire".
Statement#
  • As an LMM, MiniCPM-o 2.6 generates contents by learning a large mount of multimodal corpora, but it cannot comprehend, express personal opinions or make value judgement. Anything generated by MiniCPM-o 2.6 does not represent the views and positions of the model developers
  • We will not be liable for any problems arising from the use of the MinCPM-V models, including but not limited to data security issues, risk of public opinion, or any risks and problems arising from the misdirection, misuse, dissemination or misuse of the model.

Key Techniques and Other Multimodal Projects#

👏 Welcome to explore key techniques of MiniCPM-o 2.6 and other multimodal projects of our team:

VisCPM | RLHF-V | LLaVA-UHD | RLAIF-V

Citation#

If you find our work helpful, please consider citing our papers 📝 and liking this project ❤️!

@article{yao2024minicpm,
  title={MiniCPM-V: A GPT-4V Level MLLM on Your Phone},
  author={Yao, Yuan and Yu, Tianyu and Zhang, Ao and Wang, Chongyi and Cui, Junbo and Zhu, Hongji and Cai, Tianchi and Li, Haoyu and Zhao, Weilin and He, Zhihui and others},
  journal={arXiv preprint arXiv:2408.01800},
  year={2024}
}

Files

40 files · 17.4 GBWeights 17.4 GB (safetensors). Sizes and sha256 from the signed manifest.
Show all 40 files with their sha256
FileSizesha256
.gitattributes1.74 KB78116cae51126f90712c745ac8683204f1f338035f966ba888f07e83da9807c8
README.md50.3 KB46b52d738a2826063b7d40082723e657a7593f8a74a1546e4a32ffb2fd38f1d2
added_tokens.json1.41 KBb58f7cc542e5c53df171a9e85bbaafa2f6f371e8e3ce617ac7e4b1e029eb660d
assets/Skiing.mp48.53 MB479ace116d6ac92487ad90f415b3ef817cd019bba4521043ef0d5faaa1a8415d
assets/Vocos.pt54.4 MB09a670eda1c08b740013679c7a90ebb7f1a97646ea7673069a6838e6b51d6c58
assets/chattts_tokenizer/special_tokens_map.json7.85 KBbd0ac9d9bb1657996b5c5fbcaa7d80f8de530d01a283da97f89deae5b1b8d011
assets/chattts_tokenizer/tokenizer.json449 KB843838a64e121e23e774cc75874c6fe862198d9f7dd43747914633a8fd89c20e
assets/chattts_tokenizer/tokenizer_config.json11.0 KB43e9d658b554fa5ee8d8e1d763349323bfef1ed7a89c0794220ab8861387d421
assets/demo.wav1.45 MBd0b347d8ed0b2314c0d175fbdac79f6f3f91a6402bd7492ac5c860646a2ba309
assets/input_examples/Trump_WEF_2018_10s.mp3161 KB4fb796c2bb95538eab22d9b68a31add560305b6d5ccbf150c3f96e7671b6db64
assets/input_examples/assistant_default_female_voice.wav224 KB2ee6f84892e693bd2bb478608db0c9a2459b936af3283697b006cfd969c75484
assets/input_examples/assistant_female_voice.wav235 KB1d712ba6de1d15d52eda96bdc043ce43eb5af4b4ac441b78b6fb0fdaf6683c7a
assets/input_examples/assistant_male_voice.wav144 KBe6b5eff26be104bbfc039f31f8cebcd6f329c275ccafa01234856ec1a964e999
assets/input_examples/audio_understanding.mp3321 KBd5f8f39d78ea82fba5a95250f6558b767cbd34f13f1716112e23b94646fe316c
assets/input_examples/chi-english-1.wav492 KB9e859f2fcd4664da461209577ac1b62fa2a2c4185ddddc4a63726530a18744e1
assets/input_examples/cxk_original.wav384 KBdbb0860cb4dd7c7003b6f0406299fc7c0febc5c6a990e1c670d29b763e84e7ed
assets/input_examples/exciting-emotion.wav696 KB5dd68efbb93cb388dc598404cf8af106bf063ddc9f8ae4460f11189f0b3ed4ed
assets/input_examples/fast-pace.wav986 KBdfad5114ceee7b64b37866f3ed3418fe2eb99b178574a7319ad076dc26b746ec
assets/input_examples/icl_20.wav619 KB53892ece071342958403bc5643f84169a30b89cc0fc79eb69508bfa11dd85e68
assets/input_examples/indian-accent.wav1.41 MB716533af9ec8ca4586035af7dce4a65ce93e851d3f2474242d401b50bf3c0cdc
config.json3.44 KB917813ee571faf0447669b6b3549c8357c583141b5e4a8be1bcf9cc800a7c8cf
configuration_minicpm.py7.55 KBb6fe4224dabce0389aaa6ecf9c05849a81935b7a56a8585e581aac11262e70cd
image_processing_minicpmv.py16.7 KBbe645337bd25811ae1f86e3aaa21fa5b555719870f5612004b4a67357148fe1f
merges.txt1.67 MB8831e4f1a044471340f7c0a83d7bd71306a5b867e95fd870f74d0c5308a904d5
model-00001-of-00004.safetensors4.88 GBde39e68ffea57e92c6dc2b1dc4e737817529c743dc9e795c383e7aa76f5f4e09
model-00002-of-00004.safetensors4.93 GB095633536dea52b82dd6c5535376bc2b9e11fb376fb1d4c6cd256f04089d4261
model-00003-of-00004.safetensors4.33 GB4ea83267712fa53800feaae9101bec976f81fcf8133c7086c7cc8d77f0eb35f0
model-00004-of-00004.safetensors3.21 GBf988c173052592bd46e7aa74b36dfd02739e8b40eafbf5c93bc5d95d04f3397b
model.safetensors.index.json133 KB6922f68aa0712c4dec330a2bcd90bf61ee50257e09d3c9aff05e62c5d20d88c5
modeling_minicpmo.py141 KB12f7d91b5ba380ec23ce472fd1870a3983d97e3cd93ca733cf5db8cbdded126b
modeling_navit_siglip.py42.1 KBf0a3e2fb52824ae06e30973c9e92abfdb441d0585674fa0cfc779bca4820c223
preprocessor_config.json714 B2d9b0069b9bc2804df682fb29c12a2c193cfdf4fd87966e5364ba6e4d38de20c
processing_minicpmo.py20.0 KBdcc392a3ce053579d57ecf88dd8607d40723cb740cf47ce465dd36db4047ac29
resampler.py35.6 KBddb4f2e4d7a8e6088656b1a6d314c4d832868e66edf73f0ab90007b862a1e5e8
special_tokens_map.json5.35 KB0526a61b2569cb82e44fc2220a9781865e2bdcdc7ba186071a0a809d5514c4c9
tokenization_minicpmo_fast.py3.04 KB6b9393bab49d4843fbf7ffdced7d58ebbfc5269c3876721a4e9f6090021d990b
tokenizer.json7.04 MBe035c20fe6e2600ac2e92c828b859062e68d09d2ba93d83c8b851772fd978666
tokenizer_config.json14.1 KB8816dde110010310ceeaa1412a1f532744cd96efd3e97d473dd031861aa98dd5
utils.py7.24 KBb94f26ab37e99541a461eacf6009d8ddca70dfe446b8ed6b48db698b7564b27b
vocab.json2.78 MBca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910
VersionsEach time the pinned upstream commit or file list changed in this repo. Newest first.
Upstream commitDateContents
cf0b69a611 pinned now manifest updated, same commit2026-11-14 21:25 UTC40 files · 17.4 GB
cf0b69a6112026-11-14 21:25 UTC40 files · 17.4 GB

Use it

$ fw get openbmb/MiniCPM-o-2_6
# manifest sha256 3e7d5211af2f… · 17.4 GB · 40 files
$ fw verify ./MiniCPM-o-2_6 openbmb/MiniCPM-o-2_6
fw.pyChecks the signature and every sha256, tries each source in order, resumes.
$ python3 fw.py get https://freeweights.allternit.com/manifests/openbmb/MiniCPM-o-2_6.json --dir ./MiniCPM-o-2_6 $ python3 fw.py verify ./MiniCPM-o-2_6 ./openbmb__MiniCPM-o-2_6.json
hfThe Hugging Face CLI with one setting. Same repo id.
$ HF_ENDPOINT=https://freeweights.allternit.com hf download openbmb/MiniCPM-o-2_6 --revision cf0b69a6118cd3b2c90bb37f3f4366e2fba802ab --local-dir ./MiniCPM-o-2_6

License

Name
Apache License 2.0
Id
Apache-2.0
Class
Permissive
Redistribution
yes
Listing
Hosted (signed)
Decided
License as declared by the publisher. No person read it. 2026-11-14
Text in
README.md
Text sha256
46b52d738a2826063b7d40082723e657a7593f8a74a1546e4a32ffb2fd38f1d2
Terms gate
No extra terms beyond the license.

Read the license text

Licenses are checked against the license table. A custom license passes only after a person reads it.

Provenance

From: openbmb <huggingface.co/openbmb>Newsgroups: alt.freeweights.minicpmSubject: MiniCPM-o-2_6Date: 2026-11-14Commit: cf0b69aSigned: 2DC28CC7B26A283B ✓
Upstream
openbmb/MiniCPM-o-2_6
Pinned commit
cf0b69a6118cd3b2c90bb37f3f4366e2fba802ab
Manifest
MiniCPM-o-2_6.json · .minisig
Manifest sha256
3e7d5211af2f819aa25082157294b4285e6f03f316de5c77d6c380a63e387bd7
Signature
minisign, Ed25519, key 2DC28CC7B26A283B
Created
2026-11-14 21:25 UTC
Generator
freeweights-manifest/0.1.0
Takedowns
None.

How to verify

$ curl -O https://freeweights.allternit.com/manifests/openbmb/MiniCPM-o-2_6.json $ curl -O https://freeweights.allternit.com/manifests/openbmb/MiniCPM-o-2_6.json.minisig $ minisign -Vm MiniCPM-o-2_6.json -P RWQ7KGqyx4zCLXtUFOqvfv8L3g+8fpKJ1FsuxPyOYMF+4KufbUxKq1Oq $ shasum -a 256 <file> # compare with the Files tab

A manifest whose signature fails must be rejected. A file whose size or sha256 does not match must be discarded. Verify a download

Model tree

5 models in the catalog name this one as their parent.

Quantizations
5
Get it
Download
$ HF_ENDPOINT=https://freeweights.allternit.com hf download openbmb/MiniCPM-o-2_6
Open in Freeweights Studio

Pull, verify and run it in the Allternit app on Desktop, web or phone.

Signed manifest
minisign, key 2DC28CC7B26A283B. MiniCPM-o-2_6.json. Provenance. Takedown history: none.

Variants

5 quantized or adapter builds of MiniCPM-o-2_6. Each has its own license check and page.

From: openbmb <huggingface.co/openbmb>Subject: AgentCPM-Explore-GGUF
From: openbmb <huggingface.co/openbmb>Subject: AgentCPM-Report
From: openbmb <huggingface.co/openbmb>Subject: AgentCPM-Report-GGUF
From: openbmb <huggingface.co/openbmb>Subject: BitCPM-CANN-0.5B-gguf
From: openbmb <huggingface.co/openbmb>Subject: BitCPM-CANN-1B-gguf
From: openbmb <huggingface.co/openbmb>Subject: BitCPM-CANN-3B-gguf