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.wav

Usa --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-modelaufklarer/MOSS-TTS-Nano-100M-CoreMLRepositorio del modelo o directorio local
--moss-nano-compute-unitscpucpu o gpu
--moss-nano-max-frames300Máximo de bloques de 80 ms; exige final natural
--moss-nano-seed0Semilla 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.

BackendRSS máximoPrimer token: inicial / caliente / cachéPrimer audio: inicial / caliente / caché
CPU779 MiB542 / 203 / 52 ms563 / 216 / 65 ms
CPU+GPU731 MiB649 / 225 / 24 ms741 / 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.

BackendRSS máximoPrimer token: inicial / caliente / cachéPrimer audio: inicial / caliente / caché
CPU670.7 MiB537 / — / — ms560 / — / — ms
CPU+GPU602.5 MiB570 / — / — ms645 / — / — ms

MossTTSNano · OpenMOSS