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-model | aufklarer/MOSS-TTS-Nano-100M-CoreML | Репозиторий модели или локальный каталог |
--moss-nano-compute-units | cpu | cpu или gpu |
--moss-nano-max-frames | 300 | Максимум кадров по 80 мс; нужен естественный конец |
--moss-nano-seed | 0 | Воспроизводимый сид семплирования 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 | Первый токен: первый / прогретый / кэш | Первое аудио: первое / прогретое / кэш |
|---|---|---|---|
| CPU | 779 MiB | 542 / 203 / 52 ms | 563 / 216 / 65 ms |
| CPU+GPU | 731 MiB | 649 / 225 / 24 ms | 741 / 245 / 48 ms |
Swift · Release
Нативная Swift release CLI на том же M5 Pro: один запрос на новый процесс с теми же эталоном, текстом и сидом. Подготовка эталона включена, загрузка моделей синтеза исключена. RSS — весь процесс CLI без весов ASR. Прочерки означают неизмеренные прогретые/кэшированные случаи. Обе записи точно воспроизвели запрошенную фразу при независимой ASR.
| Бэкенд | Пиковый RSS | Первый токен: первый / прогретый / кэш | Первое аудио: первое / прогретое / кэш |
|---|---|---|---|
| CPU | 670.7 MiB | 537 / — / — ms | 560 / — / — ms |
| CPU+GPU | 602.5 MiB | 570 / — / — ms | 645 / — / — ms |