Open Robby · Source and setup

Five recognizers, German replies, shared turn-taking

The Speech recognition menu above the robot selects the final recognizer. German is the default reply language; an explicit request for English overrides it. The original ASR remains the default recognizer so users can make their own comparisons. Selection is remembered in this browser.

Measured short-clip checks

One RTX 3090, three authored synthetic German clips (3.39–4.51 s), twice each. These figures are engineering smoke tests, not a representative German ASR evaluation or a recommendation for every microphone. WER compares intended synthesis text with ASR output and can include TTS pronunciation errors. Timing excludes speech collection, the configured pause, LLM, TTS and browser playback.

RecognizerChecksMedian ASR HTTP timeMean toy WEROne measured model switchHTTPS microphone → spoken reply
Nemotron 3.5 · original6 passed57.6 ms11.6%739.76 msTrue
Moonshine Streaming Small · German6 passed132.5 ms4.2%62.84 msTrue
Nemotron 3.5 · German telephony6 passed82.0 ms11.6%331.76 msTrue
Parakeet TDT v3 · multilingual6 passed57.5 ms4.2%854.36 msTrue
Whisper Large v3 Turbo · German6 passed128.2 ms4.2%691.31 msTrue

Model switching includes eviction of the previous extra recognizer and host-to-device loading. These are single switch observations; CUDA/allocator warm-up, weight size and the previously selected model affect them. Resident transcription calls do not reload the weights each time. Original Nemotron uses the existing optimized CUDA-graph decoder; the German telephony model is a separately loaded FP32 recognizer.

Pipeline and buffering

microphone ─┬─ original Nemotron → live preview / TYGER / speaker features / Stop
            └─ small CPU Silero VAD → speech pause → selected final recognizer
                                                   ↓
                                       corrected final text + voice label
                                                   ↓
                                       local LLM → sentence-streamed TTS

The previous Nemotron encoder and TYGER GRU stay resident and unchanged. Their features also power existing speaker matching. The final recognizer is interchangeable: the selected model's transcript, not the preview, is submitted to the LLM. Pauses still use the existing neural CPU VAD slider (400 ms default, 200–2,000 ms). Energy-only background noise does not reset this clock; actual background speech can.

Whisper is used as a buffered recognizer after speech pauses. Nemotron continues live recognition and interruptions alongside it. The same pause-final adapter is used for the other alternatives; this integration does not claim native incremental Moonshine/Parakeet decoding. A final alternative pass avoids an unnecessary second native-ASR pass. If speech resumes or the model changes during finalization, stale results are discarded and retained input is checked again.

Continuous input is held only in bounded session RAM (up to 1,000 existing 320-ms records, about 20 MB of float32 audio). Alternative-model calls use at most 28 seconds, with a short overlap and conservative duplicate-word removal for unusually long uninterrupted input. Typical sentence-sized input is one call. Audio is never saved by the live adapter. Long continuous monologues beyond that RAM window retain the earlier implementation's bounded-input limitation.

CPU RAM and GPU offloading

The optional loopback worker on port 8801 preloads all four additional models into CPU RAM, roughly 6.6 GiB of weight payload plus runtime overhead. Exactly one extra recognizer is active on GPU; switching evicts it to CPU before moving the new model to GPU. CTranslate2 uses unload_model(to_cpu=True) and load_model(keep_cache=True), retaining its CPU cache. PyTorch models use CPU/GPU transfers. The original Nemotron/TYGER, local LLM and shared TTS remain available.

Cold startup downloads only pinned inference files (about 6.7 GiB total); subsequent swaps use in-memory models. Progress/readiness is visible in the menu's details panel. Loading runs on worker threads in a separate process. Failure keeps the previous selection, and original Nemotron remains a recovery option even when the optional worker is offline. A selection change invalidates an in-flight stale result without deleting the pending utterance.

Models and exact source revisions

ModelRevision / source
Nemotron 3.5 · originalbundled-with-tyger
Moonshine Streaming Small · German56473ba32b22b484fdfc7eb03d34c393ff494197
Nemotron 3.5 · German telephonyafa1e25c8697ba55bc234087c46d954065cd7678
Parakeet TDT v3 · multilingual541d1f99c6b0c3cd0b11a95167540bb8edefd82b
Whisper Large v3 Turbo · German4df90f75321148c3a29a9e2351b7ddf8f5b115a8

Original Nemotron is the frozen copy in the existing pinned TYGER bundle, not a fresh download of an evolving main branch. The telephony artifact is converted strictly in memory using the released NeMo-to-Transformers key layout; all weights, every tokenizer ID and the German language prompt are checked. Nonpersistent positional buffers are initialized on CPU. Moonshine retains the required attention mask and a duration-based output cap. Whisper uses German recognition with no custom name/keyword prompt.

An initial decoder smoke test caught three integration errors before release: a base Moonshine class without a generation head, uninitialized nonpersistent meta buffers in the converted model, and a too-small RNN-T output budget that cut final words. The worker now uses the conditional Moonshine class, CPU-initialized buffers, the pinned generation configuration, and bounded budgets that include acoustic blank/time-advance steps. Measurements below use the corrected budget. The telephony model's published improvements concern telephone-style audio; three clean synthetic clips do not determine its usefulness in that domain.

Actual browser and language checks

Unit checks: 372; passed=True. HTTPS CPU Chrome test: passed=True. Each model is selected through the actual visible dropdown; a synthetic microphone utterance enters the real ASR/identity/LLM/TTS pipeline. The receipt verifies the final recognizer ID, one submitted turn, actual PCM, saved selection and no browser/service errors.

Additional real mobile-browser controls: passed=True. The selector fits a 390-pixel viewport, the choice survives an actual reload, and repeated Whisper → Parakeet → original switches complete.

Tell me what we could play together. → de
Wir könnten ein Abenteuer im leuchtenden Galaxien-Wald spielen, wo wir kleine, neugierige Roboter sind!
Bitte schlage mir ein Spiel vor. → de
Wir könnten ein Detektivspiel spielen, wo ich dir kryptische Hinweise gebe und du die Wahrheit herausfindest!
Please answer in English: suggest a game. → en
We could play a 'Robot Riddle Relay' where I give a tricky riddle and you give me a clever answer, then we swap!

Reproduction

# Existing Robby Python 3.12 environment and pinned TYGER assets are required.
python prepare_asr_models.py
pip install -r requirements-asr.txt
python asr_model_worker.py  # loopback 8801; CPU preload runs in the background
# Existing server.py + bolt_api.py + LLM + TTS must also be running.
python run_unit_checks.py
python validate_asr_models.py
uv run --no-project --with playwright --python /path/to/venv/bin/python python browser_asr_models_check.py

The live installation keeps the four additional dependencies in an isolated ROBO_ASR_DEPS directory; the shared TTS environment was not upgraded. ROBO_ASR_CACHE selects the model cache drive and ROBO_ASR_DEVICE selects the optional worker GPU. The launcher also accepts --with-asr-models. API clients can POST mono 16-kHz float32 PCM to /api/bolt/asr?model=whisper_turbo (or another catalogue ID); /api/asr/models reports cache readiness. Private development ASR endpoints remain blocked by the public facade.

Limits and provenance

Physical-room microphone quality, dialects, overlap and natural conversations still need user comparison. This check uses synthetic speech and a CPU Chromium fake microphone, not private recordings. It verifies integration and timing, not human ASR accuracy. Native preview quality and rapid Stop recognition still depend on the original Nemotron/TYGER path. ASR/voice labels are approximate, and the new recognizers do not authenticate a person.

Primary implementation references: Moonshine German usage and mask requirements; German telephony adaptation; Whisper CT2 weights; CTranslate2 CPU cache/offload API; Parakeet v3. Their source licenses remain separate; no model weights or private biometric data are bundled in the source release.

Machine-readable test receipts
{
  "recognition": {
    "passed": true,
    "synthetic_speech": true,
    "physical_microphone": false,
    "rows": [
      {
        "model": "nemotron",
        "case": 0,
        "repeat": 0,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robbie, kannst du bitte einen lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 55.8,
        "asr_ms": 52.82,
        "wer": 0.2222,
        "passed": true
      },
      {
        "model": "nemotron",
        "case": 1,
        "repeat": 0,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen.  Bitte antworte mir ganz ruhig",
        "audio_s": 4.51,
        "http_ms": 66.9,
        "asr_ms": 65.13,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "nemotron",
        "case": 2,
        "repeat": 0,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 59.2,
        "asr_ms": 57.34,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "nemotron",
        "case": 0,
        "repeat": 1,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robbie, kannst du bitte einen lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 59.58,
        "asr_ms": 57.81,
        "wer": 0.2222,
        "passed": true
      },
      {
        "model": "nemotron",
        "case": 1,
        "repeat": 1,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen.  Bitte antworte mir ganz ruhig",
        "audio_s": 4.51,
        "http_ms": 61.74,
        "asr_ms": 59.99,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "nemotron",
        "case": 2,
        "repeat": 1,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 59.01,
        "asr_ms": 57.25,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "moonshine_de",
        "case": 0,
        "repeat": 0,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 173.36,
        "asr_ms": 171.3,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "moonshine_de",
        "case": 1,
        "repeat": 0,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "audio_s": 4.51,
        "http_ms": 143.94,
        "asr_ms": 142.05,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "moonshine_de",
        "case": 2,
        "repeat": 0,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 102.72,
        "asr_ms": 100.93,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "moonshine_de",
        "case": 0,
        "repeat": 1,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 133.3,
        "asr_ms": 131.53,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "moonshine_de",
        "case": 1,
        "repeat": 1,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "audio_s": 4.51,
        "http_ms": 135.49,
        "asr_ms": 133.5,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "moonshine_de",
        "case": 2,
        "repeat": 1,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 98.96,
        "asr_ms": 97.04,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "nemotron_de",
        "case": 0,
        "repeat": 0,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "hallo robbie kannst du bitte einen lustige grimasse machen",
        "audio_s": 3.6,
        "http_ms": 85.29,
        "asr_ms": 83.21,
        "wer": 0.2222,
        "passed": true
      },
      {
        "model": "nemotron_de",
        "case": 1,
        "repeat": 0,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "heute möchte ich über äpfel sprechen bitte antworte mir ganz ruhig",
        "audio_s": 4.51,
        "http_ms": 99.68,
        "asr_ms": 97.62,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "nemotron_de",
        "case": 2,
        "repeat": 0,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "mein zug fährt am halb sieben nach münchen",
        "audio_s": 3.39,
        "http_ms": 82.39,
        "asr_ms": 80.72,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "nemotron_de",
        "case": 0,
        "repeat": 1,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "hallo robbie kannst du bitte einen lustige grimasse machen",
        "audio_s": 3.6,
        "http_ms": 81.04,
        "asr_ms": 79.02,
        "wer": 0.2222,
        "passed": true
      },
      {
        "model": "nemotron_de",
        "case": 1,
        "repeat": 1,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "heute möchte ich über äpfel sprechen bitte antworte mir ganz ruhig",
        "audio_s": 4.51,
        "http_ms": 96.01,
        "asr_ms": 93.83,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "nemotron_de",
        "case": 2,
        "repeat": 1,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "mein zug fährt am halb sieben nach münchen",
        "audio_s": 3.39,
        "http_ms": 77.95,
        "asr_ms": 76.1,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "parakeet_v3",
        "case": 0,
        "repeat": 0,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 68.74,
        "asr_ms": 66.7,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "parakeet_v3",
        "case": 1,
        "repeat": 0,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "audio_s": 4.51,
        "http_ms": 65.69,
        "asr_ms": 63.65,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "parakeet_v3",
        "case": 2,
        "repeat": 0,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 59.83,
        "asr_ms": 58.01,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "parakeet_v3",
        "case": 0,
        "repeat": 1,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 58.92,
        "asr_ms": 57.01,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "parakeet_v3",
        "case": 1,
        "repeat": 1,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "audio_s": 4.51,
        "http_ms": 57.7,
        "asr_ms": 55.43,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "parakeet_v3",
        "case": 2,
        "repeat": 1,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 53.43,
        "asr_ms": 51.62,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "whisper_turbo",
        "case": 0,
        "repeat": 0,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 239.62,
        "asr_ms": 237.6,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "whisper_turbo",
        "case": 1,
        "repeat": 0,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "audio_s": 4.51,
        "http_ms": 131.97,
        "asr_ms": 130.02,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "whisper_turbo",
        "case": 2,
        "repeat": 0,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 126.0,
        "asr_ms": 124.32,
        "wer": 0.125,
        "passed": true
      },
      {
        "model": "whisper_turbo",
        "case": 0,
        "repeat": 1,
        "reference": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "audio_s": 3.6,
        "http_ms": 128.04,
        "asr_ms": 126.31,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "whisper_turbo",
        "case": 1,
        "repeat": 1,
        "reference": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "transcript": "Heute möchte ich über Äpfel sprechen. Bitte antworte mir ganz ruhig.",
        "audio_s": 4.51,
        "http_ms": 132.1,
        "asr_ms": 130.52,
        "wer": 0.0,
        "passed": true
      },
      {
        "model": "whisper_turbo",
        "case": 2,
        "repeat": 1,
        "reference": "Mein Zug fährt um halb sieben nach München.",
        "transcript": "Mein Zug fährt am halb sieben nach München.",
        "audio_s": 3.39,
        "http_ms": 125.23,
        "asr_ms": 123.48,
        "wer": 0.125,
        "passed": true
      }
    ],
    "switches": [
      {
        "model": "nemotron",
        "ready": true,
        "switch_ms": 739.76
      },
      {
        "model": "moonshine_de",
        "ready": true,
        "switch_ms": 62.84
      },
      {
        "model": "nemotron_de",
        "ready": true,
        "switch_ms": 331.76
      },
      {
        "model": "parakeet_v3",
        "ready": true,
        "switch_ms": 854.36
      },
      {
        "model": "whisper_turbo",
        "ready": true,
        "switch_ms": 691.31
      }
    ],
    "languages": [
      {
        "input": "Tell me what we could play together.",
        "expected": "de",
        "reply": "Wir könnten ein Abenteuer im leuchtenden Galaxien-Wald spielen, wo wir kleine, neugierige Roboter sind!",
        "passed": true
      },
      {
        "input": "Bitte schlage mir ein Spiel vor.",
        "expected": "de",
        "reply": "Wir könnten ein Detektivspiel spielen, wo ich dir kryptische Hinweise gebe und du die Wahrheit herausfindest!",
        "passed": true
      },
      {
        "input": "Please answer in English: suggest a game.",
        "expected": "en",
        "reply": "We could play a 'Robot Riddle Relay' where I give a tricky riddle and you give me a clever answer, then we swap!",
        "passed": true
      }
    ],
    "started": 1793005109.329222,
    "all_cpu_cached_after_offload": {
      "active_gpu_model": null,
      "device": "cuda:0",
      "models": [
        {
          "id": "nemotron",
          "label": "Nemotron 3.5 · original",
          "repo": "nvidia/nemotron-3.5-asr-streaming-0.6b",
          "revision": "bundled-with-tyger",
          "kind": "native",
          "mode": "Live Nemotron preview + neural speech-pause final check",
          "phase": "resident",
          "ready": true
        },
        {
          "id": "moonshine_de",
          "label": "Moonshine Streaming Small · German",
          "repo": "moonshine-ai/moonshine-streaming-small-de",
          "revision": "56473ba32b22b484fdfc7eb03d34c393ff494197",
          "kind": "moonshine",
          "mode": "Nemotron preview + German Moonshine final after a speech pause",
          "phase": "cpu_ready",
          "error": null,
          "cpu_bytes": 451488996,
          "ready": true
        },
        {
          "id": "nemotron_de",
          "label": "Nemotron 3.5 · German telephony",
          "repo": "BotgenossenGmbH/nemotron-3.5-asr-de-telephony",
          "revision": "afa1e25c8697ba55bc234087c46d954065cd7678",
          "kind": "telephony",
          "mode": "Nemotron preview + German telephony-adapted final after a speech pause",
          "phase": "cpu_ready",
          "error": null,
          "cpu_bytes": 2551988352,
          "ready": true
        },
        {
          "id": "parakeet_v3",
          "label": "Parakeet TDT v3 · multilingual",
          "repo": "nvidia/parakeet-tdt-0.6b-v3",
          "revision": "541d1f99c6b0c3cd0b11a95167540bb8edefd82b",
          "kind": "parakeet",
          "mode": "Nemotron preview + Parakeet v3 final after a speech pause",
          "phase": "cpu_ready",
          "error": null,
          "cpu_bytes": 2508032536,
          "ready": true
        },
        {
          "id": "whisper_turbo",
          "label": "Whisper Large v3 Turbo · German",
          "repo": "deepdml/faster-whisper-large-v3-turbo-ct2",
          "revision": "4df90f75321148c3a29a9e2351b7ddf8f5b115a8",
          "kind": "whisper",
          "mode": "Hybrid: Nemotron preview / TYGER + CPU VAD + Whisper final",
          "phase": "cpu_ready",
          "error": null,
          "cpu_bytes": 1617884929,
          "ready": true
        }
      ],
      "strategy": "Original Nemotron/TYGER stays resident; one selected extra recognizer on GPU; others cached in CPU RAM."
    },
    "finished": 1793005115.9199758
  },
  "https_browser": {
    "passed": true,
    "physical_microphone": false,
    "url": "https://arrive-locations-parade-research.trycloudflare.com",
    "rows": [
      {
        "model": "nemotron",
        "passed": true,
        "transcript": "Hallo Robbie, kannst du bitte einen lustige Grimasse machen?",
        "selected_final_asr": {
          "model": "nemotron"
        },
        "speech_pause_ms": 400,
        "pcm_chunks": 13,
        "saved_choice": "nemotron",
        "reply": "Ach, du willst eine Grimasse? Meine Schaltkreise vibrieren vor Freude!\nHier, eine ganz lustige für dich!",
        "browser_errors": []
      },
      {
        "model": "moonshine_de",
        "passed": true,
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "selected_final_asr": {
          "text": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
          "model": "moonshine_de",
          "chunks": 1,
          "transcribe_ms": 147.86
        },
        "speech_pause_ms": 400,
        "pcm_chunks": 8,
        "saved_choice": "moonshine_de",
        "reply": "Na klar, das mache ich sofort!\nIst das lustig genug für dich?",
        "browser_errors": []
      },
      {
        "model": "nemotron_de",
        "passed": true,
        "transcript": "hallo robbie kannst du bitte eine lustige grimasse machen",
        "selected_final_asr": {
          "text": "hallo robbie kannst du bitte eine lustige grimasse machen",
          "model": "nemotron_de",
          "chunks": 1,
          "transcribe_ms": 101.98
        },
        "speech_pause_ms": 400,
        "pcm_chunks": 12,
        "saved_choice": "nemotron_de",
        "reply": "Na klar, das mache ich sofort!\n*Grimace performed*\nIst das lustig genug für dich?",
        "browser_errors": []
      },
      {
        "model": "parakeet_v3",
        "passed": true,
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "selected_final_asr": {
          "text": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
          "model": "parakeet_v3",
          "chunks": 1,
          "transcribe_ms": 66.14
        },
        "speech_pause_ms": 400,
        "pcm_chunks": 9,
        "saved_choice": "parakeet_v3",
        "reply": "Na klar, das mache ich sofort!\nMeine Schaltkreise sind für lustige Grimassen optimiert!",
        "browser_errors": []
      },
      {
        "model": "whisper_turbo",
        "passed": true,
        "transcript": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
        "selected_final_asr": {
          "text": "Hallo Robby, kannst du bitte eine lustige Grimasse machen?",
          "model": "whisper_turbo",
          "chunks": 1,
          "transcribe_ms": 154.51
        },
        "speech_pause_ms": 400,
        "pcm_chunks": 8,
        "saved_choice": "whisper_turbo",
        "reply": "Na klar, das mach ich sofort!\nHoffentlich war die Grimasse lustig für dich!",
        "browser_errors": []
      }
    ],
    "started": 1793005148.1041818,
    "finished": 1793005238.042415
  },
  "controls_browser": {
    "passed": true,
    "started": 1793004849.418737,
    "physical_microphone": false,
    "mobile_select_fits": true,
    "reload_persists": true,
    "repeat_switches": true,
    "errors": [],
    "finished": 1793004852.7621338
  },
  "unit": {
    "finished": 1793004907.0566285,
    "modules": [
      "test_audio_input",
      "test_asr_priority",
      "test_gpu_guard",
      "test_enrollment_cues",
      "test_recovery_rules",
      "test_stop_commands",
      "test_live_decisions",
      "test_laya_policy",
      "test_conversation_prompt",
      "test_conversation_director",
      "test_shared_turn",
      "test_speaker_names",
      "test_speaker_session",
      "test_speaker_turns",
      "test_identity",
      "test_speaker_teacher",
      "test_bridge",
      "test_performance",
      "speaker_v2.test_predictor",
      "speaker_v4.test_v4",
      "speaker_v5.test_v5",
      "speaker_live.test_playback",
      "test_open_speakers",
      "test_knowledge_tools",
      "test_audio_transport",
      "test_stop_feedback",
      "test_stop_voice",
      "test_release_scan",
      "test_avatar_actions",
      "test_avatar_commands",
      "test_avatar_personality",
      "test_bolt",
      "test_pause_endpoint",
      "test_asr_choice",
      "test_visual_identity"
    ],
    "tests": 372,
    "failures": 0,
    "errors": 0,
    "skipped": 0,
    "passed": true,
    "network_or_physical_microphone_used": false
  }
}

Generated 2026-10-26 09:01 UTC.