MOSS-TTS-Nano

Streaming-Sprachsynthese und Stimmklonen mit CoreML, 48 kHz Stereo und 80-ms-Blöcken.

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

CLI

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 klont eine Stimme ohne Referenztranskript. Mono-Referenzen werden zu Stereo dupliziert, auf 48 kHz resampelt und auf volle 80 ms aufgefüllt. Eine Referenz einmal kodieren und ihre Codes für weitere Anfragen wiederverwenden.

--moss-nano-modelaufklarer/MOSS-TTS-Nano-100M-CoreMLModell-Repository oder lokales Verzeichnis
--moss-nano-compute-unitscpucpu oder gpu
--moss-nano-max-frames300Maximale 80-ms-Frames; natürliches Ende erforderlich
--moss-nano-seed0Reproduzierbarer Swift-Sampling-Seed

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 serialisiert Anfragen und erzeugt pro Äußerung einen neuen CoreML-Zustand. synthesize und synthesizeStream erhalten Stereo; SpeechGenerationModel liefert eine Mono-Mischung. language: nil übergeben. Streams enden mit einer leeren Abschlussmarkierung.

Grenzen und Messungen

macOS 15+ / iOS 18+; vier kompilierte Modelle mit insgesamt 367,6 MB. Prompt, Referenz und angeforderte Frames teilen sich 1.024 Kontextzeilen. Überlauf und maxFrames vor dem natürlichen Sprachende lösen Fehler aus. Standard ist CPU; gpu erlaubt CPU+GPU. PCG64-Seeds sind NumPy-kompatibel; numerische Backend-Unterschiede können die Ausgabe dennoch ändern.

Python/CoreML auf M5 Pro, 48 GB, macOS 26.6.2; eigene Prozesse und fünf warme Anfragen je Fall. Referenz: 2,72 s. Erst-/Warmwerte enthalten Lesen, Encoderladen und Referenzkodierung; der Cache verwendet vorhandene Codes. Das Laden der Synthesemodelle ist ausgeschlossen. RSS umfasst den gesamten Python-Prozess ohne PyTorch oder ASR. Keine Swift-/iPhone-Messung oder Bewertung der Sprecherähnlichkeit.

BackendSpitzen-RSSErstes Token: erst / warm / CacheErstes Audio: erst / warm / Cache
CPU779 MiB542 / 203 / 52 ms563 / 216 / 65 ms
CPU+GPU731 MiB649 / 225 / 24 ms741 / 245 / 48 ms

Swift · Release

Native Swift-release-CLI auf demselben M5 Pro: eine Anfrage je neuem Prozess mit gleicher Referenz, Text und Seed. Referenzvorbereitung ist enthalten, Laden der Synthesemodelle ausgeschlossen. RSS umfasst die gesamte CLI ohne ASR-Gewichte. Striche kennzeichnen ungemessene Warm-/Cache-Fälle. Beide Ausgaben ergaben bei unabhängiger ASR exakt den angeforderten Satz.

BackendSpitzen-RSSErstes Token: erst / warm / CacheErstes Audio: erst / warm / Cache
CPU670.7 MiB537 / — / — ms560 / — / — ms
CPU+GPU602.5 MiB570 / — / — ms645 / — / — ms

MossTTSNano · OpenMOSS