MOSS-TTS-Nano

Потоковый синтез и клонирование голоса через CoreML: стерео 48 кГц и блоки по 80 мс.

Apache-2.0 · aufklarer/MOSS-TTS-Nano-100M-CoreML

Командная строка

speech speak "Hello world." --engine moss-nano -o hello.wav
speech speak "The weather is nice today." --engine moss-nano \
  --voice-sample reference.wav --moss-nano-seed 1 -o cloned.wav
speech speak "Hello world." --engine moss-nano --stream --play -o streamed.wav

Для клонирования укажите --voice-sample; текст эталонной записи не нужен. Моно дублируется в стерео, пересчитывается в 48 кГц и дополняется до границы 80 мс. Закодируйте эталон один раз и используйте коды повторно.

--moss-nano-modelaufklarer/MOSS-TTS-Nano-100M-CoreMLРепозиторий модели или локальный каталог
--moss-nano-compute-unitscpucpu или gpu
--moss-nano-max-frames300Максимум кадров по 80 мс; нужен естественный конец
--moss-nano-seed0Воспроизводимый сид семплирования Swift

Swift API

import AudioCommon
import MossTTSNano

let model = try await MossTTSNanoModel.fromPretrained()
let reference = try await model.encodeReference(url: referenceURL)
let result = try await model.synthesize(
    text: "The weather is nice today.", reference: reference,
    options: MossTTSNanoOptions(maxFrames: 300, seed: 1))
try WAVWriter.writeStereo(left: result.left, right: result.right,
    sampleRate: 48000, to: outputURL)

MossTTSNanoModel выполняет запросы последовательно и создаёт новое состояние CoreML для каждого высказывания. synthesize и synthesizeStream сохраняют стерео; SpeechGenerationModel возвращает моно. Передайте language: nil. Поток завершается пустым финальным маркером.

Ограничения и измерения

Нужны macOS 15+ / iOS 18+; четыре скомпилированных модели занимают 367,6 МБ. Промпт, эталон и запрошенные кадры делят контекст из 1 024 строк. Переполнение или достижение maxFrames до естественного конца речи вызывает ошибку. По умолчанию CPU; gpu разрешает CPU+GPU. Сиды PCG64 совместимы с NumPy; численные различия бэкендов всё же могут изменить результат.

Python/CoreML на M5 Pro, 48 ГБ, macOS 26.6.2; отдельные процессы и пять прогретых запросов на случай. Эталон — 2,72 с. Первый/прогретый запросы включают чтение, загрузку кодировщика и кодирование; кэш использует готовые коды. Загрузка моделей синтеза исключена. RSS охватывает весь Python-процесс без PyTorch и ASR. Это не измерения Swift/iPhone и не оценка сходства голосов.

БэкендПиковый RSSПервый токен: первый / прогретый / кэшПервое аудио: первое / прогретое / кэш
CPU779 MiB542 / 203 / 52 ms563 / 216 / 65 ms
CPU+GPU731 MiB649 / 225 / 24 ms741 / 245 / 48 ms

Swift · Release

Нативная Swift release CLI на том же M5 Pro: один запрос на новый процесс с теми же эталоном, текстом и сидом. Подготовка эталона включена, загрузка моделей синтеза исключена. RSS — весь процесс CLI без весов ASR. Прочерки означают неизмеренные прогретые/кэшированные случаи. Обе записи точно воспроизвели запрошенную фразу при независимой ASR.

БэкендПиковый RSSПервый токен: первый / прогретый / кэшПервое аудио: первое / прогретое / кэш
CPU670.7 MiB537 / — / — ms560 / — / — ms
CPU+GPU602.5 MiB570 / — / — ms645 / — / — ms

MossTTSNano · OpenMOSS