MOSS-TTS-Nano
Síntesis de voz en streaming y clonación con CoreML, audio estéreo de 48 kHz y bloques de 80 ms.
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.wavUsa --voice-sample para clonar una voz sin transcripción de referencia. Las referencias mono se duplican a estéreo, se remuestrean a 48 kHz y se rellenan hasta un límite de 80 ms. Codifica la referencia una vez y reutiliza sus códigos.
--moss-nano-model | aufklarer/MOSS-TTS-Nano-100M-CoreML | Repositorio del modelo o directorio local |
--moss-nano-compute-units | cpu | cpu o gpu |
--moss-nano-max-frames | 300 | Máximo de bloques de 80 ms; exige final natural |
--moss-nano-seed | 0 | Semilla reproducible de muestreo Swift |
API de Swift
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 serializa las solicitudes y crea un estado CoreML nuevo por frase. synthesize y synthesizeStream conservan el estéreo; SpeechGenerationModel devuelve una mezcla mono. Pasa language: nil. El flujo termina con un marcador final vacío.
Límites y mediciones
Requiere macOS 15+ / iOS 18+; los cuatro modelos compilados suman 367,6 MB. El prompt, la referencia y los fotogramas solicitados comparten 1.024 filas de contexto. Se rechaza el desbordamiento y alcanzar maxFrames antes del final natural produce un error. CPU es el valor predeterminado; gpu permite CPU+GPU. Las semillas PCG64 son compatibles con NumPy; las diferencias numéricas entre backends pueden cambiar la salida.
Python/CoreML en M5 Pro, 48 GB, macOS 26.6.2; procesos independientes y cinco solicitudes calientes por caso. Referencia de 2,72 s. Los valores iniciales/calientes incluyen lectura, carga del codificador y codificación; con caché se reutilizan los códigos. Se excluye la carga de los modelos de síntesis. RSS incluye todo el proceso Python sin PyTorch ni ASR. No son medidas de Swift o iPhone ni de similitud de voz.
| Backend | RSS máximo | Primer token: inicial / caliente / caché | Primer audio: inicial / caliente / caché |
|---|---|---|---|
| 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
CLI nativa de Swift release en el mismo M5 Pro: una solicitud por proceso nuevo con la misma referencia, texto y semilla. Incluye preparación de referencia y excluye carga de modelos de síntesis. RSS cubre toda la CLI sin pesos ASR. Los guiones indican casos calientes/con caché no medidos. Ambas salidas pasaron ASR independiente con la frase exacta.
| Backend | RSS máximo | Primer token: inicial / caliente / caché | Primer audio: inicial / caliente / caché |
|---|---|---|---|
| CPU | 670.7 MiB | 537 / — / — ms | 560 / — / — ms |
| CPU+GPU | 602.5 MiB | 570 / — / — ms | 645 / — / — ms |