{
  "schema": 1,
  "reviewedAt": "2026-10-16",
  "hardware": {
    "chip": "Apple M4 Pro",
    "unifiedMemoryGiB": 48,
    "macModel": "Mac16,11",
    "powerMeasured": false,
    "powerNote": "powermetrics требует superuser.60Wпод нагрузкой — допущение; Apple5/140W относятся к другой конфигурации64GB/8TB, не к нашему48GB.",
    "powerSource": "https://support.apple.com/en-us/103253"
  },
  "models": {
    "mini-cascade": {
      "summary": "Основной контрольный композит: отдельные ASR0.6B, Qwen3-4B4bit и Qwen TTS0.6B8bit. Потоковый синтез Serena; простая проверка текста и сценарные действия после ASR.",
      "russian": "Русский заявлен у ASR/TTS; Serena — китайский исходный тембр с межъязычной речью, ударения нужно слушать. В наших тестах исправление пятницы19:30 сохранено.",
      "limitation": "Три разных модели и остановка по VAD; ошибки ASR могут перейти в LLM. Это не устаревшая архитектура: она удобнее для контролируемых инструментов и проверки реквизитов.",
      "streaming": "Потоковый TTS после полного короткого ответа LLM",
      "memoryScope": "MLX-пик процесса композита, не RAM всей машины",
      "sources": [
        "https://github.com/QwenLM/Qwen3-ASR",
        "https://github.com/QwenLM/Qwen3-TTS"
      ],
      "model": "mlx-community/Qwen3-ASR-0.6B-8bit@89e96d92ba34aca20b3e29fb10cc284097d1219f → mlx-community/Qwen3-4B-4bit@4dcb3d101c2a062e5c1d4bb173588c54ea6c4d25 → mlx-community/Qwen3-TTS-12Hz-0.6B-CustomVoice-8bit@049ef77fe8816b536193c0c25f9a214d17921282",
      "id": "mini-cascade",
      "voice": "Serena",
      "russianQualified": true,
      "measurement": {
        "turns": 3,
        "generationMs": 2107.6666666666665,
        "firstAudioMs": 997.3333333333334,
        "outputSeconds": 4.88,
        "peakMlxGiB": 5.689,
        "ttsPeakGiB": null,
        "browserMedianMs": 2220,
        "asrMs": 203,
        "llmMs": 671.3333333333334,
        "ttsFirstMs": 123.33333333333333,
        "at": "2026-10-16T19:27:38.774Z",
        "voice": "Serena",
        "source": "mac-analysis/mini-cascade-webrtc.json",
        "model": "mlx-community/Qwen3-ASR-0.6B-8bit@89e96d92ba34aca20b3e29fb10cc284097d1219f → mlx-community/Qwen3-4B-4bit@4dcb3d101c2a062e5c1d4bb173588c54ea6c4d25 → mlx-community/Qwen3-TTS-12Hz-0.6B-CustomVoice-8bit@049ef77fe8816b536193c0c25f9a214d17921282",
        "sha256": "dda6b3b93bfd2c729fa48a62c64b025b70b13705ab30d1f02a21ece9c31dee48",
        "preparation": {
          "prepared": true,
          "cached": false,
          "duration_ms": 1378,
          "profile": "mini-cascade",
          "voice": "Serena",
          "synthetic": true
        }
      },
      "observedAnswers": [
        "Алена, уточните, пожалуйста, точное время завтра.",
        "Алена, вы хотите записаться на пятницу в 19:30?",
        "Алена, вы выбрали пятницу в 19:30."
      ]
    },
    "qwen-omni": {
      "summary": "Нативный S2S Thinker–Talker MoE30B-A3B, сторонняя HybridQuantMLX-конверсия. Аудиовход и аудиовыход без скрытого отдельного STT/TTS.",
      "russian": "Upstream прямо заявляет русский на входе и выходе. На нашем Mini есть русские ответы; независимой оценки качества нет.",
      "limitation": "В MLX-порте сначала завершается текст Thinker, затем идёт Talker. Наш транспорт работает по репликам; наличие streaming не означает full-duplex. Инструменты в стенде пока не подключены.",
      "streaming": "Talker выдаёт аудио частями после Thinker",
      "memoryScope": "MLX-пик единого Omni-процесса; A3B не означает3B хранимых весов",
      "sources": [
        "https://github.com/QwenLM/Qwen3-Omni",
        "https://huggingface.co/ZolMik2004/Qwen3-Omni-30B-A3B-Instruct-HybridQuant-MLX"
      ],
      "model": "ZolMik2004/Qwen3-Omni-30B-A3B-Instruct-HybridQuant-MLX@49a7decb47c312dcce58a7ab2ae8ea97a083696c",
      "id": "qwen-omni",
      "voice": "Chelsie",
      "russianQualified": true,
      "measurement": {
        "turns": 3,
        "generationMs": 4054.3333333333335,
        "firstAudioMs": 1251.3333333333333,
        "outputSeconds": 5.546666666666667,
        "peakMlxGiB": 22.893,
        "ttsPeakGiB": null,
        "browserMedianMs": 2340.2999999970198,
        "asrMs": null,
        "llmMs": null,
        "ttsFirstMs": null,
        "at": "2026-10-16T19:28:21.177Z",
        "voice": "Chelsie",
        "source": "mac-analysis/qwen-omni-webrtc.json",
        "model": "ZolMik2004/Qwen3-Omni-30B-A3B-Instruct-HybridQuant-MLX@49a7decb47c312dcce58a7ab2ae8ea97a083696c",
        "sha256": "f3b7d202d0b207145a8d6b44448c7358fc48232bff6e17cc9386c8cf4a997991",
        "preparation": {
          "prepared": true,
          "cached": false,
          "duration_ms": 3192,
          "profile": "qwen-omni",
          "voice": "Chelsie",
          "synthetic": true
        }
      },
      "observedAnswers": [
        "Алена, запись на завтра после 18:00?",
        "Алена, запись на пятницу в 19:30?",
        "Алена, запись на пятницу в 19:30."
      ]
    },
    "mini-cosyvoice3": {
      "summary": "Те же ASR/LLM, заменён только TTS: CosyVoice3-0.5B8bit через SwiftMLX. Номера1/2/3 — стили подачи.",
      "russian": "Русский входит в заявленные языки upstream. Сохранены реальные русские образцы и трёхрепличный разговор на Mini; субъективный голос не оценён. В свежем прогоне ASR превратил «в пятницу» в «в пять низу»; защита сохранила19:30 и запросила день, вместо выдуманного подтверждения.",
      "limitation": "В upstream есть streaming, но наш конкретный Swift-порт возвращает целую фразу. Поэтому первые аудиоданные зависят от длины ответа. Голосовые инструменты этой связки не подключены.",
      "streaming": "Наш порт: целая фраза; возможность upstream другая",
      "memoryScope": "TTS-пик отдельного Swift-процесса; дополнительно ASR/LLM, их нельзя потерять в оценке RAM",
      "sources": [
        "https://github.com/QwenAudio/CosyVoice",
        "https://github.com/soniqo/speech-swift"
      ],
      "model": "mlx-community/Qwen3-ASR-0.6B-8bit@89e96d92ba34aca20b3e29fb10cc284097d1219f → mlx-community/Qwen3-4B-4bit@4dcb3d101c2a062e5c1d4bb173588c54ea6c4d25 → aufklarer/CosyVoice3-0.5B-MLX-8bit@c9ebb1a5dabe0a5c19c76c4cc65fb7593d73c337",
      "id": "mini-cosyvoice3",
      "voice": "1",
      "russianQualified": true,
      "measurement": {
        "turns": 3,
        "generationMs": 2147,
        "firstAudioMs": 2146.6666666666665,
        "outputSeconds": 3.9733333333333336,
        "peakMlxGiB": null,
        "ttsPeakGiB": 2.6509316647425294,
        "browserMedianMs": 3258.9000000059605,
        "asrMs": 220.66666666666666,
        "llmMs": null,
        "ttsFirstMs": 1336.3333333333333,
        "at": "2026-10-16T19:29:12.799Z",
        "voice": "3",
        "source": "mac-analysis/mini-cosyvoice3-webrtc.json",
        "model": "mlx-community/Qwen3-ASR-0.6B-8bit@89e96d92ba34aca20b3e29fb10cc284097d1219f → mlx-community/Qwen3-4B-4bit@4dcb3d101c2a062e5c1d4bb173588c54ea6c4d25 → aufklarer/CosyVoice3-0.5B-MLX-8bit@c9ebb1a5dabe0a5c19c76c4cc65fb7593d73c337",
        "sha256": "fe6a056d56c1d1da31af2e730083dcafec29a4e6df2c49be6b66afc19f948224",
        "preparation": {
          "prepared": true,
          "cached": false,
          "duration_ms": 3676,
          "profile": "mini-cosyvoice3",
          "voice": "3",
          "synthetic": true
        }
      },
      "observedAnswers": [
        "Алена, уточни время завтра после шести.",
        "Я услышала 19:30. Уточните, пожалуйста, день.",
        "Я услышала 19:30. Уточните, пожалуйста, день."
      ]
    },
    "mini-voxcpm2": {
      "summary": "Те же ASR/LLM, VoxCPM2-2B8bit в роли TTS. Многоязычная генерация, варианты подачи через описание.",
      "russian": "Русский есть среди30 заявленных языков. У нас возвращаются русские ответы, сохранены образцы трёх вариантов.",
      "limitation": "Upstream поддерживает streaming, но наш вызов MLX собирает всю фразу. По старым3 репликам один TTS занимал2.87–4.19s. Замер NVIDIA4090 из README нельзя переносить на M4Pro. В текущем ответе обращается на «ты»: деловой стиль требует отдельной проверки.",
      "streaming": "Наш порт: целая фраза",
      "memoryScope": "MLX-пик процесса ASR+LLM+TTS, не RAM всей машины",
      "sources": [
        "https://github.com/OpenBMB/VoxCPM",
        "https://huggingface.co/mlx-community/VoxCPM2-8bit"
      ],
      "model": "mlx-community/Qwen3-ASR-0.6B-8bit@89e96d92ba34aca20b3e29fb10cc284097d1219f → mlx-community/Qwen3-4B-4bit@4dcb3d101c2a062e5c1d4bb173588c54ea6c4d25 → mlx-community/VoxCPM2-8bit@d52725898a0675703f7f9ddc5a4d1a3cdbb99032",
      "id": "mini-voxcpm2",
      "voice": "1",
      "russianQualified": true,
      "measurement": {
        "turns": 3,
        "generationMs": 3711.6666666666665,
        "firstAudioMs": 3708,
        "outputSeconds": 3.0401666666666665,
        "peakMlxGiB": 8.445,
        "ttsPeakGiB": null,
        "browserMedianMs": 4759.10000000149,
        "asrMs": 204.33333333333334,
        "llmMs": null,
        "ttsFirstMs": 2862.3333333333335,
        "at": "2026-10-16T19:29:55.434Z",
        "voice": "3",
        "source": "mac-analysis/mini-voxcpm2-webrtc.json",
        "model": "mlx-community/Qwen3-ASR-0.6B-8bit@89e96d92ba34aca20b3e29fb10cc284097d1219f → mlx-community/Qwen3-4B-4bit@4dcb3d101c2a062e5c1d4bb173588c54ea6c4d25 → mlx-community/VoxCPM2-8bit@d52725898a0675703f7f9ddc5a4d1a3cdbb99032",
        "sha256": "5048047d5c9b18191f499d326e98e37f5e06b25a281f75ec97f2738a27fcfd75",
        "preparation": {
          "prepared": true,
          "cached": false,
          "duration_ms": 2369,
          "profile": "mini-voxcpm2",
          "voice": "3",
          "synthetic": true
        }
      },
      "observedAnswers": [
        "Алена, уточни время завтра после шести.",
        "Алена, уточни: пятница, 19:30.",
        "Алена, ты выбрала пятницу, 19:30."
      ]
    },
    "mini-minicpm": {
      "summary": "MiniCPM-o4.5:9B, GGUFQ4_K_M плюс F16аудиомодули, C++/Metal. Нативный аудиоцикл без скрытого каскада.",
      "russian": "Официальный речевой режим рассчитан на китайский/английский. В наших тестах ответыzh/en не по русской задаче; для русского демо не квалифицирован.",
      "limitation": "Full-duplex есть в upstream, в нашем адаптере не проверен. Не считать неподходящий длинный ответ дешёвым успешным русским разговором.",
      "streaming": "Аудио частями, сессия в стенде по репликам",
      "memoryScope": "Пик памяти native C++/Metal пока не измерен; размерGGUF не является RAM",
      "sources": [
        "https://github.com/OpenBMB/MiniCPM-V/blob/main/docs/minicpm_o4dot5_en.md"
      ],
      "model": "openbmb/MiniCPM-o-4_5-gguf@db25077c33951fe163b42986fba0132e279872a2",
      "id": "mini-minicpm",
      "voice": "1",
      "russianQualified": false,
      "measurement": {
        "turns": 1,
        "generationMs": 21052,
        "firstAudioMs": 1822,
        "outputSeconds": 18.12,
        "peakMlxGiB": null,
        "ttsPeakGiB": null,
        "browserMedianMs": 2820.5,
        "asrMs": null,
        "llmMs": null,
        "ttsFirstMs": null,
        "at": "2026-10-16T19:50:08.741Z",
        "voice": "1",
        "source": "mac-analysis/minicpm-post-guard.json",
        "model": "openbmb/MiniCPM-o-4_5-gguf@db25077c33951fe163b42986fba0132e279872a2",
        "sha256": "6efd0c951840fd74722d8e0c14c5f6523b9f5d3c3b0e8dbc8ee1fede6d95fb94",
        "preparation": {
          "prepared": true,
          "cached": false,
          "duration_ms": 27689,
          "profile": "mini-minicpm",
          "voice": "1",
          "synthetic": true
        }
      },
      "observedAnswers": [
        "你看俄罗斯人是怎么在地铁里谈恋爱的呢？ 哎哟，他们可直接了，站台上一见面就说，亲爱的，下一站就是我的家了。 然后那个姑娘就咯咯笑，哎哟，你还真会拐弯抹角啊，我可不想坐完这趟车还得再走十分钟。"
      ]
    },
    "own-gigachat": {
      "summary": "Ранее проверен nglain/voiceagent на коммитеbae90492: GigaChatLLM/SaluteTTS используют API. Набор локальных весов этой сборки не установлен.",
      "russian": "Полностью контурный речевой цикл этой сборки не подтверждён.",
      "limitation": "Профиль оставлен отдельным и недоступным. Корпоративная поставка Сбера не подставляется вместо него.6–8₽/мин не подтверждены вычислительным замером.",
      "sources": [
        "https://github.com/nglain/voiceagent"
      ],
      "model": null,
      "id": "own-gigachat",
      "voice": null,
      "russianQualified": false
    }
  },
  "candidateNotes": [
    {
      "name": "PersonaPlex7B",
      "status": "Не установлен; русский не подтверждён, поэтому не подменяет русский контур. Модель требует принятия отдельной лицензии весов.",
      "source": "https://github.com/NVIDIA/personaplex"
    },
    {
      "name": "Step-Audio2/mini",
      "status": "Не установлен; отдельная проверка русского и порта Apple требуется. Старый Step-Audio130B не рассматривается как готовая модель для48GB.",
      "source": "https://github.com/stepfun-ai/Step-Audio2"
    }
  ],
  "costMethod": "Время runtime в секундах на реплику ×реплик/мин. Это wall-time процесса, не измеренная загрузка GPU. Нижний сценарий делит вычислительный бюджет между звонками с запасом; он требует нового планировщика и нагрузочного теста. Верхний сценарий — по одному Mini на параллельный звонок, как текущий runtime, плюс резерв. Цена включает износ и электричество, без телефонии, внедрения и сопровождения."
}