Record MiniCPM-o CPU GGUF complete-path evidence

This commit is contained in:
tzhouam committed 2026-09-23 22:22:54 +08:00
1 parent bb8735effc
commit 445ca92ef1
190 files changed
+4625 -5

No files matched your search

@@ -0,0 +1,126 @@
#!/usr/bin/env python3
"""Check generated Mandarin speech against its own text with local Whisper.
Character error rate is an intelligibility proxy, not a task-quality or
speaker-fidelity score. It does not say whether the model understood its input.
"""
from __future__ import annotations
import argparse
import hashlib
import json
import re
import time
from pathlib import Path
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as stream:
for block in iter(lambda: stream.read(8 << 20), b""):
digest.update(block)
return digest.hexdigest()
def characters(value: str) -> list[str]:
return re.findall(r"[\u4e00-\u9fff]|[a-z0-9]", value.casefold())
def character_error_rate(reference: str, actual: str) -> float:
expected, got = characters(reference), characters(actual)
previous = list(range(len(got) + 1))
for position, item in enumerate(expected, 1):
current = [position]
for index, candidate in enumerate(got, 1):
current.append(min(
current[-1] + 1,
previous[index] + 1,
previous[index - 1] + (item != candidate),
))
previous = current
return previous[-1] / max(len(expected), 1)
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--wav", type=Path, required=True)
parser.add_argument("--reference-file", type=Path, required=True)
parser.add_argument("--model-dir", type=Path, required=True)
parser.add_argument("--model-revision", required=True)
parser.add_argument("--output", type=Path, required=True)
args = parser.parse_args()
import librosa
import numpy as np
from opencc import OpenCC
import soundfile as sf
import torch
import transformers
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
audio, sample_rate = sf.read(args.wav, dtype="float32", always_2d=False)
if audio.ndim != 1 or not audio.size or not np.isfinite(audio).all():
raise ValueError("expected finite mono audio")
audio_16k = librosa.resample(audio, orig_sr=sample_rate, target_sr=16000)
reference = args.reference_file.read_text(encoding="utf-8").strip()
if not characters(reference):
raise ValueError("reference text has no Mandarin or alphanumeric characters")
started = time.perf_counter()
processor = AutoProcessor.from_pretrained(str(args.model_dir), local_files_only=True)
model = AutoModelForSpeechSeq2Seq.from_pretrained(
str(args.model_dir), local_files_only=True
).to("cpu")
load_s = time.perf_counter() - started
if {parameter.device.type for parameter in model.parameters()} != {"cpu"}:
raise RuntimeError("Whisper was not wholly on CPU")
started = time.perf_counter()
transcripts = []
segment_frames = 25 * 16000
with torch.no_grad():
for offset in range(0, len(audio_16k), segment_frames):
features = processor(
audio_16k[offset:offset + segment_frames],
sampling_rate=16000,
return_tensors="pt",
return_attention_mask=True,
)
ids = model.generate(
features.input_features, attention_mask=features.attention_mask,
language="zh", task="transcribe",
)
transcripts.append(
processor.batch_decode(ids, skip_special_tokens=True)[0].strip()
)
infer_s = time.perf_counter() - started
transcript = "".join(transcripts)
traditional_to_simplified = OpenCC("t2s")
normalized_reference = traditional_to_simplified.convert(reference)
normalized_transcript = traditional_to_simplified.convert(transcript)
report = {
"scope": "Whisper Mandarin ASR proxy for generated speech; no input-task or perceptual-quality claim",
"asr_model": "openai/whisper-tiny",
"asr_revision": args.model_revision,
"asr_weights_sha256": sha256(args.model_dir / "model.safetensors"),
"transformers": transformers.__version__,
"torch": torch.__version__,
"wav_sha256": sha256(args.wav),
"wav_duration_s": len(audio) / sample_rate,
"reference_text": reference,
"transcript": transcript,
"asr_segments_25_s": len(transcripts),
"character_error_rate_raw": character_error_rate(reference, transcript),
"character_error_rate_t2s_normalized": character_error_rate(
normalized_reference, normalized_transcript
),
"normalization": "OpenCC 0.1.7 t2s; punctuation ignored",
"load_s": load_s,
"inference_s": infer_s,
}
args.output.parent.mkdir(parents=True, exist_ok=True)
args.output.write_text(json.dumps(report, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
print(json.dumps(report, indent=2, ensure_ascii=False))
if __name__ == "__main__":
main()
@@ -0,0 +1,69 @@
#!/usr/bin/env python3
"""Capture one local process's raw output, exit code, elapsed time and memory.
This wrapper samples RSS and private bytes; the values are observed maxima, not
proof of the true loading peak between samples.
"""
from __future__ import annotations
import argparse
import json
import subprocess
import time
from pathlib import Path
import psutil
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--cwd", type=Path, required=True)
parser.add_argument("--stdout", type=Path, required=True)
parser.add_argument("--stderr", type=Path, required=True)
parser.add_argument("--report", type=Path, required=True)
parser.add_argument("--sample-interval-ms", type=int, default=100)
parser.add_argument("command", nargs=argparse.REMAINDER)
args = parser.parse_args()
if not args.command or args.sample_interval_ms < 10:
parser.error("a command and sample interval >= 10 ms are required")
command = args.command[1:] if args.command[0] == "--" else args.command
for path in (args.stdout, args.stderr, args.report):
path.parent.mkdir(parents=True, exist_ok=True)
started = time.perf_counter()
with args.stdout.open("wb") as stdout, args.stderr.open("wb") as stderr:
child = subprocess.Popen(command, cwd=args.cwd, stdout=stdout, stderr=stderr)
process = psutil.Process(child.pid)
samples = 0
peak_rss = 0
peak_private = 0
while child.poll() is None:
try:
memory = process.memory_info()
except (psutil.NoSuchProcess, psutil.AccessDenied):
break
peak_rss = max(peak_rss, memory.rss)
peak_private = max(peak_private, getattr(memory, "private", 0))
samples += 1
time.sleep(args.sample_interval_ms / 1000)
exit_code = child.wait()
report = {
"command": command,
"cwd": str(args.cwd),
"exit_code": exit_code,
"wall_s": time.perf_counter() - started,
"memory_sample_interval_ms": args.sample_interval_ms,
"memory_samples": samples,
"peak_sampled_rss_bytes": peak_rss,
"peak_sampled_private_bytes": peak_private,
"measurement_note": "sampled process values, not guaranteed loading peaks",
}
args.report.write_text(json.dumps(report, indent=2) + "\n", encoding="utf-8")
print(json.dumps(report, indent=2))
if exit_code:
raise SystemExit(exit_code)
if __name__ == "__main__":
main()
@@ -0,0 +1,165 @@
#!/usr/bin/env python3
"""Verify a complete MiniCPM-o C++ text/audio result and join its PCM chunks.
The upstream CLI currently writes wav_N.wav but its optional merger searches
for tts_output_chunk_N.wav. This verifier checks the actual bounded sequence,
then joins PCM frames without changing sample values.
"""
from __future__ import annotations
import argparse
import array
import hashlib
import json
import math
import re
import wave
from pathlib import Path
ARTIFACTS = (
"MiniCPM-o-4_5-Q4_K_M.gguf",
"audio/MiniCPM-o-4_5-audio-F16.gguf",
"vision/MiniCPM-o-4_5-vision-F16.gguf",
"tts/MiniCPM-o-4_5-tts-F16.gguf",
"tts/MiniCPM-o-4_5-projector-F16.gguf",
"token2wav-gguf/encoder.gguf",
"token2wav-gguf/flow_matching.gguf",
"token2wav-gguf/flow_extra.gguf",
"token2wav-gguf/hifigan2.gguf",
"token2wav-gguf/prompt_cache.gguf",
)
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as stream:
for chunk in iter(lambda: stream.read(8 << 20), b""):
digest.update(chunk)
return digest.hexdigest()
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--output-dir", type=Path, required=True)
parser.add_argument("--run-log", type=Path, required=True)
parser.add_argument("--runtime-bin", type=Path, required=True)
parser.add_argument("--model-dir", type=Path, required=True)
parser.add_argument("--model-revision", required=True)
parser.add_argument("--input-image", type=Path, required=True)
parser.add_argument("--input-audio", type=Path, required=True)
parser.add_argument("--merged-wav", type=Path, required=True)
parser.add_argument("--report", type=Path, required=True)
parser.add_argument("--platform-label", default="WSL CPU")
parser.add_argument("--process-profile", type=Path)
args = parser.parse_args()
output_dir = args.output_dir.resolve(strict=True)
log = args.run_log.read_text(encoding="utf-8", errors="replace")
required_log = (
"Media type: 2 (omni: audio+vision)",
"GPU layers: 0",
"Token2Wav device: cpu",
"vision_ctx: vision using CPU backend",
"Token2Wav: initialized successfully",
"stream_prefill(index=1): processing user audio:",
"stream_prefill(index=1): user audio embedding:",
"stream_prefill: prefilled 1 vision chunks",
)
missing_log = [item for item in required_log if item not in log]
if missing_log:
raise RuntimeError(f"missing complete-path/placement evidence: {missing_log}")
process_profile = None
if args.process_profile:
process_profile = json.loads(args.process_profile.read_text(encoding="utf-8"))
if process_profile["exit_code"] != 0:
raise RuntimeError("profiled process exited with an error")
elif "Exit status: 0" not in log:
raise RuntimeError("/usr/bin/time did not report exit status 0")
wave_dir = output_dir / "round_000" / "tts_wav"
if not (wave_dir / "generation_done.flag").is_file():
raise RuntimeError("Token2Wav did not finish")
chunk_paths = sorted(
wave_dir.glob("wav_*.wav"),
key=lambda path: int(re.fullmatch(r"wav_(\d+)\.wav", path.name).group(1)),
)
if not 0 < len(chunk_paths) <= 256:
raise RuntimeError("no bounded audio chunk sequence")
if [path.name for path in chunk_paths] != [f"wav_{i}.wav" for i in range(len(chunk_paths))]:
raise RuntimeError("audio chunk sequence has a gap or duplicate")
pcm_chunks: list[bytes] = []
chunks: list[dict] = []
square_sum = 0
frames_total = 0
for path in chunk_paths:
with wave.open(str(path), "rb") as source:
fmt = (source.getnchannels(), source.getsampwidth(), source.getframerate())
if fmt != (1, 2, 24000):
raise RuntimeError(f"invalid PCM16 mono 24 kHz chunk: {path.name}, {fmt}")
frames = source.getnframes()
if not 0 < frames <= 24000 * 10:
raise RuntimeError(f"invalid bounded chunk length: {path.name}, {frames}")
pcm = source.readframes(frames)
if len(pcm) != frames * 2:
raise RuntimeError(f"truncated audio chunk: {path.name}")
samples = array.array("h")
samples.frombytes(pcm)
square_sum += sum(int(value) ** 2 for value in samples)
frames_total += frames
pcm_chunks.append(pcm)
chunks.append({"name": path.name, "frames": frames, "sha256": sha256(path)})
if frames_total > 24000 * 120 or square_sum == 0:
raise RuntimeError("assembled audio is too long or silent")
pcm = b"".join(pcm_chunks)
args.merged_wav.parent.mkdir(parents=True, exist_ok=True)
with wave.open(str(args.merged_wav), "wb") as target:
target.setnchannels(1)
target.setsampwidth(2)
target.setframerate(24000)
target.writeframes(pcm)
text_dir = output_dir / "round_000" / "llm_debug"
text_paths = sorted(
text_dir.glob("chunk_*/llm_text.txt"),
key=lambda path: int(path.parent.name.removeprefix("chunk_")),
)
response_text = "".join(path.read_text(encoding="utf-8") for path in text_paths).strip()
if not response_text:
raise RuntimeError("language stage returned no text")
memory_match = re.search(r"Maximum resident set size \(kbytes\): (\d+)", log)
wall_match = re.search(r"Elapsed \(wall clock\) time \(h:mm:ss or m:ss\): ([\d:.]+)", log)
model_dir = args.model_dir.resolve(strict=True)
artifacts = {}
for name in ARTIFACTS:
path = model_dir / name
artifacts[name] = {"bytes": path.stat().st_size, "sha256": sha256(path)}
report = {
"scope": f"standalone MiniCPM-o 4.5 GGUF audio+image input to text+speech on {args.platform_label}",
"status": "scoped_complete_path_pass",
"quality": "synthetic red-square/tone response not established as semantically correct",
"model_revision": args.model_revision,
"artifacts": artifacts,
"runtime_binary_sha256": sha256(args.runtime_bin),
"input_image_sha256": sha256(args.input_image),
"input_audio_sha256": sha256(args.input_audio),
"response_text": response_text,
"audio_chunks": chunks,
"audio_frames": frames_total,
"audio_duration_s": frames_total / 24000,
"audio_rms_pcm16": math.sqrt(square_sum / frames_total),
"pcm_sha256": hashlib.sha256(pcm).hexdigest(),
"merged_wav_sha256": sha256(args.merged_wav),
"peak_rss_kib_from_time": int(memory_match.group(1)) if memory_match else None,
"wall_clock_from_time": wall_match.group(1) if wall_match else None,
"sampled_process_profile": process_profile,
"upstream_merge_name_mismatch": "TTS: no valid WAV files to merge" in log,
}
args.report.parent.mkdir(parents=True, exist_ok=True)
args.report.write_text(json.dumps(report, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
print(json.dumps({key: value for key, value in report.items() if key != "artifacts"}, indent=2, ensure_ascii=False))
if __name__ == "__main__":
main()
@@ -1,6 +1,6 @@
# 2026-09-23 WSL CPU and native Windows expansion
This extends the [60-cell device × model matrix](../e2e_profiling_20260922/evidence/summary/README.md) with previously unrun WSL CPU and native Windows paths. The September 22 timing tables remain historical. MiniCPM-o now has separate 20-request serial text-to-speech timing runs on WSL CPU and native Windows GPU, plus one synthetic image and one synthetic audio input on each platform; each InternVLA timing remains one observation. Spark has a 20-request Omni output-head component profile on the HX370 AMD NPU and separate 20-request **complete text** profiles through standalone llama.cpp on native Windows CPU and Radeon 890M. The latter now also run as bounded whole-session Omni stages, with public AsyncOmni requests checked separately. Qwen3-TTS has separate 20-request standalone and bounded Omni whole-session text-to-WAV profiles on native Windows CPU; the CPU+Radeon 890M hybrid route likewise has standalone and Omni profiles. None is a sustained or full-modality profile. The [checkpoint manifests](../e2e_recovery_20260923/README.md) pin the earlier real weights; the [Spark NPU component record](evidence/spark_amd_npu_output_head/README.md), [standalone CPU/Radeon whole-model record](evidence/spark_radeon890m_llamacpp/README.md), [Omni CPU/Radeon whole-session record](evidence/spark_omni_llamacpp/README.md), [standalone CPU Qwen TTS record](evidence/qwen_tts_native_cpu/README.md), [Omni CPU Qwen TTS record](evidence/qwen_tts_omni_cpu/README.md), [standalone joint CPU+Radeon TTS record](evidence/qwen_tts_radeon890m_joint/README.md), and [Omni joint TTS record](evidence/qwen_tts_omni_hybrid/README.md) pin their respective artifacts. No model, precision or context was silently substituted.
This extends the [60-cell device × model matrix](../e2e_profiling_20260922/evidence/summary/README.md) with previously unrun WSL CPU and native Windows paths. The September 22 timing tables remain historical. MiniCPM-o now has separate 20-request serial text-to-speech timing runs on WSL CPU and native Windows GPU, plus one synthetic image and one synthetic audio input on each platform. A separate pinned GGUF route ran one **combined** image+audio to text+speech request on WSL CPU and native Windows CPU; these C++ runs are standalone, with unqualified input-grounded quality. Each InternVLA timing remains one observation. Spark has a 20-request Omni output-head component profile on the HX370 AMD NPU and separate 20-request **complete text** profiles through standalone llama.cpp on native Windows CPU and Radeon 890M. The latter now also run as bounded whole-session Omni stages, with public AsyncOmni requests checked separately. Qwen3-TTS has separate 20-request standalone and bounded Omni whole-session text-to-WAV profiles on native Windows CPU; the CPU+Radeon 890M hybrid route likewise has standalone and Omni profiles. None is a sustained or full-modality profile. The [checkpoint manifests](../e2e_recovery_20260923/README.md) pin the earlier real weights; the [Spark NPU component record](evidence/spark_amd_npu_output_head/README.md), [standalone CPU/Radeon whole-model record](evidence/spark_radeon890m_llamacpp/README.md), [Omni CPU/Radeon whole-session record](evidence/spark_omni_llamacpp/README.md), [standalone CPU Qwen TTS record](evidence/qwen_tts_native_cpu/README.md), [Omni CPU Qwen TTS record](evidence/qwen_tts_omni_cpu/README.md), [standalone joint CPU+Radeon TTS record](evidence/qwen_tts_radeon890m_joint/README.md), and [Omni joint TTS record](evidence/qwen_tts_omni_hybrid/README.md) pin their respective artifacts. No model, precision or context was silently substituted.
| Device / model | Verified depth | Observed output and time | Remaining gate |
|---|---|---|---|
@@ -16,6 +16,8 @@ This extends the [60-cell device × model matrix](../e2e_profiling_20260922/evid
| WSL CPU / MiniCPM-o 4.5, revision `503e754207c94da6bb26850b4469f367c9ea3582` | Scoped complete three-stage text-to-text+speech path (P for this input only) | Coherent text and a 5.2 s mono 24 kHz WAV. First request 27.09 s after 73.65 s startup; separate 1-warmup/20-measured serial run: startup 73.89 s, request wall p50 21.86 s/p95 22.97 s. | Speech intelligibility/alignment, real image/audio quality, video input, concurrency, interruption, power and thermal behavior. |
| WSL CPU / MiniCPM-o 4.5, same revision | Scoped three-stage **image**-to-text+speech path (P for one synthetic image) | For the 448×448 red square, returned a correct description and nonzero 5.2 s WAV. Startup 112.44 s; one request 37.70 s. Text and token IDs differed from WSL GPU while describing the same visible content. | Real-image suite, speech meaning, repeated latency, memory admission and clean shutdown. |
| WSL CPU / MiniCPM-o 4.5, same revision | Scoped three-stage **audio**-to-text+speech path (P for one synthetic clip) | For the 2 s, 440 Hz tone, answered “A loud and high pitched beep” and produced a nonzero 2.16 s WAV. Startup 101.22 s; one request 17.30 s. Text and token IDs differed from WSL GPU. | Real-audio and transcription suites, speech meaning, repeated latency, memory admission and clean shutdown. |
| WSL CPU / MiniCPM-o 4.5, separate pinned Q4_K_M/F16 GGUF set | Standalone C++ whole-chain **combined synthetic image+audio** input to text+speech (P for this request; not an Omni stage or a semantic-quality pass) | The vision and audio encoders, language model, TTS and CPU Token2Wav ran in one process. One cold 40.70 s run returned generic text and ten nonempty 24 kHz chunks, assembled into a 9.24 s WAV; peak RSS from `/usr/bin/time` was 13,369,604 KiB (~12.75 GiB). Whisper tiny ASR gave 9.30% script-normalized character error against the generated text as an intelligibility proxy. The text did not describe the red square or tone. | Compare task quality against a prompted input/reference, fix upstream WAV merge naming, bind Omni placement, repeat latency, cancellation and sustained use; [C++ raw evidence](evidence/minicpmo_cpp_cpu/README.md). |
| Native Windows HX370 CPU / MiniCPM-o 4.5, same pinned Q4_K_M/F16 GGUF set | Standalone C++ whole-chain **combined synthetic image+audio** input to text+speech (P for this request; outside Omni) | The corrected x86-64-v3 build and bounded audio wait completed a cold run in 137.34 s, with 50 nonempty 24 kHz WAV chunks/49.16 s and sampled peak RSS/private bytes 13.10/13.31 GB. Whisper tiny ASR gave 13.59% script-normalized character error against the generated text. The response was generic and input-grounded quality remains unqualified. The first generic cross-build exited 0 with only 15 chunks and no completion flag, preserved as a failed attempt. | Bind an Omni whole-session stage and admission/state contract, prompt and qualify image/audio quality, fix live WAV merge/streaming, repeat latency, cancellation and sustained thermal behavior; [complete raw evidence](evidence/minicpmo_cpp_windows_cpu/README.md), [failed run](evidence/minicpmo_cpp_windows_cpu_attempt1/README.md). |
| Native Windows RTX 5090 Laptop / MiniCPM-o 4.5, same revision | Scoped complete three-stage text-to-text+speech path (P for this input only) | Coherent text with the same 32 thinker token IDs as WSL CUDA, and a nonzero 5.2 s mono 24 kHz WAV. First engine startup 297.20 s and request 78.75 s, including first-use graph/JIT work; separate 1-warmup/20-measured serial run: startup 239.05 s, request wall p50 18.38 s/p95 18.73 s. | Speech intelligibility/alignment, real image/audio quality, video input, concurrency, interruption, loading peak and sustained behavior. |
| WSL RTX 5090 Laptop / MiniCPM-o 4.5, same revision | Scoped three-stage **image**-to-text+speech path (P for one synthetic image) | For a 448×448 red square on white, returned the correct visual description and a nonzero 5.2 s WAV. Engine startup 101.96 s; one request 17.49 s. | Broader visual quality, real images, audio/video inputs, speech intelligibility, repeated latency and cleanup reliability. |
| WSL RTX 5090 Laptop / MiniCPM-o 4.5, same revision | Scoped three-stage **audio**-to-text+speech path (P for one synthetic clip) | For a 2 s, 440 Hz tone at 16 kHz, answered “A loud whistling sound” and produced a nonzero 2.16 s WAV. Engine startup 105.94 s; one request 7.78 s. | Speech transcription/real audio quality, video input, speech intelligibility, repeated latency and shared-memory cleanup. |
@@ -0,0 +1,29 @@
# MiniCPM-o 4.5 GGUF whole-chain CPU feasibility run
This is a **standalone scoped complete-path** audio+image-to-text+speech run on the local Ryzen AI 9 HX 370 under Ubuntu 26.04/WSL2 (`6.18.33.2-microsoft-standard-WSL2`). It is an additional backend feasibility result for the already-scoped WSL CPU × MiniCPM-o cell, not an Omni integration, a native Windows result, a Radeon/NPU result, or a semantic-quality pass. The generated response to a synthetic 448×448 red square and 2 s/440 Hz tone was generic rather than a description of those inputs.
The complete ten-file artifact set came from [openbmb/MiniCPM-o-4_5-gguf](https://huggingface.co/openbmb/MiniCPM-o-4_5-gguf/tree/db25077c33951fe163b42986fba0132e279872a2) revision `db25077c33951fe163b42986fba0132e279872a2`: Q4_K_M language model, F16 vision/audio/TTS/projector and five Token2Wav GGUF files. [The report](minicpm_omni_cpu_full_report.json) records the byte count and SHA256 of each. The C++ source is [tc-mb/llama.cpp-omni](https://github.com/tc-mb/llama.cpp-omni/tree/5202b7b2f4d11f50b9f996161e7a2f8b8571b890) at `5202b7b2f4d11f50b9f996161e7a2f8b8571b890`, built locally with GCC 15.2, CMake 4.2.3, `GGML_CUDA=OFF`, `GGML_VULKAN=OFF`, and [this small CLI patch](llama_cpp_omni_cpu.patch) adding an explicit CPU Token2Wav selector and a portable wait. The binary SHA256 is in the report. The current branch has a CLI target but no `llama-omni-server` CMake target, so this result remains outside the Omni StageRuntime.
| Observation | Evidence |
|---|---|
| The runtime logged `GPU layers: 0`, `vision using CPU backend`, and CPU Token2Wav/vocoder placement. Prefill index 0 was the system/reference-audio prompt; index 1 actually encoded one JPEG vision chunk (64 tokens) and the 16 kHz user audio (20 positions). | [raw runtime and `/usr/bin/time` log](minicpm_omni_cpu_full.log), [input JPEG](fixture_0001.jpg), [input WAV](fixture_0001.wav) |
| The decoder returned nonempty [text](response_text.txt), TTS generated audio tokens, and the vocoder wrote ten sequential, nonempty mono 24 kHz PCM16 [chunks](output/round_000/tts_wav/). The bounded verifier joined their original PCM into a [9.24 s WAV](minicpm_omni_cpu_full_merged.wav), 221,760 frames, PCM SHA256 `372c4c7b453849eb1843b0477ce74d5db04a46cacc663ef01d02698f34a1a158`, RMS 2,452.44 in PCM16 units. | [verification report](minicpm_omni_cpu_full_report.json), [raw chunks and timing](output/round_000/tts_wav/) |
| Pinned `openai/whisper-tiny` on CPU transcribed the generated Mandarin WAV with 9.30% CJK/alphanumeric character error against the model's own text after OpenCC traditional-to-simplified normalization; unnormalized error was 32.56%. This is an intelligibility proxy, not a human listening score or input-grounded correctness. | [ASR report](speech_asr_proxy.json), [raw ASR log](speech_asr_proxy.log), [probe](../../../../experiments/probe_tts_asr_cjk.py) |
| The one cold process completed in 40.70 s; `/usr/bin/time` reported 13,369,604 KiB maximum RSS. The Token2Wav calls in the raw log were roughly 2 s per 1 s output after the first call, so this CPU route was slower than real time. This is one observation, not a p50/p95 or sustained profile. | [raw log](minicpm_omni_cpu_full.log) |
The C++ runtime's optional merger searched for `tts_output_chunk_N.wav` while its vocoder wrote `wav_N.wav`, and it attempted merging before all vocoder work ended. The raw log preserves its “no valid WAV files to merge” message. [The verifier](../../../../experiments/verify_minicpm_cpp_output.py) checks the completion flag, contiguous names, format, duration bound, nonzero samples, nonempty text and logged CPU placement before assembling the actual chunks. It does not repair the runtime's live streaming behavior. The text response did not establish input-grounded quality; the quantized language artifact must be compared against the same task/reference before release qualification. Playable streaming, request cancellation, loading peak, 20-request latency and 30-minute power/thermal behavior remain unverified.
Reproduce from a local checkout of the pinned C++ commit after applying the recorded patch and downloading the exact GGUF revision:
```bash
cmake -S . -B build-cpu -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DGGML_CUDA=OFF -DGGML_VULKAN=OFF -DLLAMA_CURL=OFF \
-DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_EXAMPLES=ON
cmake --build build-cpu --target llama-omni-cli -j 8
OMP_NUM_THREADS=8 timeout 900 /usr/bin/time -v ./build-cpu/bin/llama-omni-cli \
-m /path/to/MiniCPM-o-4_5-gguf/MiniCPM-o-4_5-Q4_K_M.gguf \
-ngl 0 -c 2048 --omni --t2w-device cpu \
--test /path/to/fixture_ 2
```
The fixture must have both `fixture_0000.wav` for index 0 and `fixture_0001.wav` plus `fixture_0001.jpg` for the user observation. The recorded run reused the same tone at indices 0 and 1; the image is the JPEG conversion of the previous [red-square fixture](../minicpmo_wsl_image/red_square.png). The weights and local build remain outside Git.
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

@@ -0,0 +1,121 @@
diff --git a/tools/omni/omni-cli.cpp b/tools/omni/omni-cli.cpp
index 2e9623a..769786d 100644
--- a/tools/omni/omni-cli.cpp
+++ b/tools/omni/omni-cli.cpp
@@ -11,6 +11,7 @@
#include <iostream>
#include <chrono>
+#include <thread>
#include <vector>
#include <limits.h>
#include <cinttypes>
@@ -61,6 +62,8 @@ static void show_usage(const char * prog_name) {
" --ref-audio <path> Reference audio for voice cloning (default: tools/omni/assets/default_ref_audio/default_ref_audio.wav)\n"
" -c, --ctx-size <n> Context size (default: 4096)\n"
" -ngl <n> Number of GPU layers (default: 99)\n"
+ " --t2w-device <mode> Token2Wav device: cpu or gpu:<index> (default: gpu:0)\n"
+ " --t2w-wait-seconds <n> Fail if async audio is incomplete after n seconds (default: 120)\n"
" --no-tts Disable TTS output\n"
" --omni Enable omni mode (audio + vision, media_type=2)\n"
" --vision-backend <mode> Vision compute backend: 'metal' (default) or 'coreml' (ANE)\n"
@@ -209,6 +212,8 @@ int main(int argc, char ** argv) {
std::string ref_audio_path = "tools/omni/assets/default_ref_audio/default_ref_audio.wav";
int n_ctx = 4096;
int n_gpu_layers = 99; // GPU 层数,默认 99
+ std::string token2wav_device = "gpu:0";
+ int token2wav_wait_seconds = 120;
int media_type = 1; // 1=audio only, 2=omni (audio+vision)
bool use_tts = true;
bool run_test = false;
@@ -247,6 +252,20 @@ int main(int argc, char ** argv) {
else if (arg == "-ngl" && i + 1 < argc) {
n_gpu_layers = std::atoi(argv[++i]);
}
+ else if (arg == "--t2w-device" && i + 1 < argc) {
+ token2wav_device = argv[++i];
+ if (token2wav_device != "cpu" && token2wav_device.rfind("gpu:", 0) != 0) {
+ fprintf(stderr, "Error: --t2w-device must be cpu or gpu:<index>\n");
+ return 1;
+ }
+ }
+ else if (arg == "--t2w-wait-seconds" && i + 1 < argc) {
+ token2wav_wait_seconds = std::atoi(argv[++i]);
+ if (token2wav_wait_seconds < 1 || token2wav_wait_seconds > 3600) {
+ fprintf(stderr, "Error: --t2w-wait-seconds must be 1..3600\n");
+ return 1;
+ }
+ }
else if (arg == "--no-tts") {
use_tts = false;
}
@@ -339,6 +358,7 @@ int main(int argc, char ** argv) {
printf(" TTS enabled: %s\n", use_tts ? "yes" : "no");
printf(" Context size: %d\n", n_ctx);
printf(" GPU layers: %d\n", n_gpu_layers);
+ printf(" Token2Wav device: %s\n", token2wav_device.c_str());
printf(" Vision backend: %s\n", vision_backend.c_str());
if (vision_backend == "coreml") {
printf(" Vision CoreML: %s\n", vision_coreml_model_path.c_str());
@@ -347,7 +367,8 @@ int main(int argc, char ** argv) {
printf(" Ref audio: %s\n", ref_audio_path.c_str());
// 🔧 Token2Wav 使用 GPU(Metal),已用 ggml_add+ggml_repeat 替代不支持的 ggml_add1
- auto ctx_omni = omni_init(&params, media_type, use_tts, tts_bin_dir, -1, "gpu:0");
+ auto ctx_omni = omni_init(&params, media_type, use_tts, tts_bin_dir,
+ token2wav_device == "cpu" ? 0 : -1, token2wav_device);
if (ctx_omni == nullptr) {
fprintf(stderr, "Error: Failed to initialize omni context\n");
return 1;
@@ -366,13 +387,19 @@ int main(int argc, char ** argv) {
}
// 等待 T2W 完成所有音频生成后再停止线程
+ bool audio_complete = true;
if(ctx_omni->async && ctx_omni->use_tts) {
std::string done_flag = std::string(ctx_omni->base_output_dir) + "/round_000/tts_wav/generation_done.flag";
fprintf(stderr, "Waiting for audio generation to complete...\n");
- for (int i = 0; i < 1200; ++i) { // 最多等 120 秒
+ audio_complete = false;
+ for (int i = 0; i < token2wav_wait_seconds * 10; ++i) {
FILE * f = fopen(done_flag.c_str(), "r");
- if (f) { fclose(f); fprintf(stderr, "Audio generation completed.\n"); break; }
- usleep(100000); // 100ms
+ if (f) { fclose(f); audio_complete = true; fprintf(stderr, "Audio generation completed.\n"); break; }
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ }
+ if (!audio_complete) {
+ fprintf(stderr, "Error: audio generation did not complete within %d seconds.\n",
+ token2wav_wait_seconds);
}
}
@@ -386,5 +413,8 @@ int main(int argc, char ** argv) {
llama_perf_context_print(ctx_omni->ctx_llama);
omni_free(ctx_omni);
+ if (!audio_complete) {
+ return 2;
+ }
return 0;
}
diff --git a/tools/omni/omni.h b/tools/omni/omni.h
index 145f515..b35c459 100644
--- a/tools/omni/omni.h
+++ b/tools/omni/omni.h
@@ -13,7 +13,7 @@
#include <atomic>
// Windows compatibility: pid_t is not defined on MSVC
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(__MINGW32__)
typedef int pid_t;
#endif
@@ -485,4 +485,4 @@ void sliding_window_reset(struct omni_context * ctx_omni);
// ==================== 高清模式函数声明 ====================
// 设置 vision max_slice_nums 覆盖值,用于高清模式
-void vision_set_max_slice_nums(struct vision_ctx * ctx_vision, int max_slice_nums);
\ No newline at end of file
+void vision_set_max_slice_nums(struct vision_ctx * ctx_vision, int max_slice_nums);
@@ -0,0 +1,589 @@
build: 64 (5202b7b) with cc (Ubuntu 15.2.0-16ubuntu1) 15.2.0 for x86_64-linux-gnu
llama_model_loader: loaded meta data with 27 key-value pairs and 399 tensors from /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/MiniCPM-o-4_5-Q4_K_M.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = qwen3
llama_model_loader: - kv 1: general.type str = model
llama_model_loader: - kv 2: general.name str = Llm
llama_model_loader: - kv 3: general.size_label str = 8.2B
llama_model_loader: - kv 4: qwen3.block_count u32 = 36
llama_model_loader: - kv 5: qwen3.context_length u32 = 40960
llama_model_loader: - kv 6: qwen3.embedding_length u32 = 4096
llama_model_loader: - kv 7: qwen3.feed_forward_length u32 = 12288
llama_model_loader: - kv 8: qwen3.attention.head_count u32 = 32
llama_model_loader: - kv 9: qwen3.attention.head_count_kv u32 = 8
llama_model_loader: - kv 10: qwen3.rope.freq_base f32 = 1000000.000000
llama_model_loader: - kv 11: qwen3.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 12: qwen3.attention.key_length u32 = 128
llama_model_loader: - kv 13: qwen3.attention.value_length u32 = 128
llama_model_loader: - kv 14: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 15: tokenizer.ggml.pre str = qwen2
llama_model_loader: - kv 16: tokenizer.ggml.tokens arr[str,151748] = ["!", "\"", "#", "$", "%", "&", "'", ...
llama_model_loader: - kv 17: tokenizer.ggml.token_type arr[i32,151748] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv 18: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv 19: tokenizer.ggml.bos_token_id u32 = 151644
llama_model_loader: - kv 20: tokenizer.ggml.eos_token_id u32 = 151645
llama_model_loader: - kv 21: tokenizer.ggml.unknown_token_id u32 = 128244
llama_model_loader: - kv 22: tokenizer.ggml.padding_token_id u32 = 151643
llama_model_loader: - kv 23: tokenizer.ggml.add_bos_token bool = false
llama_model_loader: - kv 24: tokenizer.chat_template str = {%- if tools %}\n {{- '<|im_start|>...
llama_model_loader: - kv 25: general.quantization_version u32 = 2
llama_model_loader: - kv 26: general.file_type u32 = 15
llama_model_loader: - type f32: 145 tensors
llama_model_loader: - type q4_K: 217 tensors
llama_model_loader: - type q6_K: 37 tensors
print_info: file format = GGUF V3 (latest)
print_info: file type = Q4_K - Medium
print_info: file size = 4.68 GiB (4.90 BPW)
load: printing all EOG tokens:
load: - 151643 ('<|endoftext|>')
load: - 151645 ('<|im_end|>')
load: - 151662 ('<|fim_pad|>')
load: - 151663 ('<|repo_name|>')
load: - 151664 ('<|file_sep|>')
load: special tokens cache size = 106
load: token to piece cache size = 0.9319 MB
print_info: arch = qwen3
print_info: vocab_only = 0
print_info: n_ctx_train = 40960
print_info: n_embd = 4096
print_info: n_layer = 36
print_info: n_head = 32
print_info: n_head_kv = 8
print_info: n_rot = 128
print_info: n_swa = 0
print_info: is_swa_any = 0
print_info: n_embd_head_k = 128
print_info: n_embd_head_v = 128
print_info: n_gqa = 4
print_info: n_embd_k_gqa = 1024
print_info: n_embd_v_gqa = 1024
print_info: f_norm_eps = 0.0e+00
print_info: f_norm_rms_eps = 1.0e-06
print_info: f_clamp_kqv = 0.0e+00
print_info: f_max_alibi_bias = 0.0e+00
print_info: f_logit_scale = 0.0e+00
print_info: f_attn_scale = 0.0e+00
print_info: n_ff = 12288
print_info: n_expert = 0
print_info: n_expert_used = 0
print_info: causal attn = 1
print_info: pooling type = -1
print_info: rope type = 2
print_info: rope scaling = linear
print_info: freq_base_train = 1000000.0
print_info: freq_scale_train = 1
print_info: n_ctx_orig_yarn = 40960
print_info: rope_finetuned = unknown
print_info: model type = 8B
print_info: model params = 8.19 B
print_info: general.name = Llm
print_info: vocab type = BPE
print_info: n_vocab = 151748
print_info: n_merges = 151387
print_info: BOS token = 151644 '<|im_start|>'
print_info: EOS token = 151645 '<|im_end|>'
print_info: EOT token = 151645 '<|im_end|>'
print_info: UNK token = 128244 '<unk>'
print_info: PAD token = 151643 '<|endoftext|>'
print_info: LF token = 198 'Ċ'
print_info: FIM PRE token = 151659 '<|fim_prefix|>'
print_info: FIM SUF token = 151661 '<|fim_suffix|>'
print_info: FIM MID token = 151660 '<|fim_middle|>'
print_info: FIM PAD token = 151662 '<|fim_pad|>'
print_info: FIM REP token = 151663 '<|repo_name|>'
print_info: FIM SEP token = 151664 '<|file_sep|>'
print_info: EOG token = 151643 '<|endoftext|>'
print_info: EOG token = 151645 '<|im_end|>'
print_info: EOG token = 151662 '<|fim_pad|>'
print_info: EOG token = 151663 '<|repo_name|>'
print_info: EOG token = 151664 '<|file_sep|>'
print_info: max token length = 256
load_tensors: loading model tensors, this can take a while... (mmap = true)
load_tensors: CPU_REPACK model buffer size = 3199.50 MiB
load_tensors: CPU_Mapped model buffer size = 4761.17 MiB
.....................................................................................
llama_context: constructing llama_context
llama_context: n_seq_max = 1
llama_context: n_ctx = 2048
llama_context: n_ctx_per_seq = 2048
llama_context: n_batch = 2048
llama_context: n_ubatch = 512
llama_context: causal_attn = 1
llama_context: flash_attn = auto
llama_context: kv_unified = false
llama_context: freq_base = 1000000.0
llama_context: freq_scale = 1
llama_context: n_ctx_per_seq (2048) < n_ctx_train (40960) -- the full capacity of the model will not be utilized
llama_context: CPU output buffer size = 0.58 MiB
llama_kv_cache: CPU KV buffer size = 288.00 MiB
llama_kv_cache: size = 288.00 MiB ( 2048 cells, 36 layers, 1/1 seqs), K (f16): 144.00 MiB, V (f16): 144.00 MiB
llama_context: Flash Attention was auto, set to enabled
llama_context: CPU compute buffer size = 304.38 MiB
llama_context: graph nodes = 1267
llama_context: graph splits = 1
llama_model_loader: loaded meta data with 30 key-value pairs and 193 tensors from /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-tts-F16.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = llama
llama_model_loader: - kv 1: general.type str = model
llama_model_loader: - kv 2: general.name str = Tts
llama_model_loader: - kv 3: general.size_label str = 445M
llama_model_loader: - kv 4: llama.block_count u32 = 20
llama_model_loader: - kv 5: llama.context_length u32 = 4096
llama_model_loader: - kv 6: llama.embedding_length u32 = 768
llama_model_loader: - kv 7: llama.feed_forward_length u32 = 3072
llama_model_loader: - kv 8: llama.attention.head_count u32 = 12
llama_model_loader: - kv 9: llama.attention.head_count_kv u32 = 12
llama_model_loader: - kv 10: llama.rope.freq_base f32 = 10000.000000
llama_model_loader: - kv 11: llama.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 12: llama.attention.key_length u32 = 64
llama_model_loader: - kv 13: llama.attention.value_length u32 = 64
llama_model_loader: - kv 14: general.file_type u32 = 1
llama_model_loader: - kv 15: llama.vocab_size u32 = 158626
llama_model_loader: - kv 16: llama.rope.dimension_count u32 = 64
llama_model_loader: - kv 17: general.quantization_version u32 = 2
llama_model_loader: - kv 18: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 19: tokenizer.ggml.pre str = qwen2
llama_model_loader: - kv 20: tokenizer.ggml.tokens arr[str,158626] = ["!", "\"", "#", "$", "%", "&", "'", ...
llama_model_loader: - kv 21: tokenizer.ggml.token_type arr[i32,158626] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv 22: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv 23: tokenizer.ggml.bos_token_id u32 = 151644
llama_model_loader: - kv 24: tokenizer.ggml.eos_token_id u32 = 151645
llama_model_loader: - kv 25: tokenizer.ggml.unknown_token_id u32 = 128244
llama_model_loader: - kv 26: tokenizer.ggml.padding_token_id u32 = 151643
llama_model_loader: - kv 27: tokenizer.ggml.add_bos_token bool = false
llama_model_loader: - kv 28: tokenizer.chat_template str = {%- if tools %}\n {{- '<|im_start|>...
llama_model_loader: - kv 29: tokenizer.ggml.add_space_prefix bool = false
llama_model_loader: - type f32: 50 tensors
llama_model_loader: - type f16: 143 tensors
print_info: file format = GGUF V3 (latest)
print_info: file type = F16
print_info: file size = 1.07 GiB (20.70 BPW)
load: printing all EOG tokens:
load: - 151643 ('<|endoftext|>')
load: - 151645 ('<|im_end|>')
load: - 151662 ('<|fim_pad|>')
load: - 151663 ('<|repo_name|>')
load: - 151664 ('<|file_sep|>')
load: special tokens cache size = 106
load: token to piece cache size = 0.9319 MB
print_info: arch = llama
print_info: vocab_only = 0
print_info: n_ctx_train = 4096
print_info: n_embd = 768
print_info: n_layer = 20
print_info: n_head = 12
print_info: n_head_kv = 12
print_info: n_rot = 64
print_info: n_swa = 0
print_info: is_swa_any = 0
print_info: n_embd_head_k = 64
print_info: n_embd_head_v = 64
print_info: n_gqa = 1
print_info: n_embd_k_gqa = 768
print_info: n_embd_v_gqa = 768
print_info: f_norm_eps = 0.0e+00
print_info: f_norm_rms_eps = 1.0e-06
print_info: f_clamp_kqv = 0.0e+00
print_info: f_max_alibi_bias = 0.0e+00
print_info: f_logit_scale = 0.0e+00
print_info: f_attn_scale = 0.0e+00
print_info: n_ff = 3072
print_info: n_expert = 0
print_info: n_expert_used = 0
print_info: causal attn = 1
print_info: pooling type = 0
print_info: rope type = 0
print_info: rope scaling = linear
print_info: freq_base_train = 10000.0
print_info: freq_scale_train = 1
print_info: n_ctx_orig_yarn = 4096
print_info: rope_finetuned = unknown
print_info: model type = ?B
print_info: model params = 444.94 M
print_info: general.name = Tts
print_info: vocab type = BPE
print_info: n_vocab = 158626
print_info: n_merges = 151387
print_info: BOS token = 151644 '<|im_start|>'
print_info: EOS token = 151645 '<|im_end|>'
print_info: EOT token = 151645 '<|im_end|>'
print_info: UNK token = 128244 '<unk>'
print_info: PAD token = 151643 '<|endoftext|>'
print_info: LF token = 198 'Ċ'
print_info: FIM PRE token = 151659 '<|fim_prefix|>'
print_info: FIM SUF token = 151661 '<|fim_suffix|>'
print_info: FIM MID token = 151660 '<|fim_middle|>'
print_info: FIM PAD token = 151662 '<|fim_pad|>'
print_info: FIM REP token = 151663 '<|repo_name|>'
print_info: FIM SEP token = 151664 '<|file_sep|>'
print_info: EOG token = 151643 '<|endoftext|>'
print_info: EOG token = 151645 '<|im_end|>'
print_info: EOG token = 151662 '<|fim_pad|>'
print_info: EOG token = 151663 '<|repo_name|>'
print_info: EOG token = 151664 '<|file_sep|>'
print_info: max token length = 256
load_tensors: loading model tensors, this can take a while... (mmap = true)
load_tensors: skipping TTS tensor emb_code.0.weight (size = 20158464 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor emb_text.weight (size = 467140608 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear1.weight (size = 12582912 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear1.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear2.weight (size = 2359296 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear2.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear1.weight (size = 6291456 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear1.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear2.weight (size = 1179648 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear2.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor head_code.0.weight (size = 20158464 bytes) -- will be loaded separately
load_tensors: CPU_Mapped model buffer size = 592.48 MiB
..............................................................
llama_init_from_model: model default pooling_type is [0], but [-1] was specified
llama_context: constructing llama_context
llama_context: n_seq_max = 1
llama_context: n_ctx = 2048
llama_context: n_ctx_per_seq = 2048
llama_context: n_batch = 2048
llama_context: n_ubatch = 512
llama_context: causal_attn = 1
llama_context: flash_attn = auto
llama_context: kv_unified = false
llama_context: freq_base = 10000.0
llama_context: freq_scale = 1
llama_context: n_ctx_per_seq (2048) < n_ctx_train (4096) -- the full capacity of the model will not be utilized
llama_context: CPU output buffer size = 0.61 MiB
llama_kv_cache: CPU KV buffer size = 120.00 MiB
llama_kv_cache: size = 120.00 MiB ( 2048 cells, 20 layers, 1/1 seqs), K (f16): 60.00 MiB, V (f16): 60.00 MiB
llama_context: Flash Attention was auto, set to enabled
llama_context: CPU compute buffer size = 25.51 MiB
llama_context: graph nodes = 613
llama_context: graph splits = 1
vision_model_loader: model name:
vision_model_loader: description: image encoder for MiniCPM-V
vision_model_loader: GGUF version: 3
vision_model_loader: alignment: 32
vision_model_loader: n_tensors: 455
vision_model_loader: n_kv: 20
vision_ctx: vision using CPU backend
load_hparams: model_type: 0
load_hparams: n_embd: 1152
load_hparams: n_head: 16
load_hparams: n_ff: 4304
load_hparams: n_layer: 27
load_hparams: ffn_op: gelu
load_hparams: projection_dim: 0
--- vision hparams ---
load_hparams: image_size: 448
load_hparams: patch_size: 14
load_hparams: minicpmv_version: 100045
load_hparams: proj_scale_factor: 0
load_hparams: n_wa_pattern: 0
load_hparams: model size: 1044.36 MiB
load_hparams: metadata size: 0.16 MiB
load_tensors: ffn up/down are swapped
alloc_compute_meta: CPU compute buffer size = 100.30 MiB
init tts....init t2w....voc_hg2_model: CPU backend using 8 threads
audition_audio_preprocess: Decoded audio - sample_rate=16000, n_samples=32000
audition_get_mel_filters: Retrieved mel filters from model: 80 mel bins x 201 fft bins
audition_audio_preprocess: Using mel filters - n_mel=80, n_fft=201
audition_audio_preprocess: Generated 1 mel spectrogram chunk(s)
audition_audio_preprocess: Mel spectrogram ready - n_len=200, n_mel=80, total_size=16000
build_whisper: Whisper encoder graph built (projector output, pre-pooling)
audition_audio_batch_encode: Audio input data - n_step=200, n_mel=80, total_elements=16000
audition_audio_batch_encode: Before incrementing iter: input_frames=200, n_tokens=100, current_iter=0, current_total=0, new_total=100, max_tokens=1500
audition_audio_batch_encode: KV cache iter incremented to 1 (total_tokens=100, max_tokens=1500)
audition_audio_batch_encode: Final output shape: [4096, 20]
audition_audio_batch_encode: Final output: 20 tokens x 4096 dims
=== Model Paths ===
Base dir: /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf
LLM: /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/MiniCPM-o-4_5-Q4_K_M.gguf [OK]
Vision: /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/vision/MiniCPM-o-4_5-vision-F16.gguf [OK]
Audio: /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/audio/MiniCPM-o-4_5-audio-F16.gguf [OK]
TTS: /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-tts-F16.gguf [OK]
Projector: /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-projector-F16.gguf [OK]
===================
=== Initializing Omni Context ===
Media type: 2 (omni: audio+vision)
TTS enabled: yes
Context size: 2048
GPU layers: 0
Token2Wav device: cpu
Vision backend: metal
TTS bin dir: /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/tts
Ref audio: tools/omni/assets/default_ref_audio/default_ref_audio.wav
21:39:18.191 === omni_init start
21:39:18.191 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output
21:39:18.191 === omni_init: loading new LLM model
21:39:21.245 === omni_init: loading TTS model
21:39:21.245 TTS model: loading with n_gpu_layers=0
21:39:21.532 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05
21:39:21.532 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)...
21:39:23.312 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768]
21:39:23.335 TTS: head_code loaded, verifying first few values:
21:39:23.335 head_code_weight[0] = 0.01361084 (expect ~0.01385498)
21:39:23.335 head_code_weight[1] = -0.01660156 (expect ~-0.01647949)
21:39:23.335 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391)
21:39:23.415 TTS: weights loaded successfully
21:39:23.415 Projector: loading from /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-projector-F16.gguf
21:39:23.427 Projector: loaded successfully
21:39:23.428 === omni_init: loading APM model
21:39:23.988 APM: init from /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/audio/MiniCPM-o-4_5-audio-F16.gguf
21:39:24.952 Token2Wav: found models in /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/token2wav-gguf
21:39:24.952 Token2Wav: all model files found, initializing session...
21:39:24.952 Token2Wav: non-CUDA backend, vocoder using CPU for better performance
21:39:24.952 Token2Wav: using prompt_cache from /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf
21:39:26.392 Token2Wav: initialized successfully
21:39:26.392 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav
21:39:26.392 Token2Wav: 使用 C++ 实现
21:39:26.392 === omni_init success: ctx_llama = 0x5ca5bae08fe0
=== Running test case ===
Audio prefix: /home/zhout/project/edge_infer/scratch/minicpm_omni_case/fixture_
Count: 2
21:39:26.392 stream_prefill: n_past = 0
voice_clone_prompt = <|im_start|>system
模仿音频样本的音色并生成新的内容。
<|audio_start|>
assistant_prompt = <|audio_end|>你的任务是用这种声音模式来当一个助手。请认真、高质量地回复用户的问题。请用高自然度的方式和用户聊天。<|im_end|>
<|im_start|>user
21:39:26.392 system prompt ref_audio: /home/zhout/project/edge_infer/scratch/minicpm_omni_case/fixture_0000.wav
21:39:27.447 system prompt ref_audio embedding: n_pos=20
21:39:29.020 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远不会被滑动窗口删除
21:39:29.020 stream_prefill(index=0): system prompt 初始化完成,ref_audio 已在其中 prefill
21:39:29.020 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding)
21:39:29.020 n_past = 72
21:39:29.020
c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048
prefill 0 (audio+vision) : 2.62814 s
encode_image_with_vision_chunks: step 1 of 1 encoded in 3151.48 ms
encode_image_with_vision_chunks: all 1 chunks encoded in 3173.11 ms (grid: 1x1)
encode_image_with_vision_chunks: image encoded in 3173.12 ms by vision ( 3173.12 ms per chunk, 64 total tokens)
omni_image_embed_make_chunks_with_filename: created 1 vision chunks from /home/zhout/project/edge_infer/scratch/minicpm_omni_case/fixture_0001.jpg
stream_prefill: prefilled 1 vision chunks (64 tokens each)
audition_audio_preprocess: Decoded audio - sample_rate=16000, n_samples=32000
audition_get_mel_filters: Retrieved mel filters from model: 80 mel bins x 201 fft bins
audition_audio_preprocess: Using mel filters - n_mel=80, n_fft=201
audition_audio_preprocess: Generated 1 mel spectrogram chunk(s)
audition_audio_preprocess: Mel spectrogram ready - n_len=200, n_mel=80, total_size=16000
build_whisper: Whisper encoder graph built (projector output, pre-pooling)
audition_audio_batch_encode: Audio input data - n_step=200, n_mel=80, total_elements=16000
audition_audio_batch_encode: Before incrementing iter: input_frames=200, n_tokens=100, current_iter=1, current_total=100, new_total=200, max_tokens=1500
audition_audio_batch_encode: KV cache iter incremented to 2 (total_tokens=200, max_tokens=1500)
audition_audio_batch_encode: Final output shape: [4096, 20]
audition_audio_batch_encode: Final output: 20 tokens x 4096 dims
21:39:34.011 stream_prefill(index=1): processing user audio: /home/zhout/project/edge_infer/scratch/minicpm_omni_case/fixture_0001.wav
21:39:34.194 stream_prefill(index=1): user audio embedding: n_pos=20
21:39:34.984
c++ finish stream_prefill(index=1). n_past=161, n_keep=72, n_ctx=2048
prefill 1 (audio+vision) : 5.96389 s
21:39:34.984 📍 stream_decode 开始: n_past=161, n_keep=72, n_ctx=2048, duplex_mode=0
21:39:34.984 stream_decode: create tts thread (simplex mode)
21:39:34.985 stream_decode: create t2w thread
21:39:34.985 wait prefill done
21:39:34.985 📍 [单工TTS] 添加 assistant prompt: "<|im_end|>
<|im_start|>assistant
<think>
</think>
<|tts_bos|>", n_past=161
21:39:34.985 T2W thread (C++) started
<user>
<assistant>21:39:34.988 TTS: 创建单工模式输出目录: ./tools/omni/output/round_000
21:39:34.988 TTS thread started
21:39:35.402 📍 [单工TTS] assistant prompt 完成, n_past=171
21:39:35.403 LLM decode: max_tgt_len = 2048, n_predict = -1, n_ctx = 2048
21:39:36.418 LLM->TTS: text='现在可以开始做很多事啦,比如整理', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[99601 73670 55286 99190 99555 29826 104060 3837 101912 104387]
21:39:36.418 TTS<-LLM: chunk_idx=0, text='现在可以开始做很多事啦,比如整理', n_tokens=10, hidden_size=40960, token_ids=[99601 73670 55286 99190 99555 29826 104060 3837 101912 104387]
21:39:36.418 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
21:39:36.418 TTS: before empty check - response.empty=0, response='现在可以开始做很多事啦,比如整理', llm_finish=0
21:39:36.419 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
21:39:36.419 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
21:39:36.420 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
21:39:36.431 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt
21:39:36.431 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=10, tts_n_embd=768)
21:39:36.431 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=0, new_size=11)
21:39:36.431 TTS Simplex: first chunk - cleared KV cache
21:39:36.431 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer
21:39:36.466 TTS Simplex: prefill completed, n_past_tts=11
21:39:36.466 TTS Simplex: sampler created
21:39:36.466 TTS simplex: is_audio_bos=true (first audio token)
21:39:36.499 TTS Simplex Phase1: token 1/500: rel_id=1490
21:39:36.511 TTS Simplex Phase1: token 2/500: rel_id=4299
21:39:36.522 TTS Simplex Phase1: token 3/500: rel_id=4299
21:39:36.537 TTS Simplex Phase1: token 4/500: rel_id=4299
21:39:36.550 TTS Simplex Phase1: token 5/500: rel_id=6081
21:39:36.805 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25)
21:39:36.805 TTS Simplex Phase1: token 25/500: rel_id=5319
21:39:36.805 T2W线程(C++): 轮次切换 (-1 -> 0),更新输出目录
21:39:36.805 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav
21:39:37.134 TTS Simplex Phase1: EOS token at step 49
21:39:37.134 TTS Simplex: chunk 结束,tts_token_buffer 剩余 23 tokens (保留等下一个 chunk)
21:39:37.134 TTS Simplex: generated 48 audio tokens for chunk 0
21:39:37.134 TTS Simplex: chunk 0 first tokens: [1490 4299 4299 4299 6081 ], last tokens: [5105 6077 5348 4628 1947 ]
21:39:37.134 TTS Simplex: updated tts_n_past_accumulated=59, total_generated_tokens=48
21:39:37.626 LLM->TTS: text='房间、学习新东西、锻炼身体,或者', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[102327 5373 100134 16628 100413 5373 104904 101099 3837 100631]
21:39:37.626 TTS<-LLM: chunk_idx=1, text='房间、学习新东西、锻炼身体,或者', n_tokens=10, hidden_size=40960, token_ids=[102327 5373 100134 16628 100413 5373 104904 101099 3837 100631]
21:39:37.626 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
21:39:37.626 TTS: before empty check - response.empty=0, response='房间、学习新东西、锻炼身体,或者', llm_finish=0
21:39:37.626 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
21:39:37.626 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
21:39:37.627 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
21:39:37.640 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_1/merged_embeddings.txt
21:39:37.641 TTS Simplex: generating audio tokens for chunk 1 (n_tokens=10, tts_n_embd=768)
21:39:37.641 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=1, new_size=11)
21:39:37.641 TTS Simplex: chunk 1 - keeping KV cache, n_past_tts=59
21:39:37.662 TTS Simplex: prefill completed, n_past_tts=70
21:39:37.662 TTS Simplex: sampler created
21:39:37.675 TTS Simplex Phase1: token 1/500: rel_id=3645
21:39:37.688 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 2, buffer=25)
21:39:37.688 TTS Simplex Phase1: token 2/500: rel_id=5835
21:39:37.703 TTS Simplex Phase1: token 3/500: rel_id=5838
21:39:37.720 TTS Simplex Phase1: token 4/500: rel_id=1545
21:39:37.735 TTS Simplex Phase1: token 5/500: rel_id=2112
21:39:38.018 TTS Simplex Phase1: token 25/500: rel_id=4200
21:39:38.047 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 27, buffer=25)
21:39:38.400 TTS Simplex Phase1: token 50/500: rel_id=4677
21:39:38.427 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 52, buffer=25)
21:39:38.767 TTS Simplex Phase1: token 75/500: rel_id=2956
21:39:38.787 TTS Simplex Phase1: EOS token at step 77
21:39:38.787 TTS Simplex: chunk 结束,tts_token_buffer 剩余 24 tokens (保留等下一个 chunk)
21:39:38.787 TTS Simplex: generated 76 audio tokens for chunk 1
21:39:38.787 TTS Simplex: chunk 1 first tokens: [3645 5835 5838 1545 2112 ], last tokens: [747 2474 350 2956 5319 ]
21:39:38.787 TTS Simplex: updated tts_n_past_accumulated=146, total_generated_tokens=124
21:39:38.972 LLM->TTS: text='陪家人朋友聊聊天,感觉特别充实呢', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[100522 104271 99614 100281 105292 3837 100681 100654 108300 101036]
21:39:38.973 TTS<-LLM: chunk_idx=2, text='陪家人朋友聊聊天,感觉特别充实呢', n_tokens=10, hidden_size=40960, token_ids=[100522 104271 99614 100281 105292 3837 100681 100654 108300 101036]
21:39:38.973 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
21:39:38.973 TTS: before empty check - response.empty=0, response='陪家人朋友聊聊天,感觉特别充实呢', llm_finish=0
21:39:38.973 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
21:39:38.973 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
21:39:38.973 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
21:39:38.990 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_2/merged_embeddings.txt
21:39:38.990 TTS Simplex: generating audio tokens for chunk 2 (n_tokens=10, tts_n_embd=768)
21:39:38.990 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=2, new_size=11)
21:39:38.990 TTS Simplex: chunk 2 - keeping KV cache, n_past_tts=146
21:39:39.014 TTS Simplex: prefill completed, n_past_tts=157
21:39:39.014 TTS Simplex: sampler created
21:39:39.033 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 1, buffer=25)
21:39:39.034 TTS Simplex Phase1: token 1/500: rel_id=147
21:39:39.055 TTS Simplex Phase1: token 2/500: rel_id=4486
21:39:39.077 TTS Simplex Phase1: token 3/500: rel_id=5205
21:39:39.091 TTS Simplex Phase1: token 4/500: rel_id=6261
21:39:39.108 TTS Simplex Phase1: token 5/500: rel_id=2217
21:39:39.282 LLM: detected end token, set llm_generation_done=true
21:39:39.282 LLM->TTS: text='。', n_tokens=1, hidden_size=4096, n_embd=4096, token_ids=[1773]
Waiting for audio generation to complete...
21:39:39.282 📍 Decode 结束: n_past=203, 剩余空间=1845, 无需滑窗
21:39:39.282 📍 轮次 1 结束,记录边界于 n_past=203
21:39:39.440 TTS Simplex Phase1: token 25/500: rel_id=278
21:39:39.456 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 26, buffer=25)
21:39:39.675 📍 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=208
21:39:39.825 TTS Simplex Phase1: token 50/500: rel_id=4564
21:39:39.840 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 51, buffer=25)
21:39:40.084 TTS Simplex Phase1: EOS token at step 72
21:39:40.084 TTS Simplex: chunk 结束,tts_token_buffer 剩余 20 tokens (保留等下一个 chunk)
21:39:40.084 TTS Simplex: generated 71 audio tokens for chunk 2
21:39:40.084 TTS Simplex: chunk 2 first tokens: [147 4486 5205 6261 2217 ], last tokens: [734 1806 5568 1943 140 ]
21:39:40.084 TTS Simplex: updated tts_n_past_accumulated=228, total_generated_tokens=195
21:39:40.084 TTS<-LLM: chunk_idx=3, text='。', n_tokens=1, hidden_size=4096, token_ids=[1773]
21:39:40.084 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=1
21:39:40.084 TTS: before empty check - response.empty=0, response='。', llm_finish=1
[timing] call=0 tokens=28 final=0 token2mel=3206.482ms vocoder=368.622ms total=3575.116ms audio=20160
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_0.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_1.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_2.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_3.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_4.wav does not exist or is empty
TTS: no valid WAV files to merge
[timing] call=1 tokens=28 final=0 token2mel=1726.083ms vocoder=316.361ms total=2042.460ms audio=24000
[timing] call=2 tokens=28 final=0 token2mel=1677.117ms vocoder=315.853ms total=1992.984ms audio=24000
[timing] call=3 tokens=28 final=0 token2mel=1678.513ms vocoder=310.617ms total=1989.141ms audio=24000
[timing] call=4 tokens=28 final=0 token2mel=1688.458ms vocoder=306.011ms total=1994.479ms audio=24000
[timing] call=5 tokens=28 final=0 token2mel=1684.994ms vocoder=313.801ms total=1998.805ms audio=24000
[timing] call=6 tokens=28 final=0 token2mel=1695.620ms vocoder=323.250ms total=2018.882ms audio=24000
[timing] call=7 tokens=28 final=0 token2mel=1678.254ms vocoder=323.110ms total=2001.377ms audio=24000
[timing] call=8 tokens=28 final=0 token2mel=1699.355ms vocoder=314.693ms total=2014.060ms audio=24000
[timing] call=9 tokens=6 final=1 token2mel=1666.595ms vocoder=127.808ms total=1794.419ms audio=9600
Audio generation completed.
21:39:40.084 TTS: DEBUG before has_llm_data - token_ids.size=1, hidden_states.size=4096, n_embd=4096
21:39:40.084 TTS: has_llm_data=1, token_ids=1, hidden_states=4096, n_embd=4096, llm_finish=1
21:39:40.084 TTS: n_tokens_orig=1, n_tokens_filtered=1 (filtered 0 special tokens)
21:39:40.088 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_3/merged_embeddings.txt
21:39:40.088 TTS Simplex: generating audio tokens for chunk 3 (n_tokens=1, tts_n_embd=768)
21:39:40.088 TTS Simplex: 在 prefill 前添加 audio_bos (chunk_idx=3, new_size=2)
21:39:40.088 TTS Simplex: chunk 3 - keeping KV cache, n_past_tts=228
21:39:40.099 TTS Simplex: prefill completed, n_past_tts=230
21:39:40.099 TTS Simplex: sampler created
21:39:40.112 TTS Simplex Phase1: token 1/500: rel_id=147
21:39:40.126 TTS Simplex Phase1: token 2/500: rel_id=27
21:39:40.140 TTS Simplex Phase1: token 3/500: rel_id=2997
21:39:40.155 TTS Simplex Phase1: token 4/500: rel_id=4716
21:39:40.169 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 5, buffer=25)
21:39:40.169 TTS Simplex Phase1: token 5/500: rel_id=4842
21:39:40.257 TTS Simplex Phase1: EOS token at step 12
21:39:40.257 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed
21:39:40.257 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=241
21:39:40.268 TTS Simplex Phase2: text_eos_embed injected, n_past=242
21:39:40.277 TTS Simplex Phase2: audio_bos injected, n_past=243, starting final generation
21:39:40.380 🎉 首响时间 (First Audio Response): 5396ms
21:39:40.380 T2W线程: wav_0.wav | 0.84s audio | 3575.2ms inference | RTF=4.26 | t=5396ms
21:39:40.510 TTS Simplex Phase2: yield 25 tokens 到 T2W
21:39:40.556 TTS Simplex Phase2: EOS at step 23 (final end)
21:39:40.556 TTS Simplex: chunk 结束,tts_token_buffer 剩余 3 tokens (保留等下一个 chunk)
21:39:40.556 TTS Simplex: is_final_text_chunk=true, flush 剩余 3 tokens 从 tts_token_buffer
21:39:40.556 TTS Simplex: generated 33 audio tokens for chunk 3
21:39:40.556 TTS Simplex: chunk 3 first tokens: [147 27 2997 4716 4842 ], last tokens: [4299 4218 4299 4299 6082 ]
21:39:40.556 TTS Simplex: updated tts_n_past_accumulated=266, total_generated_tokens=228
21:39:40.556 TTS: finished processing all chunks
21:39:40.556 TTS: 单工模式轮次结束,下一轮 round_idx=1
21:39:40.557 TTS: sent is_final=true to T2W queue (turn end)
21:39:42.423 T2W线程: wav_1.wav | 1.00s audio | 2042.5ms inference | RTF=2.04 | t=7438ms
21:39:44.417 T2W线程: wav_2.wav | 1.00s audio | 1993.1ms inference | RTF=1.99 | t=9432ms
21:39:46.406 T2W线程: wav_3.wav | 1.00s audio | 1989.2ms inference | RTF=1.99 | t=11421ms
21:39:48.401 T2W线程: wav_4.wav | 1.00s audio | 1994.6ms inference | RTF=1.99 | t=13416ms
21:39:50.400 T2W线程: wav_5.wav | 1.00s audio | 1998.9ms inference | RTF=2.00 | t=15415ms
21:39:52.419 T2W线程: wav_6.wav | 1.00s audio | 2019.0ms inference | RTF=2.02 | t=17434ms
21:39:54.421 T2W线程: wav_7.wav | 1.00s audio | 2001.5ms inference | RTF=2.00 | t=19436ms
21:39:56.435 T2W线程: wav_8.wav | 1.00s audio | 2014.1ms inference | RTF=2.01 | t=21451ms
21:39:58.230 T2W线程: wav_9.wav | 0.40s audio | 1794.5ms inference | RTF=4.49 | t=23245ms
21:39:58.230 T2W线程: 写入结束标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=9)
21:39:58.230 T2W线程: 轮次结束后更新输出目录为 ./tools/omni/output/round_001/tts_wav
21:39:58.312 omni_stop_threads: stop signals sent
21:39:58.312 T2W(C++) 线程: 停止
llama_perf_context_print: load time = 17210.64 ms
llama_perf_context_print: prompt eval time = 9009.99 ms / 171 tokens ( 52.69 ms per token, 18.98 tokens per second)
llama_perf_context_print: eval time = 3867.69 ms / 32 runs ( 120.87 ms per token, 8.27 tokens per second)
llama_perf_context_print: total time = 40120.64 ms / 203 tokens
llama_perf_context_print: graphs reused = 33
Token2Wav (C++): session released
tts thread end
t2w thread end
Command being timed: "./build-cpu/bin/llama-omni-cli -m /home/zhout/project/edge_infer/models/MiniCPM-o-4_5-gguf/MiniCPM-o-4_5-Q4_K_M.gguf -ngl 0 -c 2048 --omni --t2w-device cpu --test /home/zhout/project/edge_infer/scratch/minicpm_omni_case/fixture_ 2"
User time (seconds): 109.54
System time (seconds): 8.79
Percent of CPU this job got: 290%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:40.70
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 13369604
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 2376316
Voluntary context switches: 1129
Involuntary context switches: 151
Swaps: 0
File system inputs: 1217296
File system outputs: 6528
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
@@ -0,0 +1,113 @@
{
"scope": "standalone MiniCPM-o 4.5 GGUF audio+image input to text+speech on WSL CPU",
"status": "scoped_complete_path_pass",
"quality": "synthetic red-square/tone response not established as semantically correct",
"model_revision": "db25077c33951fe163b42986fba0132e279872a2",
"artifacts": {
"MiniCPM-o-4_5-Q4_K_M.gguf": {
"bytes": 5026714400,
"sha256": "1237a97ee081b8abebc47aa7dad565701e8f5f904cdc92f6723ac4281bbc0932"
},
"audio/MiniCPM-o-4_5-audio-F16.gguf": {
"bytes": 660167904,
"sha256": "d5b188ac7feaf98e17175c3f9bd14bf269301bfd187439fdaa3e3a494fc32ef7"
},
"vision/MiniCPM-o-4_5-vision-F16.gguf": {
"bytes": 1095113184,
"sha256": "1453678cc4e4fe18de241952962e234f265cb8dda780773526103ab8ba82f421"
},
"tts/MiniCPM-o-4_5-tts-F16.gguf": {
"bytes": 1157244416,
"sha256": "c7be3748a863dd6966ae7eed42600b7f41ca67affb03729ff245247f0e5ea088"
},
"tts/MiniCPM-o-4_5-projector-F16.gguf": {
"bytes": 14948640,
"sha256": "4b1b5b377358a5e594a304ff6ea5d52df606a9ba7d886c4299d232f0c67dd1fd"
},
"token2wav-gguf/encoder.gguf": {
"bytes": 151339008,
"sha256": "7f8d265da594eaf5e1de2db8f5f1867dbcb0bb75ef5878fadf2952347116f4d0"
},
"token2wav-gguf/flow_matching.gguf": {
"bytes": 458250240,
"sha256": "eda6069f3edeb5dd3a87fbf2aedb2ddd1b46f3273926c4fcf09b24476a39cab8"
},
"token2wav-gguf/flow_extra.gguf": {
"bytes": 13663328,
"sha256": "c67611aa7d02500fe395a7798bf0bfdfb55c74d37ba93934ca74d82b4e63f78d"
},
"token2wav-gguf/hifigan2.gguf": {
"bytes": 83242816,
"sha256": "1b8b3bf5d8d3066aeee4324fdcdd41aefce170d0ee907645858de408d82835c2"
},
"token2wav-gguf/prompt_cache.gguf": {
"bytes": 211613152,
"sha256": "81fe6f541ebe0b67db06a1e395df928da47991dc9637c2cf47d6c59d5b979f2c"
}
},
"runtime_binary_sha256": "704ada01b2ac3378feca3201bcb303f17ce038cc447f7ef816f2bad67fe97111",
"input_image_sha256": "22c7ccea466a3f551c512045e6316c7597408d4e0a20205502f55784d977aa8d",
"input_audio_sha256": "cf4bb5cd9acbfbf67596d4a53310652b61ef4b7ede1d54eb03ef4882ca40223a",
"response_text": "现在可以开始做很多事啦,比如整理房间、学习新东西、锻炼身体,或者陪家人朋友聊聊天,感觉特别充实呢。",
"audio_chunks": [
{
"name": "wav_0.wav",
"frames": 20160,
"sha256": "1534770fa94ce4b9d928e76bcb3122793b0176d324a0fe2909d67de9d40058ab"
},
{
"name": "wav_1.wav",
"frames": 24000,
"sha256": "e49899651f34eae9cfd86ceb01820f246e0122127cd6f9f27f9547b72509b622"
},
{
"name": "wav_2.wav",
"frames": 24000,
"sha256": "a840c7e90b75f863b82091f7bd35c8dc87d2fdfe4f35b08de4b9a4be7917c03a"
},
{
"name": "wav_3.wav",
"frames": 24000,
"sha256": "5a304eeb2bfa3ae0e35ce57b370611586355a2ffa54afff07300a13a6d0881ee"
},
{
"name": "wav_4.wav",
"frames": 24000,
"sha256": "2a65cc741567ad722d1d553c4152b2fd24de62ae7aebe90ab12b7ccf4168952f"
},
{
"name": "wav_5.wav",
"frames": 24000,
"sha256": "2511ac60178cddf297b1be35db3e6c9becec0cd805438feadf271a316f97a61c"
},
{
"name": "wav_6.wav",
"frames": 24000,
"sha256": "c21ae914f1178e06c3d89a923b342df59e091dc587b128cd93d102f67dbc1d50"
},
{
"name": "wav_7.wav",
"frames": 24000,
"sha256": "0787df952fd371586f098a2ca6e987bbe90b1dfcd3f9342ffe8b70b737f4cd31"
},
{
"name": "wav_8.wav",
"frames": 24000,
"sha256": "08cccd338df55f8ae457d790f8199055fe600c38984be956ec7152432630071b"
},
{
"name": "wav_9.wav",
"frames": 9600,
"sha256": "4a4daba84c2bd339fba945bb1175a91e71ab2c6aae2c717b13989bf4ab93a461"
}
],
"audio_frames": 221760,
"audio_duration_s": 9.24,
"audio_rms_pcm16": 2452.440876561615,
"pcm_sha256": "372c4c7b453849eb1843b0477ce74d5db04a46cacc663ef01d02698f34a1a158",
"merged_wav_sha256": "7b8073169b1561905e539bfa0807cbfad7b59636d603c58c716cec2e76c33154",
"peak_rss_kib_from_time": 13369604,
"wall_clock_from_time": "0:40.70",
"sampled_process_profile": null,
"upstream_merge_name_mismatch": true
}
@@ -0,0 +1 @@
现在可以开始做很多事啦,比如整理
@@ -0,0 +1 @@
房间、学习新东西、锻炼身体,或者
@@ -0,0 +1 @@
陪家人朋友聊聊天,感觉特别充实呢
@@ -0,0 +1,3 @@
# WAV file generation timing log
# Format: chunk_index, elapsed_time_ms (since stream_decode start), file_size_bytes, request_duration_ms
# Time 0 is when stream_decode() function starts
@@ -0,0 +1 @@
现在可以开始做很多事啦,比如整理房间、学习新东西、锻炼身体,或者陪家人朋友聊聊天,感觉特别充实呢。
@@ -0,0 +1,18 @@
{
"scope": "Whisper Mandarin ASR proxy for generated speech; no input-task or perceptual-quality claim",
"asr_model": "openai/whisper-tiny",
"asr_revision": "169d4a4341b33bc18d8881c4b69c2e104e1cc0af",
"asr_weights_sha256": "7ebd0e69e78190ffe1438491fa05cc1f5c1aa3a4c4db3bc1723adbb551ea2395",
"transformers": "4.57.3",
"torch": "2.4.1+cpu",
"wav_sha256": "7b8073169b1561905e539bfa0807cbfad7b59636d603c58c716cec2e76c33154",
"wav_duration_s": 9.24,
"reference_text": "现在可以开始做很多事啦,比如整理房间、学习新东西、锻炼身体,或者陪家人朋友聊聊天,感觉特别充实呢。",
"transcript": "現在可以開始做很多事啦比如整理房間,學習新東西,斷領身體或者陪家人朋友聊天感覺特別充實啦",
"asr_segments_25_s": 1,
"character_error_rate_raw": 0.32558139534883723,
"character_error_rate_t2s_normalized": 0.09302325581395349,
"normalization": "OpenCC 0.1.7 t2s; punctuation ignored",
"load_s": 0.6843268999364227,
"inference_s": 1.35040409991052
}
@@ -0,0 +1,18 @@
{
"scope": "Whisper Mandarin ASR proxy for generated speech; no input-task or perceptual-quality claim",
"asr_model": "openai/whisper-tiny",
"asr_revision": "169d4a4341b33bc18d8881c4b69c2e104e1cc0af",
"asr_weights_sha256": "7ebd0e69e78190ffe1438491fa05cc1f5c1aa3a4c4db3bc1723adbb551ea2395",
"transformers": "4.57.3",
"torch": "2.4.1+cpu",
"wav_sha256": "7b8073169b1561905e539bfa0807cbfad7b59636d603c58c716cec2e76c33154",
"wav_duration_s": 9.24,
"reference_text": "���ڿ��Կ�ʼ���ܶ������������������䡢ѧϰ�������������壬������������������죬�о��ر��ʵ�ء�",
"transcript": "�F�ڿ����_ʼ���ܶ����������������g,�W���–|��,���I���w�������������������X�؄e�䌍��",
"asr_segments_25_s": 1,
"character_error_rate_raw": 0.32558139534883723,
"character_error_rate_t2s_normalized": 0.09302325581395349,
"normalization": "OpenCC 0.1.7 t2s; punctuation ignored",
"load_s": 0.6843268999364227,
"inference_s": 1.35040409991052
}
@@ -0,0 +1,24 @@
# Native Windows CPU MiniCPM-o 4.5 GGUF scoped complete path
On Windows 11 build 26200, the Ryzen AI 9 HX 370 CPU ran one **standalone** combined synthetic JPEG+16 kHz WAV input through MiniCPM-o language/vision/audio/TTS/Token2Wav to nonempty text and complete speech. This is a scoped functional path (P for this fixture), not an Omni StageRuntime/StagePool integration, an AMD Radeon/NPU result, or a semantic-quality qualification. Native Windows vLLM CPU attention operators remain unavailable in the installed wheel; this C++ backend is a separate route.
The complete ten-file Q4_K_M/F16 set is [openbmb/MiniCPM-o-4_5-gguf](https://huggingface.co/openbmb/MiniCPM-o-4_5-gguf/tree/db25077c33951fe163b42986fba0132e279872a2) revision `db25077c33951fe163b42986fba0132e279872a2`. The C++ source is [tc-mb/llama.cpp-omni](https://github.com/tc-mb/llama.cpp-omni/tree/5202b7b2f4d11f50b9f996161e7a2f8b8571b890) at `5202b7b2f4d11f50b9f996161e7a2f8b8571b890`, cross-built with MinGW-w64 GCC 13-posix, x86-64-v3, CMake/Ninja Release, CUDA/Vulkan/OpenMP off and [this patch](../minicpmo_cpp_cpu/llama_cpp_omni_cpu.patch). The patch adds explicit CPU Token2Wav selection, portable Windows compatibility and a configurable bounded wait that reports failure if speech is incomplete. [The verification report](full_report.json) pins all ten Windows-copy GGUF byte counts and SHA256 hashes and the exact executable hash; the files match the [WSL-copy report](../minicpmo_cpp_cpu/minicpm_omni_cpu_full_report.json). The GGUF weights and executable remain outside Git.
| Observation | Raw evidence |
|---|---|
| The log reports zero GPU layers, CPU vision and CPU Token2Wav/vocoder placement. Index 0 supplied the system/reference-audio prompt; index 1 actually passed a 448×448 red-square JPEG and 2 s/440 Hz tone through image and audio prefill. | [combined log](full.combined.log), [image](fixture_0001.jpg), [tone](fixture_0001.wav), [reference tone](fixture_0000.wav) |
| The decoder returned [nonempty text](response_text.txt); the audio completion marker was present. The verifier found 50 gap-free, nonzero mono 24 kHz PCM16 [WAV chunks](round_000/tts_wav/), 1,179,840 total frames/49.16 s, RMS 2,572.52 PCM16, and assembled their original PCM into a [single WAV](full_merged.wav). | [verification report](full_report.json), [raw chunks](round_000/tts_wav/), [debug text](round_000/llm_debug/) |
| One cold process took 137.34 s. At 100 ms intervals, maximum sampled RSS/private bytes were 13.10/13.31 GB; these are observed maxima, not proven loading peaks. The 49.16 s speech took longer than real time. This is one observation, with no warmup distribution. | [process profile](full.profile.json), [raw timing/stderr](full.stderr.log) |
| Pinned CPU `openai/whisper-tiny` recognized the generated Mandarin speech with 13.59% CJK/alphanumeric character error against the model's **own** text after OpenCC traditional-to-simplified normalization (25.24% before normalization), across two 25 s ASR windows. This is only an intelligibility proxy. | [ASR report](speech_asr_proxy.json), [ASR log](speech_asr_proxy.log), [probe](../../../../experiments/probe_tts_asr_cjk.py) |
The response was a generic story about visiting the Arctic rather than a description of the square or tone. The CLI fixture did not supply an explicit describe-the-input instruction, so this observation cannot establish grounded task quality. The runtime's optional merger still looked for `tts_output_chunk_N.wav` while the vocoder wrote `wav_N.wav`, and it attempted merging before all audio was ready. [The verifier](../../../../experiments/verify_minicpm_cpp_output.py) assembled the original PCM only after checking the completion flag and all chunks; this does not provide live playable streaming. The [first native attempt](../minicpmo_cpp_windows_cpu_attempt1/README.md) exited 0 with partial audio because of a 120 s wait; it is retained as a failed run. Omni admission/state/cancellation, real image/audio quality, repeat latency, loading peak and sustained power/thermal behavior remain open.
Reproduce from the pinned C++ checkout after applying the patch and obtaining the pinned GGUF set. Cross-build using `-DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=x86_64`, MinGW-w64 `gcc-posix/g++-posix`, `-DCMAKE_C_FLAGS=-march=x86-64-v3 -DCMAKE_CXX_FLAGS=-march=x86-64-v3`, `-DGGML_CUDA=OFF -DGGML_VULKAN=OFF -DGGML_OPENMP=OFF -DLLAMA_CURL=OFF -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_EXAMPLES=ON`, then build `llama-omni-cli`. The native run used:
```powershell
llama-omni-cli.exe -m C:\path\to\MiniCPM-o-4_5-Q4_K_M.gguf `
-ngl 0 -c 2048 --omni --t2w-device cpu --t2w-wait-seconds 900 `
--ref-audio C:\path\to\default_ref_audio.wav --test C:\path\to\fixture_ 2
```
The fixture requires `fixture_0000.wav` for the reference/system prompt and `fixture_0001.wav` plus `fixture_0001.jpg` for the user index. The result is a single cold run; no p50/p95 is implied.
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

@@ -0,0 +1,29 @@
{
"command": [
"C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3\\llama-omni-cli.exe",
"-m",
"C:\\Users\\zhout\\w2\\models\\MiniCPM-o-4_5-gguf\\MiniCPM-o-4_5-Q4_K_M.gguf",
"-ngl",
"0",
"-c",
"2048",
"--omni",
"--t2w-device",
"cpu",
"--t2w-wait-seconds",
"900",
"--ref-audio",
"C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3\\default_ref_audio.wav",
"--test",
"C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3\\fixture_",
"2"
],
"cwd": "C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3",
"exit_code": 0,
"wall_s": 137.33765170001425,
"memory_sample_interval_ms": 100,
"memory_samples": 1365,
"peak_sampled_rss_bytes": 13104742400,
"peak_sampled_private_bytes": 13314060288,
"measurement_note": "sampled process values, not guaranteed loading peaks"
}
@@ -0,0 +1,393 @@
build: 64 (5202b7b) with x86_64-w64-mingw32-gcc-posix (GCC) 13-posix for x86_64-w64-mingw32
llama_model_loader: loaded meta data with 27 key-value pairs and 399 tensors from C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf\MiniCPM-o-4_5-Q4_K_M.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = qwen3
llama_model_loader: - kv 1: general.type str = model
llama_model_loader: - kv 2: general.name str = Llm
llama_model_loader: - kv 3: general.size_label str = 8.2B
llama_model_loader: - kv 4: qwen3.block_count u32 = 36
llama_model_loader: - kv 5: qwen3.context_length u32 = 40960
llama_model_loader: - kv 6: qwen3.embedding_length u32 = 4096
llama_model_loader: - kv 7: qwen3.feed_forward_length u32 = 12288
llama_model_loader: - kv 8: qwen3.attention.head_count u32 = 32
llama_model_loader: - kv 9: qwen3.attention.head_count_kv u32 = 8
llama_model_loader: - kv 10: qwen3.rope.freq_base f32 = 1000000.000000
llama_model_loader: - kv 11: qwen3.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 12: qwen3.attention.key_length u32 = 128
llama_model_loader: - kv 13: qwen3.attention.value_length u32 = 128
llama_model_loader: - kv 14: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 15: tokenizer.ggml.pre str = qwen2
llama_model_loader: - kv 16: tokenizer.ggml.tokens arr[str,151748] = ["!", "\"", "#", "$", "%", "&", "'", ...
llama_model_loader: - kv 17: tokenizer.ggml.token_type arr[i32,151748] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv 18: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv 19: tokenizer.ggml.bos_token_id u32 = 151644
llama_model_loader: - kv 20: tokenizer.ggml.eos_token_id u32 = 151645
llama_model_loader: - kv 21: tokenizer.ggml.unknown_token_id u32 = 128244
llama_model_loader: - kv 22: tokenizer.ggml.padding_token_id u32 = 151643
llama_model_loader: - kv 23: tokenizer.ggml.add_bos_token bool = false
llama_model_loader: - kv 24: tokenizer.chat_template str = {%- if tools %}\n {{- '<|im_start|>...
llama_model_loader: - kv 25: general.quantization_version u32 = 2
llama_model_loader: - kv 26: general.file_type u32 = 15
llama_model_loader: - type f32: 145 tensors
llama_model_loader: - type q4_K: 217 tensors
llama_model_loader: - type q6_K: 37 tensors
print_info: file format = GGUF V3 (latest)
print_info: file type = Q4_K - Medium
print_info: file size = 4.68 GiB (4.90 BPW)
load: printing all EOG tokens:
load: - 151643 ('<|endoftext|>')
load: - 151645 ('<|im_end|>')
load: - 151662 ('<|fim_pad|>')
load: - 151663 ('<|repo_name|>')
load: - 151664 ('<|file_sep|>')
load: special tokens cache size = 106
load: token to piece cache size = 0.9319 MB
print_info: arch = qwen3
print_info: vocab_only = 0
print_info: n_ctx_train = 40960
print_info: n_embd = 4096
print_info: n_layer = 36
print_info: n_head = 32
print_info: n_head_kv = 8
print_info: n_rot = 128
print_info: n_swa = 0
print_info: is_swa_any = 0
print_info: n_embd_head_k = 128
print_info: n_embd_head_v = 128
print_info: n_gqa = 4
print_info: n_embd_k_gqa = 1024
print_info: n_embd_v_gqa = 1024
print_info: f_norm_eps = 0.0e+00
print_info: f_norm_rms_eps = 1.0e-06
print_info: f_clamp_kqv = 0.0e+00
print_info: f_max_alibi_bias = 0.0e+00
print_info: f_logit_scale = 0.0e+00
print_info: f_attn_scale = 0.0e+00
print_info: n_ff = 12288
print_info: n_expert = 0
print_info: n_expert_used = 0
print_info: causal attn = 1
print_info: pooling type = -1
print_info: rope type = 2
print_info: rope scaling = linear
print_info: freq_base_train = 1000000.0
print_info: freq_scale_train = 1
print_info: n_ctx_orig_yarn = 40960
print_info: rope_finetuned = unknown
print_info: model type = 8B
print_info: model params = 8.19 B
print_info: general.name = Llm
print_info: vocab type = BPE
print_info: n_vocab = 151748
print_info: n_merges = 151387
print_info: BOS token = 151644 '<|im_start|>'
print_info: EOS token = 151645 '<|im_end|>'
print_info: EOT token = 151645 '<|im_end|>'
print_info: UNK token = 128244 '<unk>'
print_info: PAD token = 151643 '<|endoftext|>'
print_info: LF token = 198 'Ċ'
print_info: FIM PRE token = 151659 '<|fim_prefix|>'
print_info: FIM SUF token = 151661 '<|fim_suffix|>'
print_info: FIM MID token = 151660 '<|fim_middle|>'
print_info: FIM PAD token = 151662 '<|fim_pad|>'
print_info: FIM REP token = 151663 '<|repo_name|>'
print_info: FIM SEP token = 151664 '<|file_sep|>'
print_info: EOG token = 151643 '<|endoftext|>'
print_info: EOG token = 151645 '<|im_end|>'
print_info: EOG token = 151662 '<|fim_pad|>'
print_info: EOG token = 151663 '<|repo_name|>'
print_info: EOG token = 151664 '<|file_sep|>'
print_info: max token length = 256
load_tensors: loading model tensors, this can take a while... (mmap = true)
load_tensors: CPU_REPACK model buffer size = 3199.50 MiB
load_tensors: CPU_Mapped model buffer size = 4761.17 MiB
.....................................................................................
llama_context: constructing llama_context
llama_context: n_seq_max = 1
llama_context: n_ctx = 2048
llama_context: n_ctx_per_seq = 2048
llama_context: n_batch = 2048
llama_context: n_ubatch = 512
llama_context: causal_attn = 1
llama_context: flash_attn = auto
llama_context: kv_unified = false
llama_context: freq_base = 1000000.0
llama_context: freq_scale = 1
llama_context: n_ctx_per_seq (2048) < n_ctx_train (40960) -- the full capacity of the model will not be utilized
llama_context: CPU output buffer size = 0.58 MiB
llama_kv_cache: CPU KV buffer size = 288.00 MiB
llama_kv_cache: size = 288.00 MiB ( 2048 cells, 36 layers, 1/1 seqs), K (f16): 144.00 MiB, V (f16): 144.00 MiB
llama_context: Flash Attention was auto, set to enabled
llama_context: CPU compute buffer size = 304.38 MiB
llama_context: graph nodes = 1267
llama_context: graph splits = 1
llama_model_loader: loaded meta data with 30 key-value pairs and 193 tensors from C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-tts-F16.gguf (version GGUF V3 (latest))
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = llama
llama_model_loader: - kv 1: general.type str = model
llama_model_loader: - kv 2: general.name str = Tts
llama_model_loader: - kv 3: general.size_label str = 445M
llama_model_loader: - kv 4: llama.block_count u32 = 20
llama_model_loader: - kv 5: llama.context_length u32 = 4096
llama_model_loader: - kv 6: llama.embedding_length u32 = 768
llama_model_loader: - kv 7: llama.feed_forward_length u32 = 3072
llama_model_loader: - kv 8: llama.attention.head_count u32 = 12
llama_model_loader: - kv 9: llama.attention.head_count_kv u32 = 12
llama_model_loader: - kv 10: llama.rope.freq_base f32 = 10000.000000
llama_model_loader: - kv 11: llama.attention.layer_norm_rms_epsilon f32 = 0.000001
llama_model_loader: - kv 12: llama.attention.key_length u32 = 64
llama_model_loader: - kv 13: llama.attention.value_length u32 = 64
llama_model_loader: - kv 14: general.file_type u32 = 1
llama_model_loader: - kv 15: llama.vocab_size u32 = 158626
llama_model_loader: - kv 16: llama.rope.dimension_count u32 = 64
llama_model_loader: - kv 17: general.quantization_version u32 = 2
llama_model_loader: - kv 18: tokenizer.ggml.model str = gpt2
llama_model_loader: - kv 19: tokenizer.ggml.pre str = qwen2
llama_model_loader: - kv 20: tokenizer.ggml.tokens arr[str,158626] = ["!", "\"", "#", "$", "%", "&", "'", ...
llama_model_loader: - kv 21: tokenizer.ggml.token_type arr[i32,158626] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
llama_model_loader: - kv 22: tokenizer.ggml.merges arr[str,151387] = ["Ġ Ġ", "ĠĠ ĠĠ", "i n", "Ġ t",...
llama_model_loader: - kv 23: tokenizer.ggml.bos_token_id u32 = 151644
llama_model_loader: - kv 24: tokenizer.ggml.eos_token_id u32 = 151645
llama_model_loader: - kv 25: tokenizer.ggml.unknown_token_id u32 = 128244
llama_model_loader: - kv 26: tokenizer.ggml.padding_token_id u32 = 151643
llama_model_loader: - kv 27: tokenizer.ggml.add_bos_token bool = false
llama_model_loader: - kv 28: tokenizer.chat_template str = {%- if tools %}\n {{- '<|im_start|>...
llama_model_loader: - kv 29: tokenizer.ggml.add_space_prefix bool = false
llama_model_loader: - type f32: 50 tensors
llama_model_loader: - type f16: 143 tensors
print_info: file format = GGUF V3 (latest)
print_info: file type = F16
print_info: file size = 1.07 GiB (20.70 BPW)
load: printing all EOG tokens:
load: - 151643 ('<|endoftext|>')
load: - 151645 ('<|im_end|>')
load: - 151662 ('<|fim_pad|>')
load: - 151663 ('<|repo_name|>')
load: - 151664 ('<|file_sep|>')
load: special tokens cache size = 106
load: token to piece cache size = 0.9319 MB
print_info: arch = llama
print_info: vocab_only = 0
print_info: n_ctx_train = 4096
print_info: n_embd = 768
print_info: n_layer = 20
print_info: n_head = 12
print_info: n_head_kv = 12
print_info: n_rot = 64
print_info: n_swa = 0
print_info: is_swa_any = 0
print_info: n_embd_head_k = 64
print_info: n_embd_head_v = 64
print_info: n_gqa = 1
print_info: n_embd_k_gqa = 768
print_info: n_embd_v_gqa = 768
print_info: f_norm_eps = 0.0e+00
print_info: f_norm_rms_eps = 1.0e-06
print_info: f_clamp_kqv = 0.0e+00
print_info: f_max_alibi_bias = 0.0e+00
print_info: f_logit_scale = 0.0e+00
print_info: f_attn_scale = 0.0e+00
print_info: n_ff = 3072
print_info: n_expert = 0
print_info: n_expert_used = 0
print_info: causal attn = 1
print_info: pooling type = 0
print_info: rope type = 0
print_info: rope scaling = linear
print_info: freq_base_train = 10000.0
print_info: freq_scale_train = 1
print_info: n_ctx_orig_yarn = 4096
print_info: rope_finetuned = unknown
print_info: model type = ?B
print_info: model params = 444.94 M
print_info: general.name = Tts
print_info: vocab type = BPE
print_info: n_vocab = 158626
print_info: n_merges = 151387
print_info: BOS token = 151644 '<|im_start|>'
print_info: EOS token = 151645 '<|im_end|>'
print_info: EOT token = 151645 '<|im_end|>'
print_info: UNK token = 128244 '<unk>'
print_info: PAD token = 151643 '<|endoftext|>'
print_info: LF token = 198 'Ċ'
print_info: FIM PRE token = 151659 '<|fim_prefix|>'
print_info: FIM SUF token = 151661 '<|fim_suffix|>'
print_info: FIM MID token = 151660 '<|fim_middle|>'
print_info: FIM PAD token = 151662 '<|fim_pad|>'
print_info: FIM REP token = 151663 '<|repo_name|>'
print_info: FIM SEP token = 151664 '<|file_sep|>'
print_info: EOG token = 151643 '<|endoftext|>'
print_info: EOG token = 151645 '<|im_end|>'
print_info: EOG token = 151662 '<|fim_pad|>'
print_info: EOG token = 151663 '<|repo_name|>'
print_info: EOG token = 151664 '<|file_sep|>'
print_info: max token length = 256
load_tensors: loading model tensors, this can take a while... (mmap = true)
load_tensors: skipping TTS tensor emb_code.0.weight (size = 20158464 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor emb_text.weight (size = 467140608 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear1.weight (size = 12582912 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear1.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear2.weight (size = 2359296 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_semantic.linear2.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear1.weight (size = 6291456 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear1.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear2.weight (size = 1179648 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor projector_spk.linear2.bias (size = 3072 bytes) -- will be loaded separately
load_tensors: skipping TTS tensor head_code.0.weight (size = 20158464 bytes) -- will be loaded separately
load_tensors: CPU_Mapped model buffer size = 592.48 MiB
..............................................................
llama_init_from_model: model default pooling_type is [0], but [-1] was specified
llama_context: constructing llama_context
llama_context: n_seq_max = 1
llama_context: n_ctx = 2048
llama_context: n_ctx_per_seq = 2048
llama_context: n_batch = 2048
llama_context: n_ubatch = 512
llama_context: causal_attn = 1
llama_context: flash_attn = auto
llama_context: kv_unified = false
llama_context: freq_base = 10000.0
llama_context: freq_scale = 1
llama_context: n_ctx_per_seq (2048) < n_ctx_train (4096) -- the full capacity of the model will not be utilized
llama_context: CPU output buffer size = 0.61 MiB
llama_kv_cache: CPU KV buffer size = 120.00 MiB
llama_kv_cache: size = 120.00 MiB ( 2048 cells, 20 layers, 1/1 seqs), K (f16): 60.00 MiB, V (f16): 60.00 MiB
llama_context: Flash Attention was auto, set to enabled
llama_context: CPU compute buffer size = 25.51 MiB
llama_context: graph nodes = 613
llama_context: graph splits = 1
vision_model_loader: model name:
vision_model_loader: description: image encoder for MiniCPM-V
vision_model_loader: GGUF version: 3
vision_model_loader: alignment: 32
vision_model_loader: n_tensors: 455
vision_model_loader: n_kv: 20
vision_ctx: vision using CPU backend
load_hparams: model_type: 0
load_hparams: n_embd: 1152
load_hparams: n_head: 16
load_hparams: n_ff: 4304
load_hparams: n_layer: 27
load_hparams: ffn_op: gelu
load_hparams: projection_dim: 0
--- vision hparams ---
load_hparams: image_size: 448
load_hparams: patch_size: 14
load_hparams: minicpmv_version: 100045
load_hparams: proj_scale_factor: 0
load_hparams: n_wa_pattern: 0
load_hparams: model size: 1044.36 MiB
load_hparams: metadata size: 0.16 MiB
load_tensors: ffn up/down are swapped
alloc_compute_meta: CPU compute buffer size = 100.30 MiB
init tts....init t2w....voc_hg2_model: CPU backend using 8 threads
audition_audio_preprocess: Decoded audio - sample_rate=16000, n_samples=32000
audition_get_mel_filters: Retrieved mel filters from model: 80 mel bins x 201 fft bins
audition_audio_preprocess: Using mel filters - n_mel=80, n_fft=201
audition_audio_preprocess: Generated 1 mel spectrogram chunk(s)
audition_audio_preprocess: Mel spectrogram ready - n_len=200, n_mel=80, total_size=16000
build_whisper: Whisper encoder graph built (projector output, pre-pooling)
audition_audio_batch_encode: Audio input data - n_step=200, n_mel=80, total_elements=16000
audition_audio_batch_encode: Before incrementing iter: input_frames=200, n_tokens=100, current_iter=0, current_total=0, new_total=100, max_tokens=1500
audition_audio_batch_encode: KV cache iter incremented to 1 (total_tokens=100, max_tokens=1500)
audition_audio_batch_encode: Final output shape: [4096, 20]
audition_audio_batch_encode: Final output: 20 tokens x 4096 dims
encode_image_with_vision_chunks: step 1 of 1 encoded in 3538.25 ms
encode_image_with_vision_chunks: all 1 chunks encoded in 3560.67 ms (grid: 1x1)
encode_image_with_vision_chunks: image encoded in 3560.68 ms by vision ( 3560.68 ms per chunk, 64 total tokens)
omni_image_embed_make_chunks_with_filename: created 1 vision chunks from C:\Users\zhout\w2\minicpmo_cpp_cpu_v3\fixture_0001.jpg
stream_prefill: prefilled 1 vision chunks (64 tokens each)
audition_audio_preprocess: Decoded audio - sample_rate=16000, n_samples=32000
audition_get_mel_filters: Retrieved mel filters from model: 80 mel bins x 201 fft bins
audition_audio_preprocess: Using mel filters - n_mel=80, n_fft=201
audition_audio_preprocess: Generated 1 mel spectrogram chunk(s)
audition_audio_preprocess: Mel spectrogram ready - n_len=200, n_mel=80, total_size=16000
build_whisper: Whisper encoder graph built (projector output, pre-pooling)
audition_audio_batch_encode: Audio input data - n_step=200, n_mel=80, total_elements=16000
audition_audio_batch_encode: Before incrementing iter: input_frames=200, n_tokens=100, current_iter=1, current_total=100, new_total=200, max_tokens=1500
audition_audio_batch_encode: KV cache iter incremented to 2 (total_tokens=200, max_tokens=1500)
audition_audio_batch_encode: Final output shape: [4096, 20]
audition_audio_batch_encode: Final output: 20 tokens x 4096 dims
<user>
<assistant>[timing] call=0 tokens=28 final=0 token2mel=3008.347ms vocoder=441.612ms total=3449.977ms audio=20160
[timing] call=1 tokens=28 final=0 token2mel=2867.322ms vocoder=514.727ms total=3382.072ms audio=24000
[timing] call=2 tokens=28 final=0 token2mel=2966.215ms vocoder=499.383ms total=3465.615ms audio=24000
[timing] call=3 tokens=28 final=0 token2mel=2871.007ms vocoder=487.908ms total=3358.955ms audio=24000
[timing] call=4 tokens=28 final=0 token2mel=2949.518ms vocoder=501.990ms total=3451.537ms audio=24000
[timing] call=5 tokens=28 final=0 token2mel=2706.893ms vocoder=468.788ms total=3175.696ms audio=24000
Waiting for audio generation to complete...
[timing] call=6 tokens=28 final=0 token2mel=2419.876ms vocoder=402.004ms total=2821.890ms audio=24000
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_0.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_1.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_2.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_3.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_4.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_5.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_6.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_7.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_8.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_9.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_10.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_11.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_12.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_13.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_14.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_15.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_16.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_17.wav does not exist or is empty
TTS: chunk file ./tools/omni/output/round_000/tts_wav/tts_output_chunk_18.wav does not exist or is empty
TTS: no valid WAV files to merge
[timing] call=7 tokens=28 final=0 token2mel=1998.322ms vocoder=380.397ms total=2378.729ms audio=24000
[timing] call=8 tokens=28 final=0 token2mel=1851.460ms vocoder=373.980ms total=2225.451ms audio=24000
[timing] call=9 tokens=28 final=0 token2mel=1855.032ms vocoder=376.188ms total=2231.231ms audio=24000
[timing] call=10 tokens=28 final=0 token2mel=1839.380ms vocoder=373.340ms total=2212.733ms audio=24000
[timing] call=11 tokens=28 final=0 token2mel=1832.723ms vocoder=369.453ms total=2202.187ms audio=24000
[timing] call=12 tokens=28 final=0 token2mel=1839.659ms vocoder=373.948ms total=2213.620ms audio=24000
[timing] call=13 tokens=28 final=0 token2mel=1825.662ms vocoder=377.159ms total=2202.833ms audio=24000
[timing] call=14 tokens=28 final=0 token2mel=1834.524ms vocoder=378.257ms total=2212.792ms audio=24000
[timing] call=15 tokens=28 final=0 token2mel=1827.935ms vocoder=376.774ms total=2204.721ms audio=24000
[timing] call=16 tokens=28 final=0 token2mel=1819.256ms vocoder=371.231ms total=2190.499ms audio=24000
[timing] call=17 tokens=28 final=0 token2mel=1836.480ms vocoder=374.681ms total=2211.173ms audio=24000
[timing] call=18 tokens=28 final=0 token2mel=1826.588ms vocoder=372.420ms total=2199.018ms audio=24000
[timing] call=19 tokens=28 final=0 token2mel=1862.405ms vocoder=369.565ms total=2231.984ms audio=24000
[timing] call=20 tokens=28 final=0 token2mel=1824.354ms vocoder=379.717ms total=2204.082ms audio=24000
[timing] call=21 tokens=28 final=0 token2mel=1828.966ms vocoder=374.241ms total=2203.219ms audio=24000
[timing] call=22 tokens=28 final=0 token2mel=1830.597ms vocoder=376.619ms total=2207.228ms audio=24000
[timing] call=23 tokens=28 final=0 token2mel=1862.567ms vocoder=382.669ms total=2245.247ms audio=24000
[timing] call=24 tokens=28 final=0 token2mel=1832.274ms vocoder=384.729ms total=2217.013ms audio=24000
[timing] call=25 tokens=28 final=0 token2mel=1827.821ms vocoder=374.201ms total=2202.034ms audio=24000
[timing] call=26 tokens=28 final=0 token2mel=1837.246ms vocoder=376.361ms total=2213.620ms audio=24000
[timing] call=27 tokens=28 final=0 token2mel=1829.673ms vocoder=378.150ms total=2207.835ms audio=24000
[timing] call=28 tokens=28 final=0 token2mel=1838.582ms vocoder=375.693ms total=2214.287ms audio=24000
[timing] call=29 tokens=28 final=0 token2mel=1837.139ms vocoder=374.800ms total=2211.950ms audio=24000
[timing] call=30 tokens=28 final=0 token2mel=1818.072ms vocoder=377.411ms total=2195.493ms audio=24000
[timing] call=31 tokens=28 final=0 token2mel=1831.503ms vocoder=372.541ms total=2204.056ms audio=24000
[timing] call=32 tokens=28 final=0 token2mel=1847.361ms vocoder=373.726ms total=2221.098ms audio=24000
[timing] call=33 tokens=28 final=0 token2mel=1841.079ms vocoder=378.310ms total=2219.402ms audio=24000
[timing] call=34 tokens=28 final=0 token2mel=1828.232ms vocoder=383.369ms total=2211.613ms audio=24000
[timing] call=35 tokens=28 final=0 token2mel=1823.123ms vocoder=380.919ms total=2204.053ms audio=24000
[timing] call=36 tokens=28 final=0 token2mel=1828.180ms vocoder=373.026ms total=2201.218ms audio=24000
[timing] call=37 tokens=28 final=0 token2mel=1819.845ms vocoder=377.691ms total=2197.552ms audio=24000
[timing] call=38 tokens=28 final=0 token2mel=1817.171ms vocoder=376.247ms total=2193.428ms audio=24000
[timing] call=39 tokens=28 final=0 token2mel=1825.358ms vocoder=378.877ms total=2204.246ms audio=24000
[timing] call=40 tokens=28 final=0 token2mel=1820.798ms vocoder=369.805ms total=2190.615ms audio=24000
[timing] call=41 tokens=28 final=0 token2mel=1827.390ms vocoder=375.167ms total=2202.568ms audio=24000
[timing] call=42 tokens=28 final=0 token2mel=1828.504ms vocoder=380.181ms total=2208.697ms audio=24000
[timing] call=43 tokens=28 final=0 token2mel=1826.139ms vocoder=368.356ms total=2194.507ms audio=24000
[timing] call=44 tokens=28 final=0 token2mel=1819.542ms vocoder=378.423ms total=2197.977ms audio=24000
[timing] call=45 tokens=28 final=0 token2mel=1849.443ms vocoder=377.706ms total=2227.162ms audio=24000
[timing] call=46 tokens=28 final=0 token2mel=1819.117ms vocoder=377.801ms total=2196.930ms audio=24000
[timing] call=47 tokens=28 final=0 token2mel=1821.994ms vocoder=389.097ms total=2211.102ms audio=24000
[timing] call=48 tokens=28 final=0 token2mel=1825.848ms vocoder=382.629ms total=2208.488ms audio=24000
[timing] call=49 tokens=4 final=1 token2mel=1862.430ms vocoder=126.245ms total=1988.684ms audio=7680
Audio generation completed.
llama_perf_context_print: load time = 14730.90 ms
llama_perf_context_print: prompt eval time = 13109.86 ms / 171 tokens ( 76.67 ms per token, 13.04 tokens per second)
llama_perf_context_print: eval time = 21868.63 ms / 177 runs ( 123.55 ms per token, 8.09 tokens per second)
llama_perf_context_print: total time = 134277.18 ms / 348 tokens
llama_perf_context_print: graphs reused = 177
Token2Wav (C++): session released
@@ -0,0 +1,662 @@
=== Model Paths ===
Base dir: C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf
LLM: C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf\MiniCPM-o-4_5-Q4_K_M.gguf [OK]
Vision: C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/vision/MiniCPM-o-4_5-vision-F16.gguf [OK]
Audio: C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/audio/MiniCPM-o-4_5-audio-F16.gguf [OK]
TTS: C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-tts-F16.gguf [OK]
Projector: C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-projector-F16.gguf [OK]
===================
=== Initializing Omni Context ===
Media type: 2 (omni: audio+vision)
TTS enabled: yes
Context size: 2048
GPU layers: 0
Token2Wav device: cpu
Vision backend: metal
TTS bin dir: C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/tts
Ref audio: C:\Users\zhout\w2\minicpmo_cpp_cpu_v3\default_ref_audio.wav
22:06:34.706 === omni_init start
22:06:34.706 media_type = 2, duplex_mode = 0, base_output_dir = ./tools/omni/output
22:06:34.706 === omni_init: loading new LLM model
22:06:36.666 === omni_init: loading TTS model
22:06:36.666 TTS model: loading with n_gpu_layers=0
22:06:36.921 TTS sampler: temp=0.80, top_p=0.85, top_k=25, rep_penalty=1.05
22:06:36.921 TTS: loading weights from GGUF (emb_code, emb_text, projector_semantic, head_code)...
22:06:37.318 TTS: head_code shape: dim0=6562, dim1=768, will transpose to [6562, 768]
22:06:37.323 TTS: head_code loaded, verifying first few values:
22:06:37.323 head_code_weight[0] = 0.01361084 (expect ~0.01385498)
22:06:37.323 head_code_weight[1] = -0.01660156 (expect ~-0.01647949)
22:06:37.323 head_code_weight[768] = 0.04101562 (this is weight[1, 0], expect ~0.04150391)
22:06:37.394 TTS: weights loaded successfully
22:06:37.394 Projector: loading from C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/tts/MiniCPM-o-4_5-projector-F16.gguf
22:06:37.400 Projector: loaded successfully
22:06:37.400 === omni_init: loading APM model
22:06:37.566 APM: init from C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/audio/MiniCPM-o-4_5-audio-F16.gguf
22:06:37.887 Token2Wav: found models in C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/token2wav-gguf
22:06:37.887 Token2Wav: all model files found, initializing session...
22:06:37.887 Token2Wav: non-CUDA backend, vocoder using CPU for better performance
22:06:37.887 Token2Wav: using prompt_cache from C:\Users\zhout\w2\models\MiniCPM-o-4_5-gguf/token2wav-gguf/prompt_cache.gguf
22:06:38.287 Token2Wav: initialized successfully
22:06:38.287 Python T2W: script_dir=./tools/omni/pyt2w, model_dir=./tools/omni/pyt2w/token2wav
22:06:38.287 Token2Wav: 使用 C++ 实现
22:06:38.287 === omni_init success: ctx_llama = 000002531cb7f960
=== Running test case ===
Audio prefix: C:\Users\zhout\w2\minicpmo_cpp_cpu_v3\fixture_
Count: 2
22:06:38.287 stream_prefill: n_past = 0
voice_clone_prompt = <|im_start|>system
模仿音频样本的音色并生�新的内容。
<|audio_start|>
assistant_prompt = <|audio_end|>你的任务是用这�声音模��当一个助手。请认真�高质�地回�用户的问题。请用高自然度的方�和用户�天。<|im_end|>
<|im_start|>user
22:06:38.287 system prompt ref_audio: C:\Users\zhout\w2\minicpmo_cpp_cpu_v3\fixture_0000.wav
22:06:39.442 system prompt ref_audio embedding: n_pos=20
22:06:42.334 🔒 n_keep 设置为 72 (system prompt tokens),这部分永远�会被滑动窗�删除
22:06:42.334 stream_prefill(index=0): system prompt �始化完�,ref_audio 已在其中 prefill
22:06:42.334 [SW] system_prompt registered: preserve_length=72 (will be protected from sliding)
22:06:42.334 n_past = 72
22:06:42.334
c++ finish stream_prefill(index=0). n_past=72, n_keep=72, n_ctx=2048
prefill 0 (audio) : 4.04691 s
22:06:49.516 stream_prefill(index=1): processing user audio: C:\Users\zhout\w2\minicpmo_cpp_cpu_v3\fixture_0001.wav
22:06:49.712 stream_prefill(index=1): user audio embedding: n_pos=20
22:06:50.867
c++ finish stream_prefill(index=1). n_past=161, n_keep=72, n_ctx=2048
prefill 1 (audio+vision) : 8.53188 s
22:06:50.867 � stream_decode 开始: n_past=161, n_keep=72, n_ctx=2048, duplex_mode=0
22:06:50.867 stream_decode: create tts thread (simplex mode)
22:06:50.867 stream_decode: create t2w thread
22:06:50.867 wait prefill done
22:06:50.867 � [�工TTS] 添加 assistant prompt: "<|im_end|>
<|im_start|>assistant
<think>
</think>
<|tts_bos|>", n_past=161
22:06:50.867 T2W thread (C++) started
22:06:50.870 TTS: 创建�工模�输出目录: ./tools/omni/output/round_000
22:06:50.870 TTS thread started
22:06:51.397 � [�工TTS] assistant prompt 完�, n_past=171
22:06:51.397 LLM decode: max_tgt_len = 2048, n_predict = -1, n_ctx = 2048
22:06:52.281 LLM->TTS: text='哎呀,这个问题挺有��的��是让我去', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[110030 104256 3837 105073 101174 113062 6313 104806 104029 85336]
22:06:52.281 TTS<-LLM: chunk_idx=0, text='哎呀,这个问题挺有��的��是让我去', n_tokens=10, hidden_size=40960, token_ids=[110030 104256 3837 105073 101174 113062 6313 104806 104029 85336]
22:06:52.281 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:06:52.281 TTS: before empty check - response.empty=0, response='哎呀,这个问题挺有æ„�æ€�çš„ï¼�è¦�是让æˆ', llm_finish=0
22:06:52.281 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:06:52.281 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:06:52.282 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:06:52.323 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_0/merged_embeddings.txt
22:06:52.324 TTS Simplex: generating audio tokens for chunk 0 (n_tokens=10, tts_n_embd=768)
22:06:52.324 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=0, new_size=11)
22:06:52.324 TTS Simplex: first chunk - cleared KV cache
22:06:52.324 TTS Simplex: first chunk - cleared tts_all_generated_tokens and tts_token_buffer
22:06:52.430 TTS Simplex: prefill completed, n_past_tts=11
22:06:52.430 TTS Simplex: sampler created
22:06:52.430 TTS simplex: is_audio_bos=true (first audio token)
22:06:52.472 TTS Simplex Phase1: token 1/500: rel_id=1490
22:06:52.486 TTS Simplex Phase1: token 2/500: rel_id=4299
22:06:52.499 TTS Simplex Phase1: token 3/500: rel_id=6486
22:06:52.512 TTS Simplex Phase1: token 4/500: rel_id=4299
22:06:52.527 TTS Simplex Phase1: token 5/500: rel_id=4299
22:06:52.815 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25)
22:06:52.815 TTS Simplex Phase1: token 25/500: rel_id=2139
22:06:52.815 T2W线程(C++): 轮次切� (-1 -> 0),更新输出目录
22:06:52.815 T2W线程(C++): 新输出目录 ./tools/omni/output/round_000/tts_wav
22:06:53.192 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 50, buffer=25)
22:06:53.192 TTS Simplex Phase1: token 50/500: rel_id=4607
22:06:53.350 LLM->TTS: text='一个完全没去过的地方,那我肯定得', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[46944 100372 70927 112955 103958 3837 99212 35946 100736 49828]
22:06:53.407 TTS Simplex Phase1: EOS token at step 65
22:06:53.407 TTS Simplex: chunk 结�,tts_token_buffer 剩余 14 tokens (�留等下一个 chunk)
22:06:53.407 TTS Simplex: generated 64 audio tokens for chunk 0
22:06:53.407 TTS Simplex: chunk 0 first tokens: [1490 4299 6486 4299 4299 ], last tokens: [1945 4299 6486 6486 4299 ]
22:06:53.407 TTS Simplex: updated tts_n_past_accumulated=75, total_generated_tokens=64
22:06:53.419 TTS<-LLM: chunk_idx=1, text='一个完全没去过的地方,那我肯定得', n_tokens=10, hidden_size=40960, token_ids=[46944 100372 70927 112955 103958 3837 99212 35946 100736 49828]
22:06:53.419 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:06:53.419 TTS: before empty check - response.empty=0, response='一个完全没去过的地方,那我肯定得', llm_finish=0
22:06:53.419 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:06:53.419 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:06:53.419 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:06:53.460 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_1/merged_embeddings.txt
22:06:53.460 TTS Simplex: generating audio tokens for chunk 1 (n_tokens=10, tts_n_embd=768)
22:06:53.460 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=1, new_size=11)
22:06:53.460 TTS Simplex: chunk 1 - keeping KV cache, n_past_tts=75
22:06:53.487 TTS Simplex: prefill completed, n_past_tts=86
22:06:53.487 TTS Simplex: sampler created
22:06:53.506 TTS Simplex Phase1: token 1/500: rel_id=6486
22:06:53.523 TTS Simplex Phase1: token 2/500: rel_id=6405
22:06:53.537 TTS Simplex Phase1: token 3/500: rel_id=5838
22:06:53.553 TTS Simplex Phase1: token 4/500: rel_id=5919
22:06:53.569 TTS Simplex Phase1: token 5/500: rel_id=4218
22:06:53.660 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 11, buffer=25)
22:06:53.883 TTS Simplex Phase1: token 25/500: rel_id=879
22:06:54.057 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 36, buffer=25)
22:06:54.278 TTS Simplex Phase1: token 50/500: rel_id=5649
22:06:54.447 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 61, buffer=25)
22:06:54.487 LLM->TTS: text='去北�啊�你想啊,那地方冰', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[85336 113081 103924 6313 107409 103924 3837 99212 100371 100038]
22:06:54.664 TTS Simplex Phase1: token 75/500: rel_id=5838
22:06:54.768 TTS Simplex Phase1: EOS token at step 82
22:06:54.768 TTS Simplex: chunk 结�,tts_token_buffer 剩余 20 tokens (�留等下一个 chunk)
22:06:54.768 TTS Simplex: generated 81 audio tokens for chunk 1
22:06:54.768 TTS Simplex: chunk 1 first tokens: [6486 6405 5838 5919 4218 ], last tokens: [1545 1959 3750 19 5837 ]
22:06:54.768 TTS Simplex: updated tts_n_past_accumulated=167, total_generated_tokens=145
22:06:54.770 TTS<-LLM: chunk_idx=2, text='去北�啊�你想啊,那地方冰', n_tokens=10, hidden_size=40960, token_ids=[85336 113081 103924 6313 107409 103924 3837 99212 100371 100038]
22:06:54.770 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:06:54.770 TTS: before empty check - response.empty=0, response='去北�啊�你想啊,那地方冰', llm_finish=0
22:06:54.770 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:06:54.770 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:06:54.770 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:06:54.819 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_2/merged_embeddings.txt
22:06:54.819 TTS Simplex: generating audio tokens for chunk 2 (n_tokens=10, tts_n_embd=768)
22:06:54.819 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=2, new_size=11)
22:06:54.819 TTS Simplex: chunk 2 - keeping KV cache, n_past_tts=167
22:06:54.848 TTS Simplex: prefill completed, n_past_tts=178
22:06:54.848 TTS Simplex: sampler created
22:06:54.866 TTS Simplex Phase1: token 1/500: rel_id=497
22:06:54.881 TTS Simplex Phase1: token 2/500: rel_id=701
22:06:54.896 TTS Simplex Phase1: token 3/500: rel_id=2870
22:06:54.911 TTS Simplex Phase1: token 4/500: rel_id=5086
22:06:54.927 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 5, buffer=25)
22:06:54.927 TTS Simplex Phase1: token 5/500: rel_id=975
22:06:55.273 TTS Simplex Phase1: token 25/500: rel_id=2085
22:06:55.369 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 30, buffer=25)
22:06:55.746 TTS Simplex Phase1: token 50/500: rel_id=5402
22:06:55.799 LLM->TTS: text='天雪地的,白茫茫的一片,', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[35727 100167 29490 9370 3837 99243 116059 99774 34718 3837]
22:06:55.836 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 55, buffer=25)
22:06:56.075 TTS Simplex Phase1: EOS token at step 68
22:06:56.075 TTS Simplex: chunk 结�,tts_token_buffer 剩余 12 tokens (�留等下一个 chunk)
22:06:56.075 TTS Simplex: generated 67 audio tokens for chunk 2
22:06:56.075 TTS Simplex: chunk 2 first tokens: [497 701 2870 5086 975 ], last tokens: [3972 3648 5835 5838 1458 ]
22:06:56.075 TTS Simplex: updated tts_n_past_accumulated=245, total_generated_tokens=212
22:06:56.079 TTS<-LLM: chunk_idx=3, text='天雪地的,白茫茫的一片,', n_tokens=10, hidden_size=40960, token_ids=[35727 100167 29490 9370 3837 99243 116059 99774 34718 3837]
22:06:56.079 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:06:56.079 TTS: before empty check - response.empty=0, response='天雪地的,白茫茫的一片,', llm_finish=0
22:06:56.079 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:06:56.079 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:06:56.079 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:06:56.133 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_3/merged_embeddings.txt
22:06:56.133 TTS Simplex: generating audio tokens for chunk 3 (n_tokens=10, tts_n_embd=768)
22:06:56.133 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=3, new_size=11)
22:06:56.133 TTS Simplex: chunk 3 - keeping KV cache, n_past_tts=245
22:06:56.176 TTS Simplex: prefill completed, n_past_tts=256
22:06:56.176 TTS Simplex: sampler created
22:06:56.199 TTS Simplex Phase1: token 1/500: rel_id=4299
22:06:56.220 TTS Simplex Phase1: token 2/500: rel_id=3909
22:06:56.245 TTS Simplex Phase1: token 3/500: rel_id=5850
22:06:56.266 TTS Simplex Phase1: token 4/500: rel_id=4459
22:06:56.267 🎉 首�时间 (First Audio Response): 5400ms
22:06:56.267 T2W线程: wav_0.wav | 0.84s audio | 3450.0ms inference | RTF=4.11 | t=5400ms
22:06:56.284 TTS Simplex Phase1: token 5/500: rel_id=4409
22:06:56.414 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 13, buffer=25)
22:06:56.610 TTS Simplex Phase1: token 25/500: rel_id=4507
22:06:56.826 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 38, buffer=25)
22:06:57.036 TTS Simplex Phase1: token 50/500: rel_id=4570
22:06:57.040 LLM->TTS: text='连路都没有,走路都得�心翼翼的。', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[54926 45995 104338 3837 109214 71268 49828 114890 9370 1773]
22:06:57.197 TTS Simplex Phase1: EOS token at step 60
22:06:57.197 TTS Simplex: chunk 结�,tts_token_buffer 剩余 21 tokens (�留等下一个 chunk)
22:06:57.197 TTS Simplex: generated 59 audio tokens for chunk 3
22:06:57.197 TTS Simplex: chunk 3 first tokens: [4299 3909 5850 4459 4409 ], last tokens: [4314 2855 3404 4871 3987 ]
22:06:57.197 TTS Simplex: updated tts_n_past_accumulated=315, total_generated_tokens=271
22:06:57.199 TTS<-LLM: chunk_idx=4, text='连路都没有,走路都得�心翼翼的。', n_tokens=10, hidden_size=40960, token_ids=[54926 45995 104338 3837 109214 71268 49828 114890 9370 1773]
22:06:57.199 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:06:57.199 TTS: before empty check - response.empty=0, response='连路都没有,走路都得�心翼翼的。', llm_finish=0
22:06:57.199 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:06:57.199 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:06:57.199 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:06:57.244 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_4/merged_embeddings.txt
22:06:57.244 TTS Simplex: generating audio tokens for chunk 4 (n_tokens=10, tts_n_embd=768)
22:06:57.244 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=4, new_size=11)
22:06:57.244 TTS Simplex: chunk 4 - keeping KV cache, n_past_tts=315
22:06:57.283 TTS Simplex: prefill completed, n_past_tts=326
22:06:57.283 TTS Simplex: sampler created
22:06:57.300 TTS Simplex Phase1: token 1/500: rel_id=2234
22:06:57.316 TTS Simplex Phase1: token 2/500: rel_id=4769
22:06:57.332 TTS Simplex Phase1: token 3/500: rel_id=3455
22:06:57.347 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 4, buffer=25)
22:06:57.347 TTS Simplex Phase1: token 4/500: rel_id=1268
22:06:57.364 TTS Simplex Phase1: token 5/500: rel_id=4778
22:06:57.709 TTS Simplex Phase1: token 25/500: rel_id=5958
22:06:57.774 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 29, buffer=25)
22:06:58.116 TTS Simplex Phase1: token 50/500: rel_id=2112
22:06:58.186 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 54, buffer=25)
22:06:58.276 LLM->TTS: text='但你说这地方多刺激�穿厚厚的羽', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[77288 105665 43288 100371 42140 104313 6313 99621 118100 101433]
22:06:58.446 TTS Simplex Phase1: EOS token at step 70
22:06:58.446 TTS Simplex: chunk 结�,tts_token_buffer 剩余 15 tokens (�留等下一个 chunk)
22:06:58.446 TTS Simplex: generated 69 audio tokens for chunk 4
22:06:58.446 TTS Simplex: chunk 4 first tokens: [2234 4769 3455 1268 4778 ], last tokens: [2264 4841 4417 5402 2212 ]
22:06:58.446 TTS Simplex: updated tts_n_past_accumulated=395, total_generated_tokens=340
22:06:58.458 TTS<-LLM: chunk_idx=5, text='但你说这地方多刺激�穿厚厚的羽', n_tokens=10, hidden_size=40960, token_ids=[77288 105665 43288 100371 42140 104313 6313 99621 118100 101433]
22:06:58.458 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:06:58.458 TTS: before empty check - response.empty=0, response='但你说这地方多刺激�穿厚厚的羽', llm_finish=0
22:06:58.458 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:06:58.458 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:06:58.458 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:06:58.505 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_5/merged_embeddings.txt
22:06:58.505 TTS Simplex: generating audio tokens for chunk 5 (n_tokens=10, tts_n_embd=768)
22:06:58.505 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=5, new_size=11)
22:06:58.505 TTS Simplex: chunk 5 - keeping KV cache, n_past_tts=395
22:06:58.551 TTS Simplex: prefill completed, n_past_tts=406
22:06:58.551 TTS Simplex: sampler created
22:06:58.575 TTS Simplex Phase1: token 1/500: rel_id=1217
22:06:58.597 TTS Simplex Phase1: token 2/500: rel_id=272
22:06:58.617 TTS Simplex Phase1: token 3/500: rel_id=5170
22:06:58.639 TTS Simplex Phase1: token 4/500: rel_id=6374
22:06:58.658 TTS Simplex Phase1: token 5/500: rel_id=321
22:06:58.759 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 10, buffer=25)
22:06:59.073 TTS Simplex Phase1: token 25/500: rel_id=3648
22:06:59.291 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 35, buffer=25)
22:06:59.610 TTS Simplex Phase1: token 50/500: rel_id=2764
22:06:59.651 T2W线程: wav_1.wav | 1.00s audio | 3382.1ms inference | RTF=3.38 | t=8783ms
22:06:59.686 LLM->TTS: text='绒�,戴上防风手套,脚底下', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[108040 43209 3837 113142 99287 99208 113739 3837 100037 109237]
22:06:59.791 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 60, buffer=25)
22:07:00.057 TTS Simplex Phase1: token 75/500: rel_id=6048
22:07:00.060 TTS Simplex Phase1: EOS token at step 76
22:07:00.060 TTS Simplex: chunk 结�,tts_token_buffer 剩余 15 tokens (�留等下一个 chunk)
22:07:00.060 TTS Simplex: generated 75 audio tokens for chunk 5
22:07:00.060 TTS Simplex: chunk 5 first tokens: [1217 272 5170 6374 321 ], last tokens: [6486 4299 4299 1518 6048 ]
22:07:00.060 TTS Simplex: updated tts_n_past_accumulated=481, total_generated_tokens=415
22:07:00.062 TTS<-LLM: chunk_idx=6, text='绒�,戴上防风手套,脚底下', n_tokens=10, hidden_size=40960, token_ids=[108040 43209 3837 113142 99287 99208 113739 3837 100037 109237]
22:07:00.062 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:00.062 TTS: before empty check - response.empty=0, response='绒�,戴上防风手套,脚底下', llm_finish=0
22:07:00.062 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:00.062 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:00.062 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:00.101 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_6/merged_embeddings.txt
22:07:00.101 TTS Simplex: generating audio tokens for chunk 6 (n_tokens=10, tts_n_embd=768)
22:07:00.101 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=6, new_size=11)
22:07:00.101 TTS Simplex: chunk 6 - keeping KV cache, n_past_tts=481
22:07:00.140 TTS Simplex: prefill completed, n_past_tts=492
22:07:00.141 TTS Simplex: sampler created
22:07:00.158 TTS Simplex Phase1: token 1/500: rel_id=1377
22:07:00.174 TTS Simplex Phase1: token 2/500: rel_id=3898
22:07:00.190 TTS Simplex Phase1: token 3/500: rel_id=2513
22:07:00.208 TTS Simplex Phase1: token 4/500: rel_id=4961
22:07:00.223 TTS Simplex Phase1: token 5/500: rel_id=4869
22:07:00.307 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 10, buffer=25)
22:07:00.570 TTS Simplex Phase1: token 25/500: rel_id=6507
22:07:00.762 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 35, buffer=25)
22:07:00.890 LLM->TTS: text='踩�雪�或者雪鞋,一步一步往�', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[105541 99164 100167 87531 100631 100167 102097 3837 117719 114796]
22:07:01.042 TTS Simplex Phase1: token 50/500: rel_id=6453
22:07:01.217 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 60, buffer=25)
22:07:01.295 TTS Simplex Phase1: EOS token at step 65
22:07:01.295 TTS Simplex: chunk 结�,tts_token_buffer 剩余 4 tokens (�留等下一个 chunk)
22:07:01.295 TTS Simplex: generated 64 audio tokens for chunk 6
22:07:01.295 TTS Simplex: chunk 6 first tokens: [1377 3898 2513 4961 4869 ], last tokens: [5832 6084 4780 5672 3494 ]
22:07:01.295 TTS Simplex: updated tts_n_past_accumulated=556, total_generated_tokens=479
22:07:01.296 TTS<-LLM: chunk_idx=7, text='踩�雪�或者雪鞋,一步一步往�', n_tokens=10, hidden_size=40960, token_ids=[105541 99164 100167 87531 100631 100167 102097 3837 117719 114796]
22:07:01.296 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:01.296 TTS: before empty check - response.empty=0, response='踩�雪�或者雪鞋,一步一步往�', llm_finish=0
22:07:01.296 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:01.296 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:01.296 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:01.337 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_7/merged_embeddings.txt
22:07:01.337 TTS Simplex: generating audio tokens for chunk 7 (n_tokens=10, tts_n_embd=768)
22:07:01.337 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=7, new_size=11)
22:07:01.337 TTS Simplex: chunk 7 - keeping KV cache, n_past_tts=556
22:07:01.386 TTS Simplex: prefill completed, n_past_tts=567
22:07:01.386 TTS Simplex: sampler created
22:07:01.407 TTS Simplex Phase1: token 1/500: rel_id=4224
22:07:01.425 TTS Simplex Phase1: token 2/500: rel_id=4218
22:07:01.445 TTS Simplex Phase1: token 3/500: rel_id=3888
22:07:01.463 TTS Simplex Phase1: token 4/500: rel_id=5835
22:07:01.482 TTS Simplex Phase1: token 5/500: rel_id=5838
22:07:01.765 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 21, buffer=25)
22:07:01.839 TTS Simplex Phase1: token 25/500: rel_id=3658
22:07:02.159 LLM->TTS: text='挪,呼哧呼哧喘�粗气', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[103477 3837 99592 120367 99592 120367 103425 99164 102187 99180]
22:07:02.287 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 46, buffer=25)
22:07:02.377 TTS Simplex Phase1: token 50/500: rel_id=71
22:07:02.539 TTS Simplex Phase1: EOS token at step 58
22:07:02.539 TTS Simplex: chunk 结�,tts_token_buffer 剩余 11 tokens (�留等下一个 chunk)
22:07:02.539 TTS Simplex: generated 57 audio tokens for chunk 7
22:07:02.539 TTS Simplex: chunk 7 first tokens: [4224 4218 3888 5835 5838 ], last tokens: [4678 1295 314 35 4540 ]
22:07:02.539 TTS Simplex: updated tts_n_past_accumulated=624, total_generated_tokens=536
22:07:02.542 TTS<-LLM: chunk_idx=8, text='挪,呼哧呼哧喘�粗气', n_tokens=10, hidden_size=40960, token_ids=[103477 3837 99592 120367 99592 120367 103425 99164 102187 99180]
22:07:02.542 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:02.542 TTS: before empty check - response.empty=0, response='挪,呼哧呼哧喘�粗气', llm_finish=0
22:07:02.542 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:02.542 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:02.542 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:02.591 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_8/merged_embeddings.txt
22:07:02.591 TTS Simplex: generating audio tokens for chunk 8 (n_tokens=10, tts_n_embd=768)
22:07:02.591 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=8, new_size=11)
22:07:02.591 TTS Simplex: chunk 8 - keeping KV cache, n_past_tts=624
22:07:02.643 TTS Simplex: prefill completed, n_past_tts=635
22:07:02.643 TTS Simplex: sampler created
22:07:02.668 TTS Simplex Phase1: token 1/500: rel_id=3009
22:07:02.692 TTS Simplex Phase1: token 2/500: rel_id=1707
22:07:02.712 TTS Simplex Phase1: token 3/500: rel_id=5838
22:07:02.737 TTS Simplex Phase1: token 4/500: rel_id=5109
22:07:02.758 TTS Simplex Phase1: token 5/500: rel_id=2922
22:07:02.965 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 14, buffer=25)
22:07:03.118 T2W线程: wav_2.wav | 1.00s audio | 3465.6ms inference | RTF=3.47 | t=12250ms
22:07:03.198 TTS Simplex Phase1: token 25/500: rel_id=3599
22:07:03.466 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 39, buffer=25)
22:07:03.534 LLM->TTS: text='。抬头看天,全是星星,连北�', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[1773 108149 50930 35727 3837 108743 109014 3837 54926 113081]
22:07:03.671 TTS Simplex Phase1: token 50/500: rel_id=3579
22:07:03.928 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 64, buffer=25)
22:07:04.076 TTS Simplex Phase1: EOS token at step 73
22:07:04.076 TTS Simplex: chunk 结�,tts_token_buffer 剩余 8 tokens (�留等下一个 chunk)
22:07:04.076 TTS Simplex: generated 72 audio tokens for chunk 8
22:07:04.076 TTS Simplex: chunk 8 first tokens: [3009 1707 5838 5109 2922 ], last tokens: [3144 5970 4293 3493 1541 ]
22:07:04.076 TTS Simplex: updated tts_n_past_accumulated=707, total_generated_tokens=608
22:07:04.078 TTS<-LLM: chunk_idx=9, text='。抬头看天,全是星星,连北�', n_tokens=10, hidden_size=40960, token_ids=[1773 108149 50930 35727 3837 108743 109014 3837 54926 113081]
22:07:04.078 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:04.078 TTS: before empty check - response.empty=0, response='。抬头看天,全是星星,连北�', llm_finish=0
22:07:04.078 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:04.078 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:04.078 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:04.125 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_9/merged_embeddings.txt
22:07:04.125 TTS Simplex: generating audio tokens for chunk 9 (n_tokens=10, tts_n_embd=768)
22:07:04.125 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=9, new_size=11)
22:07:04.125 TTS Simplex: chunk 9 - keeping KV cache, n_past_tts=707
22:07:04.174 TTS Simplex: prefill completed, n_past_tts=718
22:07:04.174 TTS Simplex: sampler created
22:07:04.193 TTS Simplex Phase1: token 1/500: rel_id=1645
22:07:04.210 TTS Simplex Phase1: token 2/500: rel_id=1605
22:07:04.229 TTS Simplex Phase1: token 3/500: rel_id=140
22:07:04.248 TTS Simplex Phase1: token 4/500: rel_id=3468
22:07:04.267 TTS Simplex Phase1: token 5/500: rel_id=4915
22:07:04.501 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 17, buffer=25)
22:07:04.649 TTS Simplex Phase1: token 25/500: rel_id=4299
22:07:04.729 LLM->TTS: text='光都能看�,那�一个美��过', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[99225 104297 104356 3837 99212 99882 46944 57566 6313 100632]
22:07:04.967 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 42, buffer=25)
22:07:05.113 TTS Simplex Phase1: token 50/500: rel_id=6486
22:07:05.463 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 67, buffer=25)
22:07:05.467 TTS Simplex Phase1: EOS token at step 68
22:07:05.467 TTS Simplex: chunk 结�,tts_token_buffer 剩余 0 tokens (�留等下一个 chunk)
22:07:05.467 TTS Simplex: generated 67 audio tokens for chunk 9
22:07:05.467 TTS Simplex: chunk 9 first tokens: [1645 1605 140 3468 4915 ], last tokens: [4509 4615 4444 5645 5645 ]
22:07:05.467 TTS Simplex: updated tts_n_past_accumulated=785, total_generated_tokens=675
22:07:05.468 TTS<-LLM: chunk_idx=10, text='光都能看�,那�一个美��过', n_tokens=10, hidden_size=40960, token_ids=[99225 104297 104356 3837 99212 99882 46944 57566 6313 100632]
22:07:05.468 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:05.468 TTS: before empty check - response.empty=0, response='光都能看�,那�一个美��过', llm_finish=0
22:07:05.469 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:05.469 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:05.469 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:05.512 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_10/merged_embeddings.txt
22:07:05.512 TTS Simplex: generating audio tokens for chunk 10 (n_tokens=10, tts_n_embd=768)
22:07:05.512 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=10, new_size=11)
22:07:05.512 TTS Simplex: chunk 10 - keeping KV cache, n_past_tts=785
22:07:05.569 TTS Simplex: prefill completed, n_past_tts=796
22:07:05.569 TTS Simplex: sampler created
22:07:05.595 TTS Simplex Phase1: token 1/500: rel_id=322
22:07:05.615 TTS Simplex Phase1: token 2/500: rel_id=4967
22:07:05.640 TTS Simplex Phase1: token 3/500: rel_id=6098
22:07:05.660 TTS Simplex Phase1: token 4/500: rel_id=5534
22:07:05.679 TTS Simplex Phase1: token 5/500: rel_id=4444
22:07:06.070 LLM->TTS: text='呢,也挺难的,�饭得�', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[101036 3837 74763 101174 99349 9370 3837 104636 49828 99904]
22:07:06.117 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 25, buffer=25)
22:07:06.117 TTS Simplex Phase1: token 25/500: rel_id=2381
22:07:06.488 T2W线程: wav_3.wav | 1.00s audio | 3359.0ms inference | RTF=3.36 | t=15621ms
22:07:06.673 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 50, buffer=25)
22:07:06.673 TTS Simplex Phase1: token 50/500: rel_id=751
22:07:07.175 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 75, buffer=25)
22:07:07.175 TTS Simplex Phase1: token 75/500: rel_id=5669
22:07:07.281 TTS Simplex Phase1: EOS token at step 81
22:07:07.281 TTS Simplex: chunk 结�,tts_token_buffer 剩余 5 tokens (�留等下一个 chunk)
22:07:07.281 TTS Simplex: generated 80 audio tokens for chunk 10
22:07:07.281 TTS Simplex: chunk 10 first tokens: [322 4967 6098 5534 4444 ], last tokens: [1456 183 5078 4311 4068 ]
22:07:07.281 TTS Simplex: updated tts_n_past_accumulated=876, total_generated_tokens=755
22:07:07.282 TTS<-LLM: chunk_idx=11, text='呢,也挺难的,�饭得�', n_tokens=10, hidden_size=40960, token_ids=[101036 3837 74763 101174 99349 9370 3837 104636 49828 99904]
22:07:07.282 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:07.282 TTS: before empty check - response.empty=0, response='呢,也挺难的,�饭得�', llm_finish=0
22:07:07.282 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:07.282 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:07.282 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:07.326 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_11/merged_embeddings.txt
22:07:07.326 TTS Simplex: generating audio tokens for chunk 11 (n_tokens=10, tts_n_embd=768)
22:07:07.326 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=11, new_size=11)
22:07:07.326 TTS Simplex: chunk 11 - keeping KV cache, n_past_tts=876
22:07:07.369 LLM->TTS: text='�哨,因为风声太大,说��', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[39426 109760 3837 99519 99208 70074 102791 3837 104283 49187]
22:07:07.384 TTS Simplex: prefill completed, n_past_tts=887
22:07:07.384 TTS Simplex: sampler created
22:07:07.406 TTS Simplex Phase1: token 1/500: rel_id=2273
22:07:07.427 TTS Simplex Phase1: token 2/500: rel_id=8
22:07:07.447 TTS Simplex Phase1: token 3/500: rel_id=278
22:07:07.468 TTS Simplex Phase1: token 4/500: rel_id=386
22:07:07.489 TTS Simplex Phase1: token 5/500: rel_id=1115
22:07:07.792 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 20, buffer=25)
22:07:07.894 TTS Simplex Phase1: token 25/500: rel_id=4862
22:07:08.301 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 45, buffer=25)
22:07:08.404 TTS Simplex Phase1: token 50/500: rel_id=1833
22:07:08.611 LLM->TTS: text='�清。�那儿�点热汤,暖', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[106122 1773 99901 112358 99405 27442 99259 102022 3837 99856]
22:07:08.684 TTS Simplex Phase1: EOS token at step 66
22:07:08.684 TTS Simplex: chunk 结�,tts_token_buffer 剩余 20 tokens (�留等下一个 chunk)
22:07:08.684 TTS Simplex: generated 65 audio tokens for chunk 11
22:07:08.684 TTS Simplex: chunk 11 first tokens: [2273 8 278 386 1115 ], last tokens: [2922 2112 2949 6048 5319 ]
22:07:08.684 TTS Simplex: updated tts_n_past_accumulated=952, total_generated_tokens=820
22:07:08.694 TTS<-LLM: chunk_idx=12, text='�哨,因为风声太大,说��', n_tokens=10, hidden_size=40960, token_ids=[39426 109760 3837 99519 99208 70074 102791 3837 104283 49187]
22:07:08.694 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:08.694 TTS: before empty check - response.empty=0, response='�哨,因为风声太大,说��', llm_finish=0
22:07:08.695 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:08.695 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:08.695 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:08.740 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_12/merged_embeddings.txt
22:07:08.741 TTS Simplex: generating audio tokens for chunk 12 (n_tokens=10, tts_n_embd=768)
22:07:08.741 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=12, new_size=11)
22:07:08.741 TTS Simplex: chunk 12 - keeping KV cache, n_past_tts=952
22:07:08.805 TTS Simplex: prefill completed, n_past_tts=963
22:07:08.805 TTS Simplex: sampler created
22:07:08.827 TTS Simplex Phase1: token 1/500: rel_id=795
22:07:08.850 TTS Simplex Phase1: token 2/500: rel_id=3875
22:07:08.876 TTS Simplex Phase1: token 3/500: rel_id=4275
22:07:08.899 TTS Simplex Phase1: token 4/500: rel_id=6534
22:07:08.920 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 5, buffer=25)
22:07:08.920 TTS Simplex Phase1: token 5/500: rel_id=5510
22:07:09.411 TTS Simplex Phase1: token 25/500: rel_id=5294
22:07:09.521 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 30, buffer=25)
22:07:09.941 T2W线程: wav_4.wav | 1.00s audio | 3451.6ms inference | RTF=3.45 | t=19074ms
22:07:10.007 TTS Simplex Phase1: token 50/500: rel_id=5962
22:07:10.087 LLM->TTS: text='暖身�,�看看远处的冰山,', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[99856 108233 3837 87256 101997 103388 9370 100038 57811 3837]
22:07:10.101 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 55, buffer=25)
22:07:10.245 TTS Simplex Phase1: EOS token at step 66
22:07:10.245 TTS Simplex: chunk 结�,tts_token_buffer 剩余 10 tokens (�留等下一个 chunk)
22:07:10.245 TTS Simplex: generated 65 audio tokens for chunk 12
22:07:10.245 TTS Simplex: chunk 12 first tokens: [795 3875 4275 6534 5510 ], last tokens: [2249 876 549 5192 6077 ]
22:07:10.245 TTS Simplex: updated tts_n_past_accumulated=1028, total_generated_tokens=885
22:07:10.255 TTS<-LLM: chunk_idx=13, text='�清。�那儿�点热汤,暖', n_tokens=10, hidden_size=40960, token_ids=[106122 1773 99901 112358 99405 27442 99259 102022 3837 99856]
22:07:10.255 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:10.255 TTS: before empty check - response.empty=0, response='�清。�那儿�点热汤,暖', llm_finish=0
22:07:10.255 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:10.255 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:10.255 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:10.300 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_13/merged_embeddings.txt
22:07:10.300 TTS Simplex: generating audio tokens for chunk 13 (n_tokens=10, tts_n_embd=768)
22:07:10.300 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=13, new_size=11)
22:07:10.300 TTS Simplex: chunk 13 - keeping KV cache, n_past_tts=1028
22:07:10.362 TTS Simplex: prefill completed, n_past_tts=1039
22:07:10.362 TTS Simplex: sampler created
22:07:10.382 TTS Simplex Phase1: token 1/500: rel_id=3890
22:07:10.401 TTS Simplex Phase1: token 2/500: rel_id=1703
22:07:10.422 TTS Simplex Phase1: token 3/500: rel_id=3889
22:07:10.439 TTS Simplex Phase1: token 4/500: rel_id=2025
22:07:10.460 TTS Simplex Phase1: token 5/500: rel_id=3648
22:07:10.651 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 15, buffer=25)
22:07:10.847 TTS Simplex Phase1: token 25/500: rel_id=3603
22:07:11.138 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 40, buffer=25)
22:07:11.335 TTS Simplex Phase1: token 50/500: rel_id=2459
22:07:11.380 LLM->TTS: text='那��过瘾�你说这地方�', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[99212 99306 99882 38182 108886 6313 105665 43288 100371 101293]
22:07:11.553 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 65, buffer=25)
22:07:11.600 TTS Simplex Phase1: EOS token at step 69
22:07:11.600 TTS Simplex: chunk 结�,tts_token_buffer 剩余 3 tokens (�留等下一个 chunk)
22:07:11.600 TTS Simplex: generated 68 audio tokens for chunk 13
22:07:11.600 TTS Simplex: chunk 13 first tokens: [3890 1703 3889 2025 3648 ], last tokens: [881 3714 6069 4852 2216 ]
22:07:11.600 TTS Simplex: updated tts_n_past_accumulated=1107, total_generated_tokens=953
22:07:11.601 TTS<-LLM: chunk_idx=14, text='暖身�,�看看远处的冰山,', n_tokens=10, hidden_size=40960, token_ids=[99856 108233 3837 87256 101997 103388 9370 100038 57811 3837]
22:07:11.601 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:11.601 TTS: before empty check - response.empty=0, response='暖身�,�看看远处的冰山,', llm_finish=0
22:07:11.601 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:11.601 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:11.601 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:11.642 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_14/merged_embeddings.txt
22:07:11.642 TTS Simplex: generating audio tokens for chunk 14 (n_tokens=10, tts_n_embd=768)
22:07:11.642 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=14, new_size=11)
22:07:11.642 TTS Simplex: chunk 14 - keeping KV cache, n_past_tts=1107
22:07:11.710 TTS Simplex: prefill completed, n_past_tts=1118
22:07:11.710 TTS Simplex: sampler created
22:07:11.730 TTS Simplex Phase1: token 1/500: rel_id=1275
22:07:11.747 TTS Simplex Phase1: token 2/500: rel_id=2187
22:07:11.767 TTS Simplex Phase1: token 3/500: rel_id=6075
22:07:11.785 TTS Simplex Phase1: token 4/500: rel_id=6086
22:07:11.803 TTS Simplex Phase1: token 5/500: rel_id=5672
22:07:12.201 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 22, buffer=25)
22:07:12.277 TTS Simplex Phase1: token 25/500: rel_id=5322
22:07:12.828 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 47, buffer=25)
22:07:12.906 TTS Simplex Phase1: token 50/500: rel_id=1725
22:07:12.998 LLM->TTS: text='��?�就是这�,�让人', n_tokens=10, hidden_size=40960, n_embd=4096, token_ids=[16530 101293 11319 30440 99486 43288 101293 3837 99306 103973]
22:07:13.118 T2W线程: wav_5.wav | 1.00s audio | 3175.7ms inference | RTF=3.18 | t=22250ms
22:07:13.219 TTS Simplex Phase1: EOS token at step 68
22:07:13.219 TTS Simplex: chunk 结�,tts_token_buffer 剩余 20 tokens (�留等下一个 chunk)
22:07:13.219 TTS Simplex: generated 67 audio tokens for chunk 14
22:07:13.219 TTS Simplex: chunk 14 first tokens: [1275 2187 6075 6086 5672 ], last tokens: [1125 306 2243 2163 1686 ]
22:07:13.219 TTS Simplex: updated tts_n_past_accumulated=1185, total_generated_tokens=1020
22:07:13.220 TTS<-LLM: chunk_idx=15, text='那��过瘾�你说这地方�', n_tokens=10, hidden_size=40960, token_ids=[99212 99306 99882 38182 108886 6313 105665 43288 100371 101293]
22:07:13.220 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:13.220 TTS: before empty check - response.empty=0, response='那��过瘾�你说这地方�', llm_finish=0
22:07:13.220 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:13.220 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:13.220 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:13.258 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_15/merged_embeddings.txt
22:07:13.259 TTS Simplex: generating audio tokens for chunk 15 (n_tokens=10, tts_n_embd=768)
22:07:13.259 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=15, new_size=11)
22:07:13.259 TTS Simplex: chunk 15 - keeping KV cache, n_past_tts=1185
22:07:13.332 TTS Simplex: prefill completed, n_past_tts=1196
22:07:13.332 TTS Simplex: sampler created
22:07:13.352 TTS Simplex Phase1: token 1/500: rel_id=5021
22:07:13.369 TTS Simplex Phase1: token 2/500: rel_id=4967
22:07:13.389 TTS Simplex Phase1: token 3/500: rel_id=6424
22:07:13.409 TTS Simplex Phase1: token 4/500: rel_id=5560
22:07:13.429 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 5, buffer=25)
22:07:13.429 TTS Simplex Phase1: token 5/500: rel_id=6048
22:07:13.834 TTS Simplex Phase1: token 25/500: rel_id=138
22:07:13.939 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 30, buffer=25)
22:07:14.017 LLM: detected end token, set llm_generation_done=true
22:07:14.017 LLM->TTS: text='觉得活�真痛快�', n_tokens=6, hidden_size=24576, n_embd=4096, token_ids=[99801 107473 88051 100406 99234 6313]
22:07:14.245 TTS Simplex Phase1: token 50/500: rel_id=6486
22:07:14.320 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 55, buffer=25)
22:07:14.586 TTS Simplex Phase1: EOS token at step 74
22:07:14.586 TTS Simplex: chunk 结�,tts_token_buffer 剩余 18 tokens (�留等下一个 chunk)
22:07:14.586 TTS Simplex: generated 73 audio tokens for chunk 15
22:07:14.586 TTS Simplex: chunk 15 first tokens: [5021 4967 6424 5560 6048 ], last tokens: [5023 3159 1704 5835 735 ]
22:07:14.586 TTS Simplex: updated tts_n_past_accumulated=1269, total_generated_tokens=1093
22:07:14.596 TTS<-LLM: chunk_idx=16, text='��?�就是这�,�让人', n_tokens=10, hidden_size=40960, token_ids=[16530 101293 11319 30440 99486 43288 101293 3837 99306 103973]
22:07:14.596 TTS: after queue pop - speek_done=0, llm_finish=0, llm_text.empty=0, token_ids.size=10
22:07:14.596 TTS: before empty check - response.empty=0, response='��?�就是这�,�让人', llm_finish=0
22:07:14.596 TTS: DEBUG before has_llm_data - token_ids.size=10, hidden_states.size=40960, n_embd=4096
22:07:14.596 TTS: has_llm_data=1, token_ids=10, hidden_states=40960, n_embd=4096, llm_finish=0
22:07:14.596 � Decode 结�: n_past=348, 剩余空间=1700, 无需滑窗
22:07:14.596 � 轮次 1 结�,记录边界于 n_past=348
22:07:14.596 TTS: n_tokens_orig=10, n_tokens_filtered=10 (filtered 0 special tokens)
22:07:14.635 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_16/merged_embeddings.txt
22:07:14.635 TTS Simplex: generating audio tokens for chunk 16 (n_tokens=10, tts_n_embd=768)
22:07:14.635 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=16, new_size=11)
22:07:14.635 TTS Simplex: chunk 16 - keeping KV cache, n_past_tts=1269
22:07:14.702 TTS Simplex: prefill completed, n_past_tts=1280
22:07:14.702 TTS Simplex: sampler created
22:07:14.721 TTS Simplex Phase1: token 1/500: rel_id=2112
22:07:14.740 TTS Simplex Phase1: token 2/500: rel_id=4515
22:07:14.758 TTS Simplex Phase1: token 3/500: rel_id=957
22:07:14.774 TTS Simplex Phase1: token 4/500: rel_id=2327
22:07:14.793 TTS Simplex Phase1: token 5/500: rel_id=1680
22:07:14.831 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 7, buffer=25)
22:07:15.001 � 为下一轮准备: eval <|im_end|>\n<|im_start|>user\n, n_past=353
22:07:15.152 TTS Simplex Phase1: token 25/500: rel_id=728
22:07:15.275 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 32, buffer=25)
22:07:15.591 TTS Simplex Phase1: token 50/500: rel_id=5092
22:07:15.722 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 57, buffer=25)
22:07:15.916 TTS Simplex Phase1: EOS token at step 68
22:07:15.916 TTS Simplex: chunk 结�,tts_token_buffer 剩余 10 tokens (�留等下一个 chunk)
22:07:15.916 TTS Simplex: generated 67 audio tokens for chunk 16
22:07:15.916 TTS Simplex: chunk 16 first tokens: [2112 4515 957 2327 1680 ], last tokens: [5759 4865 4871 4961 1957 ]
22:07:15.916 TTS Simplex: updated tts_n_past_accumulated=1347, total_generated_tokens=1160
22:07:15.917 TTS<-LLM: chunk_idx=17, text='觉得活�真痛快�', n_tokens=6, hidden_size=24576, token_ids=[99801 107473 88051 100406 99234 6313]
22:07:15.917 TTS: after queue pop - speek_done=0, llm_finish=1, llm_text.empty=0, token_ids.size=6
22:07:15.917 TTS: before empty check - response.empty=0, response='觉得活�真痛快�', llm_finish=1
22:07:15.917 TTS: DEBUG before has_llm_data - token_ids.size=6, hidden_states.size=24576, n_embd=4096
22:07:15.917 TTS: has_llm_data=1, token_ids=6, hidden_states=24576, n_embd=4096, llm_finish=1
22:07:15.917 TTS: n_tokens_orig=6, n_tokens_filtered=6 (filtered 0 special tokens)
22:07:15.940 T2W线程: wav_6.wav | 1.00s audio | 2821.9ms inference | RTF=2.82 | t=25073ms
22:07:15.951 TTS: saved merged embeddings (text) to ./tools/omni/output/round_000/llm_debug/chunk_17/merged_embeddings.txt
22:07:15.951 TTS Simplex: generating audio tokens for chunk 17 (n_tokens=6, tts_n_embd=768)
22:07:15.951 TTS Simplex: 在 prefill �添加 audio_bos (chunk_idx=17, new_size=7)
22:07:15.951 TTS Simplex: chunk 17 - keeping KV cache, n_past_tts=1347
22:07:15.990 TTS Simplex: prefill completed, n_past_tts=1354
22:07:15.990 TTS Simplex: sampler created
22:07:16.005 TTS Simplex Phase1: token 1/500: rel_id=4134
22:07:16.019 TTS Simplex Phase1: token 2/500: rel_id=5835
22:07:16.033 TTS Simplex Phase1: token 3/500: rel_id=5838
22:07:16.047 TTS Simplex Phase1: token 4/500: rel_id=3651
22:07:16.061 TTS Simplex Phase1: token 5/500: rel_id=1869
22:07:16.210 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 15, buffer=25)
22:07:16.357 TTS Simplex Phase1: token 25/500: rel_id=4520
22:07:16.584 TTS Simplex Phase1: yield 25 tokens 到 T2W (step 40, buffer=25)
22:07:16.732 TTS Simplex Phase1: token 50/500: rel_id=4956
22:07:16.809 TTS Simplex Phase1: EOS token at step 56
22:07:16.809 TTS Simplex: is_final_text_chunk=true, will enter Phase 2 for text_eos_embed
22:07:16.810 TTS Simplex Phase2: injecting text_eos_embed + audio_bos at n_past=1409
22:07:16.821 TTS Simplex Phase2: text_eos_embed injected, n_past=1410
22:07:16.833 TTS Simplex Phase2: audio_bos injected, n_past=1411, starting final generation
22:07:16.982 TTS Simplex Phase2: yield 25 tokens 到 T2W
22:07:17.013 TTS Simplex Phase2: EOS at step 12 (final end)
22:07:17.013 TTS Simplex: chunk 结�,tts_token_buffer 剩余 1 tokens (�留等下一个 chunk)
22:07:17.013 TTS Simplex: is_final_text_chunk=true, flush 剩余 1 tokens 从 tts_token_buffer
22:07:17.013 TTS Simplex: generated 66 audio tokens for chunk 17
22:07:17.013 TTS Simplex: chunk 17 first tokens: [4134 5835 5838 3651 1869 ], last tokens: [4299 6486 6486 4299 4218 ]
22:07:17.013 TTS Simplex: updated tts_n_past_accumulated=1423, total_generated_tokens=1226
22:07:17.013 TTS: finished processing all chunks
22:07:17.014 TTS: �工模�轮次结�,下一轮 round_idx=1
22:07:17.014 TTS: sent is_final=true to T2W queue (turn end)
22:07:18.320 T2W线程: wav_7.wav | 1.00s audio | 2378.7ms inference | RTF=2.38 | t=27452ms
22:07:20.546 T2W线程: wav_8.wav | 1.00s audio | 2225.5ms inference | RTF=2.23 | t=29679ms
22:07:22.778 T2W线程: wav_9.wav | 1.00s audio | 2231.2ms inference | RTF=2.23 | t=31911ms
22:07:24.992 T2W线程: wav_10.wav | 1.00s audio | 2212.8ms inference | RTF=2.21 | t=34124ms
22:07:27.195 T2W线程: wav_11.wav | 1.00s audio | 2202.2ms inference | RTF=2.20 | t=36327ms
22:07:29.409 T2W线程: wav_12.wav | 1.00s audio | 2213.6ms inference | RTF=2.21 | t=38542ms
22:07:31.621 T2W线程: wav_13.wav | 1.00s audio | 2202.8ms inference | RTF=2.20 | t=40754ms
22:07:33.834 T2W线程: wav_14.wav | 1.00s audio | 2212.8ms inference | RTF=2.21 | t=42967ms
22:07:36.040 T2W线程: wav_15.wav | 1.00s audio | 2204.7ms inference | RTF=2.20 | t=45172ms
22:07:38.231 T2W线程: wav_16.wav | 1.00s audio | 2190.5ms inference | RTF=2.19 | t=47364ms
22:07:40.443 T2W线程: wav_17.wav | 1.00s audio | 2211.2ms inference | RTF=2.21 | t=49576ms
22:07:42.643 T2W线程: wav_18.wav | 1.00s audio | 2199.0ms inference | RTF=2.20 | t=51775ms
22:07:44.876 T2W线程: wav_19.wav | 1.00s audio | 2232.0ms inference | RTF=2.23 | t=54008ms
22:07:47.081 T2W线程: wav_20.wav | 1.00s audio | 2204.1ms inference | RTF=2.20 | t=56213ms
22:07:49.285 T2W线程: wav_21.wav | 1.00s audio | 2203.2ms inference | RTF=2.20 | t=58417ms
22:07:51.493 T2W线程: wav_22.wav | 1.00s audio | 2207.2ms inference | RTF=2.21 | t=60626ms
22:07:53.739 T2W线程: wav_23.wav | 1.00s audio | 2245.3ms inference | RTF=2.25 | t=62871ms
22:07:55.957 T2W线程: wav_24.wav | 1.00s audio | 2217.0ms inference | RTF=2.22 | t=65089ms
22:07:58.160 T2W线程: wav_25.wav | 1.00s audio | 2202.1ms inference | RTF=2.20 | t=67292ms
22:08:00.374 T2W线程: wav_26.wav | 1.00s audio | 2213.6ms inference | RTF=2.21 | t=69507ms
22:08:02.583 T2W线程: wav_27.wav | 1.00s audio | 2207.9ms inference | RTF=2.21 | t=71715ms
22:08:04.798 T2W线程: wav_28.wav | 1.00s audio | 2214.3ms inference | RTF=2.21 | t=73930ms
22:08:07.010 T2W线程: wav_29.wav | 1.00s audio | 2212.0ms inference | RTF=2.21 | t=76143ms
22:08:09.207 T2W线程: wav_30.wav | 1.00s audio | 2195.5ms inference | RTF=2.20 | t=78339ms
22:08:11.411 T2W线程: wav_31.wav | 1.00s audio | 2204.1ms inference | RTF=2.20 | t=80544ms
22:08:13.633 T2W线程: wav_32.wav | 1.00s audio | 2221.1ms inference | RTF=2.22 | t=82766ms
22:08:15.854 T2W线程: wav_33.wav | 1.00s audio | 2219.4ms inference | RTF=2.22 | t=84986ms
22:08:18.066 T2W线程: wav_34.wav | 1.00s audio | 2211.6ms inference | RTF=2.21 | t=87199ms
22:08:20.271 T2W线程: wav_35.wav | 1.00s audio | 2204.1ms inference | RTF=2.20 | t=89403ms
22:08:22.473 T2W线程: wav_36.wav | 1.00s audio | 2201.2ms inference | RTF=2.20 | t=91605ms
22:08:24.671 T2W线程: wav_37.wav | 1.00s audio | 2197.6ms inference | RTF=2.20 | t=93803ms
22:08:26.865 T2W线程: wav_38.wav | 1.00s audio | 2193.4ms inference | RTF=2.19 | t=95998ms
22:08:29.070 T2W线程: wav_39.wav | 1.00s audio | 2204.3ms inference | RTF=2.20 | t=98203ms
22:08:31.262 T2W线程: wav_40.wav | 1.00s audio | 2190.6ms inference | RTF=2.19 | t=100394ms
22:08:33.465 T2W线程: wav_41.wav | 1.00s audio | 2202.6ms inference | RTF=2.20 | t=102597ms
22:08:35.674 T2W线程: wav_42.wav | 1.00s audio | 2208.7ms inference | RTF=2.21 | t=104807ms
22:08:37.870 T2W线程: wav_43.wav | 1.00s audio | 2194.5ms inference | RTF=2.19 | t=107002ms
22:08:40.069 T2W线程: wav_44.wav | 1.00s audio | 2198.0ms inference | RTF=2.20 | t=109201ms
22:08:42.297 T2W线程: wav_45.wav | 1.00s audio | 2227.2ms inference | RTF=2.23 | t=111429ms
22:08:44.495 T2W线程: wav_46.wav | 1.00s audio | 2197.0ms inference | RTF=2.20 | t=113627ms
22:08:46.707 T2W线程: wav_47.wav | 1.00s audio | 2211.1ms inference | RTF=2.21 | t=115839ms
22:08:48.916 T2W线程: wav_48.wav | 1.00s audio | 2208.5ms inference | RTF=2.21 | t=118048ms
22:08:50.905 T2W线程: wav_49.wav | 0.32s audio | 1988.7ms inference | RTF=6.21 | t=120038ms
22:08:50.905 T2W线程: 写入结�标记 ./tools/omni/output/round_000/tts_wav/generation_done.flag (last_wav=49)
22:08:50.905 T2W线程: 轮次结��更新输出目录为 ./tools/omni/output/round_001/tts_wav
22:08:50.944 omni_stop_threads: stop signals sent
22:08:50.944 T2W(C++) 线程: �止
tts thread end
t2w thread end
@@ -0,0 +1,341 @@
{
"scope": "standalone MiniCPM-o 4.5 GGUF audio+image input to text+speech on native-Windows-11-HX370-CPU",
"status": "scoped_complete_path_pass",
"quality": "synthetic red-square/tone response not established as semantically correct",
"model_revision": "db25077c33951fe163b42986fba0132e279872a2",
"artifacts": {
"MiniCPM-o-4_5-Q4_K_M.gguf": {
"bytes": 5026714400,
"sha256": "1237a97ee081b8abebc47aa7dad565701e8f5f904cdc92f6723ac4281bbc0932"
},
"audio/MiniCPM-o-4_5-audio-F16.gguf": {
"bytes": 660167904,
"sha256": "d5b188ac7feaf98e17175c3f9bd14bf269301bfd187439fdaa3e3a494fc32ef7"
},
"vision/MiniCPM-o-4_5-vision-F16.gguf": {
"bytes": 1095113184,
"sha256": "1453678cc4e4fe18de241952962e234f265cb8dda780773526103ab8ba82f421"
},
"tts/MiniCPM-o-4_5-tts-F16.gguf": {
"bytes": 1157244416,
"sha256": "c7be3748a863dd6966ae7eed42600b7f41ca67affb03729ff245247f0e5ea088"
},
"tts/MiniCPM-o-4_5-projector-F16.gguf": {
"bytes": 14948640,
"sha256": "4b1b5b377358a5e594a304ff6ea5d52df606a9ba7d886c4299d232f0c67dd1fd"
},
"token2wav-gguf/encoder.gguf": {
"bytes": 151339008,
"sha256": "7f8d265da594eaf5e1de2db8f5f1867dbcb0bb75ef5878fadf2952347116f4d0"
},
"token2wav-gguf/flow_matching.gguf": {
"bytes": 458250240,
"sha256": "eda6069f3edeb5dd3a87fbf2aedb2ddd1b46f3273926c4fcf09b24476a39cab8"
},
"token2wav-gguf/flow_extra.gguf": {
"bytes": 13663328,
"sha256": "c67611aa7d02500fe395a7798bf0bfdfb55c74d37ba93934ca74d82b4e63f78d"
},
"token2wav-gguf/hifigan2.gguf": {
"bytes": 83242816,
"sha256": "1b8b3bf5d8d3066aeee4324fdcdd41aefce170d0ee907645858de408d82835c2"
},
"token2wav-gguf/prompt_cache.gguf": {
"bytes": 211613152,
"sha256": "81fe6f541ebe0b67db06a1e395df928da47991dc9637c2cf47d6c59d5b979f2c"
}
},
"runtime_binary_sha256": "55eb866533dabe7e09ceba2c9174060b950b35a214f231e6908c55dce5ed78e8",
"input_image_sha256": "22c7ccea466a3f551c512045e6316c7597408d4e0a20205502f55784d977aa8d",
"input_audio_sha256": "cf4bb5cd9acbfbf67596d4a53310652b61ef4b7ede1d54eb03ef4882ca40223a",
"response_text": "哎呀,这个问题挺有意思的!要是让我去一个完全没去过的地方,那我肯定得去北极啊!你想啊,那地方冰天雪地的,白茫茫的一片,连路都没有,走路都得小心翼翼的。但你说这地方多刺激!穿厚厚的羽绒服,戴上防风手套,脚底下踩着雪板或者雪鞋,一步一步往前挪,呼哧呼哧喘着粗气。抬头看天,全是星星,连北极光都能看见,那叫一个美!不过呢,也挺难的,吃饭得靠口哨,因为风声太大,说话听不清。坐那儿吃点热汤,暖暖身子,再看看远处的冰山,那才叫过瘾!你说这地方荒不荒?可就是这荒,才让人觉得活着真痛快!",
"audio_chunks": [
{
"name": "wav_0.wav",
"frames": 20160,
"sha256": "ccaf11f4d508f6714ee40f6cbc10f0443ce3a5a1c817e1098c9492fde006e5ef"
},
{
"name": "wav_1.wav",
"frames": 24000,
"sha256": "24f4927c3ee76c1f3dbe530be2f9e409353694693fa200682b70a175ae043a45"
},
{
"name": "wav_2.wav",
"frames": 24000,
"sha256": "6d5e2017555de66b7b5d10f2d9405ab7aa838f4919f8cd481b50ad60144391a1"
},
{
"name": "wav_3.wav",
"frames": 24000,
"sha256": "80435ac30f252004b3d3aeda4a04add0948b8b200b7bcfb14059d3e7058425f7"
},
{
"name": "wav_4.wav",
"frames": 24000,
"sha256": "6573999fb18bb302e18a15e5716ca98ffd4f4d8860a107303886af47bd8f45c3"
},
{
"name": "wav_5.wav",
"frames": 24000,
"sha256": "1b2237ec3731e5cf3132c8ea0a0f1d4d050b5e26e99434092c76cde7818074a1"
},
{
"name": "wav_6.wav",
"frames": 24000,
"sha256": "824b4e215c9602087b993547361abc9657b8c8f39ab3cc24fbf3e724e8bd8a79"
},
{
"name": "wav_7.wav",
"frames": 24000,
"sha256": "fef914a2fe781eda722b07cfe0720776ee2e5a319c8229cda805285925e607bc"
},
{
"name": "wav_8.wav",
"frames": 24000,
"sha256": "0ce28877d81c1a760929495c3ba4369466c8ef1bf8f96e1df1a3e781a154dde2"
},
{
"name": "wav_9.wav",
"frames": 24000,
"sha256": "6601959926fe73677365ce3c5f650cf9cc88b0521af7e9cff7332a36ba5e1a05"
},
{
"name": "wav_10.wav",
"frames": 24000,
"sha256": "908c73e428c8d5558b2f6dbf3468e151bcae61a5ddc329a4b89bbc68917ccac4"
},
{
"name": "wav_11.wav",
"frames": 24000,
"sha256": "485b6d0a5bd286741de6252a1ce453117717e6171f707be9984767c82875cf8d"
},
{
"name": "wav_12.wav",
"frames": 24000,
"sha256": "a4121fd0b15a2755a80703c52859737df7fcbcb310f725cf504bedfb941b0605"
},
{
"name": "wav_13.wav",
"frames": 24000,
"sha256": "300623668516f1a049f1d99e5ade0b93e8a73deb298e9e04854b983f0fd76f81"
},
{
"name": "wav_14.wav",
"frames": 24000,
"sha256": "0a9a9a08eea009460590bb032d33edffe0153193e50c366a743ead46e2d0e2a9"
},
{
"name": "wav_15.wav",
"frames": 24000,
"sha256": "baab0f1f8d00de92073d4ffa9834ca7da9cedbf575f39f4a9cebde680381bcf0"
},
{
"name": "wav_16.wav",
"frames": 24000,
"sha256": "af52c89f21ac5f948e33787e605df8e883579632f1036ea6bcdbd9c7a8fbdcda"
},
{
"name": "wav_17.wav",
"frames": 24000,
"sha256": "ec70aa4c48e88ffed9505a68058b499b58ca4adc8ea6644a4799ab144997f405"
},
{
"name": "wav_18.wav",
"frames": 24000,
"sha256": "cec1bc909334fcc6de69af4a826f9fc77425077e33990b7b532ca25910adb01c"
},
{
"name": "wav_19.wav",
"frames": 24000,
"sha256": "cb5423b0db3a5528470da14b21eee3dd465daf243378e067c4d976e1876c387b"
},
{
"name": "wav_20.wav",
"frames": 24000,
"sha256": "bb48ff18018f36906ff8bcac0291444b1000d2fee6ec928f82d916b96f3eaa81"
},
{
"name": "wav_21.wav",
"frames": 24000,
"sha256": "3ef0c77893e626ea65aed16aff60034b960d633c6bb175350ebb27cfebe7c3c3"
},
{
"name": "wav_22.wav",
"frames": 24000,
"sha256": "44751508ac8a2f6a5e00744c8025eccd4f47f950b5c8fda3d9aac896594a9e77"
},
{
"name": "wav_23.wav",
"frames": 24000,
"sha256": "14520c03ab4e42f4477003de37394f634d0159f34416c8a977614d2ba17bab29"
},
{
"name": "wav_24.wav",
"frames": 24000,
"sha256": "a8897359ccf0fe7209747b1969c040697f84e6cbd2bfb9af0812802e937f250c"
},
{
"name": "wav_25.wav",
"frames": 24000,
"sha256": "8a558610b0452664e8426bd52e18d939d5b8a6e5cb30f716b50b0085b1ff53c6"
},
{
"name": "wav_26.wav",
"frames": 24000,
"sha256": "ebb83e4ce6c6c5e38af3e4efe1052ec36650a7b45b7110e7ad4c1ee7eaadff85"
},
{
"name": "wav_27.wav",
"frames": 24000,
"sha256": "571c311f90e702ccc36710282d6fe076facbe6d7d9cce0e75fef3a0aec182465"
},
{
"name": "wav_28.wav",
"frames": 24000,
"sha256": "963516c1d2997c807577d4e6f070442a9ef245e9abdfb0c59d38e1586cfd03cd"
},
{
"name": "wav_29.wav",
"frames": 24000,
"sha256": "95895af80fe40af98a478470a7e2bbad628af3bf21ae584326aa861116a41c24"
},
{
"name": "wav_30.wav",
"frames": 24000,
"sha256": "417baf3112430c5d91b72ebb7719c62516f7a22941895a42ced4480eb61e22d8"
},
{
"name": "wav_31.wav",
"frames": 24000,
"sha256": "0cea7e377d403c76bdd5239338a86c9d7c256ce88bb6a07aa5e890f71d9dc72d"
},
{
"name": "wav_32.wav",
"frames": 24000,
"sha256": "22019ed1005e7c8c804f31075ad3b44b24dbf518f9a32df2e3fdf6b46aa93b1e"
},
{
"name": "wav_33.wav",
"frames": 24000,
"sha256": "450c5669164ed7907e9349284d4a13af87e59b7767545de71521d84dd4ab505e"
},
{
"name": "wav_34.wav",
"frames": 24000,
"sha256": "f7afa07c68e4015d79e14dfabb819c8e77940e395546730567b01f74b902ff2d"
},
{
"name": "wav_35.wav",
"frames": 24000,
"sha256": "e5059b3194c5388d78e5fa0bf62f21ef311e5fd6e2d68f27728bde89dafa26ca"
},
{
"name": "wav_36.wav",
"frames": 24000,
"sha256": "5dfb632767047359bc87b2cc4c1b832043742c1ff38ddb309f77bcb9564c99bf"
},
{
"name": "wav_37.wav",
"frames": 24000,
"sha256": "b8b3a87ec594ba197964e01340d4f67d57b0ad1bb892c8f7b6e2ccac61790955"
},
{
"name": "wav_38.wav",
"frames": 24000,
"sha256": "06aeeebd73a91f80f7259cd69e70c95aad06eccd5dafa57cfdee49d12ea765cf"
},
{
"name": "wav_39.wav",
"frames": 24000,
"sha256": "d19073d56e22d2498d5d88ed53c6129773db0c88629770cebe2822e17c1dd10f"
},
{
"name": "wav_40.wav",
"frames": 24000,
"sha256": "674f787916d660663af553222e6f7475de281150e45442b17bacd086f92539a9"
},
{
"name": "wav_41.wav",
"frames": 24000,
"sha256": "bb712e6f0962193139dcef6bc32b14806fb95bfe50d0233a80bc3074767a5747"
},
{
"name": "wav_42.wav",
"frames": 24000,
"sha256": "17cf982832ae9495d57ae0ddc6062a9a371bded22843bf47528053a7e7feec6c"
},
{
"name": "wav_43.wav",
"frames": 24000,
"sha256": "605c0400cfe18ef70c5df7aa4444352f260fd111715c59857c2759e72215219c"
},
{
"name": "wav_44.wav",
"frames": 24000,
"sha256": "737571d20af2ab45afe8794de001ad5f8005e8726999cc03541d1efb2bb009b1"
},
{
"name": "wav_45.wav",
"frames": 24000,
"sha256": "ff061aad11f2079d6262060581e9a692391b024f5344e3f9cdb01e4ae5b8e4e2"
},
{
"name": "wav_46.wav",
"frames": 24000,
"sha256": "b7fcad9b9e0a175343089b3ab4e84c5659fd683139ef82a3c72a8a5c6ed1af11"
},
{
"name": "wav_47.wav",
"frames": 24000,
"sha256": "3ece4590e97ed99ffd2ab023a5916f7acb48c5428a6e109dc568ee9da4d525ba"
},
{
"name": "wav_48.wav",
"frames": 24000,
"sha256": "4e5d26b5a0d61000c3c6394fa7f7ff6ef912726382668704b0e65ccfea82a29a"
},
{
"name": "wav_49.wav",
"frames": 7680,
"sha256": "bd7c0b1674ff6cebcd2c9fa5dc3aac7fa75e72eb141c87b3c1635e848b14a510"
}
],
"audio_frames": 1179840,
"audio_duration_s": 49.16,
"audio_rms_pcm16": 2572.517821545514,
"pcm_sha256": "f24c45ec32bb0b7d32486546e91148f41b8348d563bbc8fc2c6e8babb3da098a",
"merged_wav_sha256": "a38e7fdea006f4b785b8ee857aeb4c3b4b0f4a7a2039c6e34f6723c105c8da02",
"peak_rss_kib_from_time": null,
"wall_clock_from_time": null,
"sampled_process_profile": {
"command": [
"C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3\\llama-omni-cli.exe",
"-m",
"C:\\Users\\zhout\\w2\\models\\MiniCPM-o-4_5-gguf\\MiniCPM-o-4_5-Q4_K_M.gguf",
"-ngl",
"0",
"-c",
"2048",
"--omni",
"--t2w-device",
"cpu",
"--t2w-wait-seconds",
"900",
"--ref-audio",
"C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3\\default_ref_audio.wav",
"--test",
"C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3\\fixture_",
"2"
],
"cwd": "C:\\Users\\zhout\\w2\\minicpmo_cpp_cpu_v3",
"exit_code": 0,
"wall_s": 137.33765170001425,
"memory_sample_interval_ms": 100,
"memory_samples": 1365,
"peak_sampled_rss_bytes": 13104742400,
"peak_sampled_private_bytes": 13314060288,
"measurement_note": "sampled process values, not guaranteed loading peaks"
},
"upstream_merge_name_mismatch": true
}
@@ -0,0 +1 @@
哎呀,这个问题挺有意思的!要是让我去一个完全没去过的地方,那我肯定得去北极啊!你想啊,那地方冰天雪地的,白茫茫的一片,连路都没有,走路都得小心翼翼的。但你说这地方多刺激!穿厚厚的羽绒服,戴上防风手套,脚底下踩着雪板或者雪鞋,一步一步往前挪,呼哧呼哧喘着粗气。抬头看天,全是星星,连北极光都能看见,那叫一个美!不过呢,也挺难的,吃饭得靠口哨,因为风声太大,说话听不清。坐那儿吃点热汤,暖暖身子,再看看远处的冰山,那才叫过瘾!你说这地方荒不荒?可就是这荒,才让人觉得活着真痛快!
@@ -0,0 +1 @@
哎呀,这个问题挺有意思的!要是让我去
@@ -0,0 +1 @@
一个完全没去过的地方,那我肯定得
@@ -0,0 +1 @@
连路都没有,走路都得小心翼翼的。
@@ -0,0 +1 @@
但你说这地方多刺激!穿厚厚的羽
@@ -0,0 +1 @@
踩着雪板或者雪鞋,一步一步往前
@@ -0,0 +1 @@
1490,4299,6486,4299,4299,1708,3653,2924,2195,4526,5021,2582,2303,5189,5105,2918,3161,5429,3008,1788,3648,5919,3003,1869,2139,4758,2415,4605,4611,3474,2585,4366,3601,4514,835,1752,2274,2698,484,60,4947,2699,4805,4826,716,1118,3320,5667,5019,4607,6142,6455,4185,1938,306,2192,3647,3890,1946,1945,4299,6486,6486,4299
@@ -0,0 +1 @@
6486,6405,5838,5919,4218,4218,3408,2753,3083,2630,5238,5319,3720,3724,3157,5999,4700,4952,2861,4373,1457,710,596,110,879,5648,4756,2391,6317,3482,5021,1059,180,4970,1451,1423,974,731,4492,5937,4998,3111,3128,4487,2638,4314,932,2573,4857,5649,4756,5541,3372,5334,4852,663,2912,2297,1038,2252,147,60,5669,4940,3077,6534,3618,2756,3161,2675,4637,2037,3888,5835,5838,2922,1545,1959,3750,19,5837
@@ -0,0 +1 @@
322,4967,6098,5534,4444,5402,2481,2663,20,1235,2121,4299,3891,3648,5835,5916,3651,2112,1560,80,386,4567,4314,2163,2381,548,566,2004,5648,2023,3320,1125,654,5831,5753,5032,5040,3339,1275,2819,617,3906,272,4151,264,165,5832,5923,4379,751,1726,5648,3238,2573,8,14,1489,4299,6486,4218,1950,5934,2934,5266,5265,5995,5189,960,4676,2321,5753,704,161,3481,5669,1456,183,5078,4311,4068
@@ -0,0 +1 @@
2273,8,278,386,1115,4299,6486,6486,6486,6486,4218,3651,5838,3648,1701,4299,4299,2163,1426,4373,582,669,5102,5081,4862,19,3906,2189,3161,3413,2441,3494,1460,1735,2014,1294,1295,4813,2418,2220,4947,4965,26,3910,1476,1463,1460,2,3666,1833,2242,5266,3890,1946,1703,1702,1704,5835,5838,5838,2922,2112,2949,6048,5319
@@ -0,0 +1 @@
795,3875,4275,6534,5510,5105,20,1806,1272,59,386,813,162,5355,5752,5054,489,405,2688,1439,2174,3709,5319,5319,5294,6238,6239,4295,2135,2056,1947,3726,5838,5109,2922,1303,2031,3454,4913,4508,6500,2657,143,233,4356,6534,3600,5093,6419,5962,6048,2340,2333,4880,4074,297,5835,5832,5998,5272,2249,876,549,5192,6077
@@ -0,0 +1 @@
3890,1703,3889,2025,3648,5919,4056,2031,5940,6048,3861,6554,5081,4984,5028,5038,6157,5837,141,60,4947,2697,5526,4317,3603,1856,2004,5405,4407,339,4778,4465,4716,5688,6486,6486,4299,3975,3972,5835,5838,5838,3651,3732,2112,5649,5644,3557,2894,2459,3909,2225,3809,1622,958,1599,6048,5322,3018,4615,69,4850,8,881,3714,6069,4852,2216
@@ -0,0 +1 @@
1275,2187,6075,6086,5672,4951,4959,4224,1944,3645,3648,1461,4299,1726,1479,362,974,4376,3747,2206,4700,1544,773,5319,5322,156,4487,4392,5934,6099,5653,5419,4439,2216,11,1704,3645,5835,5838,1545,4245,6374,2255,5192,222,165,5106,5842,2288,1725,84,5845,2192,2807,4291,4127,194,737,1564,1527,6291,3582,1125,306,2243,2163,1686
@@ -0,0 +1 @@
5021,4967,6424,5560,6048,4593,4568,5834,4466,4474,741,1704,5835,5838,3651,1464,4299,5937,3666,5188,5994,5995,5914,5837,138,6377,2916,3659,116,150,5647,4850,6158,5081,1419,654,6559,5090,2567,2339,4939,3481,557,305,35,2237,1523,4299,6486,6486,6486,4299,3651,5835,5838,3651,2922,1788,4218,3913,5615,2834,3712,6049,3861,6554,5081,5051,5023,3159,1704,5835,735
@@ -0,0 +1 @@
2112,4515,957,2327,1680,57,5020,5020,3076,6510,2846,1217,509,2779,5028,5028,5054,5752,5034,4317,4356,5831,4947,5028,728,572,2684,4871,4952,5609,4308,6486,6486,4299,4218,3975,4056,4299,2112,243,405,2449,155,2139,4920,4756,2580,5340,5076,5092,5825,5967,5238,1535,1527,3054,4850,2411,2558,2760,5028,2915,5759,4865,4871,4961,1957
@@ -0,0 +1 @@
4134,5835,5838,3651,1869,2058,5648,2922,3658,1547,3157,5336,5996,5672,1661,1661,3044,5937,4929,3381,4130,221,2324,309,4520,4727,2675,2765,3492,4218,4135,2112,5028,5028,2841,2186,710,2648,870,3150,3146,1680,4512,2426,4485,5202,6261,54,5589,4956,5065,4319,4318,651,2682,5356,3731,3650,1466,1463,1788,4299,6486,6486,4299,4218
@@ -0,0 +1 @@
497,701,2870,5086,975,165,2931,44,1563,312,4940,4560,1806,2263,305,1122,4756,3084,5343,2163,954,2330,548,323,2085,6377,6134,1041,2024,1295,35,5189,5269,5265,5915,3899,1702,4299,6486,6486,6486,6486,6405,4218,1959,3185,3455,5642,5182,5402,4677,4499,3647,1712,1712,1703,3890,5834,3656,1712,1702,4299,3972,3648,5835,5838,1458
@@ -0,0 +1 @@
4299,3909,5850,4459,4409,1923,66,4940,4778,6453,3618,2756,2675,4955,1395,2139,1695,5102,5047,5286,768,4785,4967,4490,4507,4753,4996,942,971,62,1842,78,5668,4778,1596,63,2270,3161,2432,2028,1701,3645,5832,1458,2112,2139,469,1463,737,4570,3339,6498,5671,4945,4314,2855,3404,4871,3987
@@ -0,0 +1 @@
2234,4769,3455,1268,4778,2166,3837,4947,4912,4517,2192,2216,768,1707,3648,5838,3651,2112,1815,161,2582,2297,5473,6255,5958,5094,5829,2827,300,2819,2897,4311,2125,116,368,4742,4993,2411,569,575,602,2087,4299,6486,4299,4218,3645,3975,4299,2112,6379,6455,316,518,629,1937,1665,5827,5829,5095,1032,389,5006,297,2264,4841,4417,5402,2212
@@ -0,0 +1 @@
1217,272,5170,6374,321,2483,4643,4886,5641,5641,5669,5668,4940,2266,1275,56,2918,2189,4385,981,6486,6486,4299,4218,3648,5835,5835,2922,1545,2166,63,4540,2373,6099,2699,3239,6291,1413,5816,954,5244,3153,4569,4768,69,786,3482,4778,6534,2764,3407,2450,1833,478,728,4754,1032,6455,6373,5634,5177,1506,6379,2994,4211,404,62,1763,1735,4299,6486,4299,4299,1518,6048
@@ -0,0 +1 @@
1377,3898,2513,4961,4869,4944,5038,5057,2897,4863,2860,5000,1110,2495,5342,4130,1861,1859,1855,2171,692,5776,5802,6534,6507,6537,2186,1457,719,5077,2791,3888,5832,5838,2922,2112,1761,4406,5192,2411,5322,2334,3728,2768,3519,6534,1301,491,2861,6453,2857,5068,5529,6048,5319,614,710,1107,297,5832,6084,4780,5672,3494
@@ -0,0 +1 @@
4224,4218,3888,5835,5838,2922,1788,4191,4919,161,1946,5053,468,63,5021,1295,6130,4678,4553,5917,5914,2377,6379,4374,3658,899,870,3154,2987,4833,5568,1942,971,4564,2166,2620,6077,1955,692,3570,2850,5086,1599,3875,4603,4509,4839,1185,962,71,5401,6374,4678,1295,314,35,4540
@@ -0,0 +1 @@
3009,1707,5838,5109,2922,2436,2112,1968,3482,1295,4939,3153,2166,5814,5829,5826,4534,2753,890,2166,2160,5102,5102,3640,3599,1220,749,1995,4673,330,269,2219,5934,5937,2774,1403,701,2870,4946,4942,2029,1701,3891,3645,5832,3159,1303,654,5028,3579,4373,5830,1206,3705,5319,3054,3881,5825,2769,5028,4345,5827,1686,5322,5319,3063,5333,3144,5970,4293,3493,1541
@@ -0,0 +1 @@
1645,1605,140,3468,4915,3321,1398,5826,237,5651,5159,4407,4749,4857,2501,791,2113,4299,6486,6486,6486,6486,4299,4299,4299,4299,4299,2112,864,5835,1466,4463,147,27,4961,5093,606,165,5844,5269,122,1644,60,4947,5641,4598,4460,4500,5121,6486,3975,5838,1464,2112,2706,4836,3813,916,818,8,2402,5319,4509,4615,4444,5645,5645
Loaded 100 of 190 files, more files were not shown because too many files have changed in this diff. Show more