MOSS-TTS-Nano
Síntese de voz em streaming e clonagem com CoreML, áudio estéreo de 48 kHz e blocos 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.wavUse --voice-sample para clonar uma voz sem transcrição da referência. Referências mono são duplicadas em estéreo, reamostradas para 48 kHz e preenchidas até um limite de 80 ms. Codifique uma vez e reutilize os códigos.
--moss-nano-model | aufklarer/MOSS-TTS-Nano-100M-CoreML | Repositório do modelo ou diretório local |
--moss-nano-compute-units | cpu | cpu ou gpu |
--moss-nano-max-frames | 300 | Máximo de quadros de 80 ms; exige fim natural |
--moss-nano-seed | 0 | Semente reproduzível de amostragem Swift |
API 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 pedidos e cria um novo estado CoreML por fala. synthesize e synthesizeStream preservam estéreo; SpeechGenerationModel retorna uma mistura mono. Passe language: nil. O fluxo termina com um marcador final vazio.
Limites e medições
macOS 15+ / iOS 18+; quatro modelos compilados somam 367,6 MB. Prompt, referência e quadros solicitados compartilham 1.024 linhas de contexto. Excesso de contexto ou atingir maxFrames antes do fim natural gera erro. CPU é o padrão; gpu permite CPU+GPU. As sementes PCG64 são compatíveis com NumPy; diferenças numéricas entre backends podem alterar a saída.
Python/CoreML no M5 Pro, 48 GB, macOS 26.6.2; processos separados e cinco pedidos aquecidos por caso. Referência de 2,72 s. Tempos iniciais/aquecidos incluem leitura, carregamento do codificador e codificação; o cache reutiliza códigos. Exclui o carregamento dos modelos de síntese. RSS cobre todo o processo Python sem PyTorch ou ASR. Não são medições Swift/iPhone nem de semelhança do falante.
| Backend | Pico de RSS | Primeiro token: inicial / aquecido / cache | Primeiro áudio: inicial / aquecido / cache |
|---|---|---|---|
| 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 Swift release no mesmo M5 Pro: um pedido por processo novo com a mesma referência, texto e semente. Inclui preparação da referência e exclui carga dos modelos de síntese. RSS cobre toda a CLI sem pesos ASR. Traços indicam casos aquecidos/com cache não medidos. Ambas as saídas passaram pela ASR independente com a frase exata.
| Backend | Pico de RSS | Primeiro token: inicial / aquecido / cache | Primeiro áudio: inicial / aquecido / cache |
|---|---|---|---|
| CPU | 670.7 MiB | 537 / — / — ms | 560 / — / — ms |
| CPU+GPU | 602.5 MiB | 570 / — / — ms | 645 / — / — ms |