MOSS-TTS-Nano
สังเคราะห์และโคลนเสียงแบบสตรีมด้วย CoreML ให้เสียงสเตอริโอ 48 kHz เป็นช่วงละ 80 ms
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 kHz และเติมจนครบช่วง 80 ms เข้ารหัสเสียงอ้างอิงครั้งเดียวแล้วใช้รหัสซ้ำกับคำขออื่นได้
--moss-nano-model | aufklarer/MOSS-TTS-Nano-100M-CoreML | คลังโมเดลหรือโฟลเดอร์ในเครื่อง |
--moss-nano-compute-units | cpu | cpu หรือ gpu |
--moss-nano-max-frames | 300 | จำนวนเฟรม 80 ms สูงสุด ต้องจบตามธรรมชาติ |
--moss-nano-seed | 0 | seed สุ่ม 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 MB พรอมป์ต์ เสียงอ้างอิง และเฟรมที่ขอใช้บริบท 1,024 แถวร่วมกัน หากเกินบริบทหรือถึง maxFrames ก่อนจบเสียงตามธรรมชาติจะเกิดข้อผิดพลาด ค่าเริ่มต้นเป็น CPU; gpu อนุญาต CPU+GPU ค่า seed ของ PCG64 เข้ากันได้กับ NumPy แต่ความต่างเชิงตัวเลขของแบ็กเอนด์อาจเปลี่ยนผลลัพธ์
วัด Python/CoreML บน M5 Pro, 48 GB, 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 เครื่องเดิม ใช้หนึ่งคำขอต่อโปรเซสใหม่ด้วยเสียงอ้างอิง ข้อความ และ seed เดียวกัน รวมการเตรียมเสียงอ้างอิงแต่ไม่รวมการโหลดโมเดลสังเคราะห์ RSS คือทั้ง CLI โดยไม่มีน้ำหนัก ASR ขีดหมายถึงกรณีอุ่น/แคชที่ยังไม่วัด ผลลัพธ์ทั้งสองผ่าน ASR อิสระและตรงกับประโยคที่ขอทุกคำ
| แบ็กเอนด์ | RSS สูงสุด | โทเคนแรก: แรก / อุ่น / แคช | เสียงแรก: แรก / อุ่น / แคช |
|---|---|---|---|
| CPU | 670.7 MiB | 537 / — / — ms | 560 / — / — ms |
| CPU+GPU | 602.5 MiB | 570 / — / — ms | 645 / — / — ms |