Hibiki Zero-3B — перевод речи (FR / ES / PT / DE → EN)
Hibiki Zero-3B — это модель потокового перевода речь-в-речь от Kyutai: на вход подаётся аудиопоток 24 кГц на французском, испанском, португальском или немецком языке; на выходе — англоязычный аудиопоток 24 кГц плюс параллельная английская текстовая транскрипция с той же частотой кадров 12,5 Гц. Построена на многопотоковой архитектуре Moshi/Mimi: единый трансформер только-декодер совместно моделирует кодек-поток исходного аудио и потоки целевого текста и аудио, поэтому отдельного конвейера ASR + MT + TTS не нужно. Сборка Soniqo работает как квантованные MLX safetensors (по умолчанию INT4, доступен INT8) полностью на Apple Silicon. Лицензия CC-BY-4.0.
Конвейерный вариант ASR + MADLAD (speech transcribe | speech translate) даёт более 400 языков, но добавляет суммарную задержку трёх моделей. Hibiki — это одна сквозная модель, сохраняющая просодию: выбирайте её, когда нужна живая речь на целевом языке, а не только текст.
Быстрый старт
import HibikiTranslate
import AudioCommon
let model = try await HibikiTranslateModel.fromPretrained()
let pcm = try AudioFileLoader.load(url: input, targetSampleRate: 24000)
let (englishAudio, textTokens) = model.translate(
sourceAudio: pcm,
sourceLanguage: .fr // .fr / .es / .pt / .de — определяется автоматически, но передаётся для метаданных
)
try WAVWriter.write(samples: englishAudio, sampleRate: 24000, to: output)
CLI
speech audio-translate input_fr.wav -o out_en.wav --source-lang fr
speech audio-translate input_es.wav -o out_en.wav --source-lang es --quantization 8bit
speech audio-translate input_pt.wav -o out_en.wav --source-lang pt --verbose
# Детерминированный режим (используется регрессионными канарейками CI)
HIBIKI_GREEDY=1 speech audio-translate input_fr.wav -o out_en.wav --source-lang fr
# ID токенов внутреннего монолога (сырые — декодирование SPM появится позже)
speech audio-translate input.wav -o out.wav --transcript
Архитектура
Hibiki Zero-3B — это многопотоковый трансформер только-декодер с 3,1 млрд параметров. Модель совместно обрабатывает 33 потока на каждый кадр: один текстовый поток, 16 кодбуков целевого аудио (вывод агента) и 16 кодбуков исходного аудио (ввод пользователя). На каждом кадре длительностью 80 мс модель сэмплирует один текстовый токен и 16 аудиокодов через небольшой 6-слойный depformer, выполняющий 16 подшагов на кадр, по одному на каждый целевой кодбук, с 9-срезной запланированной проекцией MultiLinear.
Аудиокодек — Mimi с частотой 12,5 Гц и 16 кодбуками. Исходное аудио кодируется в 16 кодбуков исходного потока (задержка [0, 2, 2, …, 2]); сгенерированное целевое аудио заполняет 16 кодбуков целевого потока (та же схема задержек); перед тем как Mimi декодирует целевое аудио обратно в 24 кГц английский PCM, применяется покодбуковое снятие сдвига. Временная магистраль — 28 слоёв GQA (dim = 2048, 16 голов запроса, 8 голов KV, kv_repeat = 2, RoPE с разбиением пополам rope_concat, без кондиционера — Zero является безусловным вариантом).
Цикл декодирования
Hibiki выдаёт SPM-токены заполнения (id 3), пока накапливает достаточно исходного контекста для перевода, затем — содержательные текстовые токены с соответствующим целевым аудио, и наконец text-EOS (id 2). Swift-драйвер работает пока EOS не будет сэмплирован за пределами исходного окна, с предохранительным ограничением max(tSrc × 5/2, tSrc + 20) шагов. Длительность вывода на клипах в стиле FLEURS примерно в 1,0–1,6 раза превышает длительность ввода; вызывающим коду не следует считать, что output_duration == input_duration.
Авторегрессивный путь обратной связи неочевиден: на шаге t трансформер читает токены по индексу кэша step (одинаково по всем 33 потокам, с подстановкой init-токена при step ≤ delays[k]); сэмплированный текст + 16 целевых кодов записываются по индексу step + 1. Это отражает поведение upstream Moshi lm.py, где state.offsets += 1 происходит до scatter в кэш. Строка text_emb для EOS (id 2) при загрузке весов алиасится в строку 3 (PAD), повторяя патч Kyutai из loaders.py:312 «неявно заменять ранний EOS на PAD» — любой EOS, сэмплированный во время потокового аудиоокна, безвреден, цикл завершает только пост-исходный EOS.
Варианты модели
| Вариант | Квантование | Размер | Вычисления | HuggingFace |
|---|---|---|---|---|
| Hibiki Zero-3B | INT4 | ~2,7 ГБ | Metal GPU (MLX) | aufklarer/Hibiki-Zero-3B-MLX-4bit |
| Hibiki Zero-3B | INT8 | ~3,9 ГБ | Metal GPU (MLX) | aufklarer/Hibiki-Zero-3B-MLX-8bit |
Поддерживаемые языки
Hibiki Zero-3B обучен на парах французский, испанский, португальский и немецкий → английский. Swift-драйвер автоматически определяет исходный язык; флаг --source-lang используется только как метаданные.
| Источник | Статус | Пример greedy-вывода |
|---|---|---|
| FR | Строгая E2E-канарейка | «so it's a ski route.» (из «Pensez à l'itinéraire de ski…») |
| ES | Строгая E2E-канарейка | «gentlemen, the data is worrying.» (пример Hibiki europarl) |
| PT | Только предупреждение (содержательно верно, ниже recall ключевых слов) | «the fifth c is p of the martyr.» (FLEURS PT) |
| DE | Только предупреждение (содержательно верно, ниже recall ключевых слов) | «that didn't seem to me to be useful.» (FLEURS DE) |
Записанные людьми клипы FLEURS на испанском с частотой 16 кГц вызывают вырожденную генерацию как в upstream-версии на Python, так и в Swift-порте (Python выдаёт 1643 шага / ~131 с поломанного аудио, не сэмплируя EOS). Swift-канарейка для ES использует обрезанный 5-секундный фрагмент из собственного samples-пространства Kyutai (kyutai/hibiki-zero-samples) — это TTS-сгенерированное аудио 24 кГц, соответствующее обучающему распределению, и оно даёт чистый английский. Если вы подаёте Hibiki испанский в продакшене, заранее ресэмплируйте до 24 кГц и используйте более длинные клипы (от 5 с).
Переменные окружения
| Переменная | Эффект |
|---|---|
HIBIKI_GREEDY=1 | Принудительное argmax-декодирование для текста и целевого аудио. Воспроизводимо — используется строгими канарейками CI. |
HIBIKI_E2E=1 | Включить E2E-тесты (требуется загрузка модели ~2,7 ГБ). |
HIBIKI_STRICT_ALL=1 | Перевести тесты PT/DE из режима «только предупреждение» в строгий. |
HIBIKI_LENIENT=1 | Понизить тесты FR/ES со строгого режима до «только предупреждение» (только для отладки). |
HIBIKI_MODEL_ID=<repo> | Переопределить ID модели по умолчанию aufklarer/Hibiki-Zero-3B-MLX-4bit. |
Производительность (M2 Max, MLX 4-бит)
| Метрика | Greedy | Sampled |
|---|---|---|
| Задержка на шаг | ~75 мс | ~95 мс |
| Реальное время для 3,54 с источника FR | ~5 с | ~7 с |
| Длительность вывода | 1,0–1,6× источника | 1,0–1,6× источника |
Известные ограничения
translateStream()выдаёт единственный финальный чанк. Точка входа потокового перевода в настоящее время оборачивает офлайн-вызовtranslate(). Настоящее почанковое потоковое декодирование Mimi появится во второй версии.- Нет SentencePiece-декодера текста. Флаг
--transcriptвыводит сырые ID токенов. Подключение SPM-декодирования — следующий этап. - Sampled-режим заметно шумнее, чем greedy. Используйте
HIBIKI_GREEDY=1для воспроизводимых запусков. - Только квантованные версии. Репозиторий в настоящее время поставляет Zero-3B в 4-бит и 8-бит; варианты Hibiki 1B и 2B существуют в конвертере (
models/hibiki/export/convert.py), но Swift-драйвер рассчитан на layout Zero-3B с GQA + rope_concat без кондиционирования.
Ссылки
- Статья: High-Fidelity Simultaneous Speech-to-Speech Translation (Kyutai, 2025)
- Исходный код: kyutai-labs/hibiki
- Примеры: kyutai/hibiki-zero-samples
- Лицензия: CC-BY-4.0