อ้างอิง CLI

ไฟล์ปฏิบัติการ speech คือจุดเริ่มต้นหลักสำหรับงานประมวลผลเสียงพูดทั้งหมด คอมไพล์ด้วย make build แล้วรันจาก .build/release/speech

transcribe

ถอดไฟล์เสียงเป็นข้อความ

speech transcribe <file> [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
<file>ไฟล์เสียงที่จะถอดเป็นข้อความ (WAV, M4A, MP3, CAF)
--engineqwen3เอนจิน ASR: qwen3, qwen3-coreml, parakeet, nemotron หรือ omnilingual
--model, -m0.6Bรุ่นของโมเดล: 0.6B, 1.7B หรือ HuggingFace model ID แบบเต็ม (เฉพาะ qwen3)
--languageคำใบ้ภาษา (ไม่บังคับ ถูกข้ามโดย omnilingual)
--window10[omnilingual] ขนาดหน้าต่าง CoreML เป็นวินาที: 5 หรือ 10
--backendcoreml[omnilingual] Backend: coreml (Neural Engine) หรือ mlx (Metal GPU)
--variant300M[omnilingual mlx] ขนาด: 300M, 1B, 3B หรือ 7B
--bits4[omnilingual mlx] จำนวนบิตในการ quantize: 4 หรือ 8
--streamเปิดการถอดเสียงเป็นข้อความแบบสตรีมร่วมกับ VAD
--max-segment10ระยะเวลาสูงสุดของหนึ่งส่วน เป็นวินาที (streaming)
--partialส่งผลลัพธ์บางส่วนระหว่างกำลังพูด (streaming)

ตัวอย่าง:

# การถอดเสียงเป็นข้อความพื้นฐาน
speech transcribe recording.wav

# ใช้โมเดลใหญ่ขึ้น
speech transcribe recording.wav --model 1.7B

# ตัวเข้ารหัส CoreML (Neural Engine + ตัวถอดรหัส MLX)
speech transcribe recording.wav --engine qwen3-coreml

# ใช้เอนจิน Parakeet (CoreML)
speech transcribe recording.wav --engine parakeet

# ใช้ Nemotron Streaming (CoreML, ภาษาอังกฤษพร้อมเครื่องหมายวรรคตอนเนทีฟ)
speech transcribe recording.wav --engine nemotron                                 # batch
speech transcribe recording.wav --engine nemotron --stream --partial              # streaming

# Omnilingual (CoreML, 1,672 ภาษา)
speech transcribe recording.wav --engine omnilingual                              # หน้าต่าง 10 s
speech transcribe recording.wav --engine omnilingual --window 5                     # หน้าต่าง 5 s

# Omnilingual (MLX, ความยาวเท่าใดก็ได้สูงสุด 40 s)
speech transcribe recording.wav --engine omnilingual --backend mlx                              # 300M @ 4-bit
speech transcribe recording.wav --engine omnilingual --backend mlx --variant 1B                  # 1B @ 4-bit
speech transcribe recording.wav --engine omnilingual --backend mlx --variant 3B --bits 8         # 3B @ 8-bit
speech transcribe recording.wav --engine omnilingual --backend mlx --variant 7B                  # 7B @ 4-bit

# Streaming พร้อม VAD
speech transcribe recording.wav --stream --partial

align

การจัดเรียงแบบบังคับระดับคำ — รับ timestamp ที่แม่นยำสำหรับทุกคำ

speech align <file> [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
<file>ไฟล์เสียง
--text, -tข้อความที่จะจัดเรียง (หากเว้นไว้ จะถอดเสียงเป็นข้อความก่อน)
--model, -m0.6Bโมเดล ASR สำหรับการถอดเสียง: 0.6B, 1.7B หรือ ID แบบเต็ม
--aligner-modelID ของโมเดล forced aligner
--languageคำใบ้ภาษา

ตัวอย่าง:

# ถอดเสียงเป็นข้อความอัตโนมัติแล้วจัดเรียง
speech align recording.wav

# จัดเรียงด้วยข้อความที่รู้แล้ว
speech align recording.wav --text "Can you guarantee that the replacement part will be shipped tomorrow?"

speak

การสังเคราะห์ข้อความเป็นเสียงพูด

speech speak "<text>" [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
<text>ข้อความที่จะสังเคราะห์ (ไม่บังคับเมื่อใช้ --batch-file)
--engineqwen3เอนจิน TTS: qwen3, cosyvoice, voxcpm2 หรือ magpie
--output, -ooutput.wavเส้นทางไฟล์ WAV เอาต์พุต
--languageenglishภาษา เว้นไว้เพื่อใช้สำเนียงเนทีฟของผู้พูดเมื่อตั้ง --speaker แล้ว
--streamเปิดการสังเคราะห์แบบสตรีม
--voice-sampleเสียงอ้างอิงสำหรับการโคลนเสียง (ใช้ได้กับทั้งเอนจิน qwen3 และ cosyvoice)
--verboseแสดงข้อมูลเวลาอย่างละเอียด

ตัวเลือก Qwen3-TTS

ตัวเลือกค่าเริ่มต้นคำอธิบาย
--modelbaseรุ่นของโมเดล: base, customVoice หรือ HF model ID แบบเต็ม
--speakerเสียงผู้พูด (ต้องใช้ --model customVoice)
--instructคำสั่งสไตล์ (โมเดล CustomVoice)
--list-speakersแสดงรายชื่อผู้พูดที่มีและออก
--temperature0.3อุณหภูมิการสุ่ม
--top-k50การสุ่ม Top-k
--max-tokens500token สูงสุด (500 = เสียงประมาณ 40s)
--batch-fileไฟล์ที่มีข้อความหนึ่งบรรทัดต่อหนึ่งรายการเพื่อสังเคราะห์เป็นชุด
--batch-size4ขนาด batch สูงสุดสำหรับการสร้างแบบขนาน
--first-chunk-frames3จำนวนเฟรม codec ใน chunk สตรีมแรก
--chunk-frames25จำนวนเฟรม codec ต่อ chunk สตรีม

ตัวเลือก CosyVoice3

ตัวเลือกค่าเริ่มต้นคำอธิบาย
--speakersการแมปผู้พูดสำหรับบทสนทนาหลายผู้พูด: s1=alice.wav,s2=bob.wav
--cosy-instructคำสั่งสไตล์ (เขียนทับค่าเริ่มต้น) ควบคุมสไตล์เสียงสำหรับ CosyVoice3
--turn-gap0.2ช่วงเงียบระหว่างเทิร์นของบทสนทนา เป็นวินาที
--crossfade0.0การ crossfade ที่ซ้อนทับระหว่างเทิร์น เป็นวินาที
--model-idHuggingFace model ID

ตัวเลือก VoxCPM2

ตัวเลือกค่าเริ่มต้นคำอธิบาย
--voxcpm2-variantbf16รุ่นการ quantize: bf16, int8 หรือ int4 แมปไปยัง aufklarer/VoxCPM2-MLX-<variant>
--voxcpm2-instructคำอธิบายเสียงด้วยภาษาธรรมชาติ (การออกแบบเสียง) เช่น "a young woman, warm and gentle"
--voxcpm2-ref-audioไฟล์เสียงอ้างอิงสำหรับการโคลน (16 kHz mono ถูก resample ภายใน)
--voxcpm2-prompt-audio / --voxcpm2-prompt-textคู่ "การโคลนระดับสูงสุด" — คลิปอ้างอิง + ข้อความที่ถอดของมันเพื่อโคลนโดยคงสำเนียง
--voxcpm2-cfg-value2.0ค่า classifier-free guidance สำหรับ diffusion sampler
--voxcpm2-timesteps10จำนวนขั้น Euler solver ต่อ patch เสียงที่ถูกสร้าง
--voxcpm2-max-tokens2000จำนวน patch สูงสุดก่อนจะถูกบังคับให้หยุด
--voxcpm2-min-tokens2จำนวน patch ต่ำสุดก่อนจะอนุญาตให้ stop head ทำงาน
--seedseed RNG ของ MLX ก่อนการสังเคราะห์ (ให้ผลคงที่ระหว่างการรัน)

ตัวเลือก Magpie

NVIDIA Magpie-TTS Multilingual 357M, 9 ภาษา พร้อมผู้พูดสำเร็จ 5 คน เลือก backend ด้วย --engine magpie (MLX, ค่าเริ่มต้น) หรือ --engine magpie-coreml (CoreML สำหรับโมเดลใหญ่โดยมี MLX ขับเคลื่อน LocalTransformer + audio embedding) ดู คู่มือ Magpie สำหรับรายละเอียด G2P แยกตามภาษา ไม่รองรับการโคลนเสียง: --voice-sample, --speaker และ --instruct จะถูกปฏิเสธพร้อมข้อผิดพลาดที่ชี้ไปยัง --magpie-speaker

ตัวเลือกค่าเริ่มต้นคำอธิบาย
--magpie-variantint4เฉพาะ MLX การ quantize: int4 (247 MB) หรือ int8 (411 MB) แมปไปยัง aufklarer/Magpie-TTS-Multilingual-357M-MLX-<variant> เอนจิน CoreML ใช้ bundle CoreML INT8 และไม่สนใจ flag นี้
--magpie-speakersofiaผู้พูดสำเร็จ: sofia, aria, jason, leo หรือ john เอกลักษณ์เสียงสม่ำเสมอใน 9 ภาษาและทั้งสอง backend
--magpie-temperature0.6อุณหภูมิการสุ่ม (0 = greedy) ใช้ 0.6 สำหรับภาษาญี่ปุ่น — greedy จะค้างที่วลีแรก
--magpie-top-k80ตัวกรอง top-k สำหรับการสุ่ม
--magpie-max-frames500เพดานคงที่ของเฟรม codec (~23 s)
--magpie-min-frames4จำนวนเฟรมต่ำสุดก่อนอนุญาต EOS
--magpie-prephonemizedถือว่าอินพุตคือสตรีม IPA / phoneme; ข้าม G2P แยกตามภาษา
--list-speakersพิมพ์ผู้พูดสำเร็จ 5 คนแล้วออก

ข้อควรระวังของ magpie-coreml: NanoCodec ที่มาด้วยถูก trace ที่หน้าต่างคงที่ 64 เฟรม จึงปฏิเสธ --stream --language ja จะ auto-route ไปยัง backend MLX พร้อมหมายเหตุที่ stderr (bundle CoreML ยังไม่มี tokenizer JA) เอนจิน CoreML จะ lazy-load bundle MLX ในการสังเคราะห์ครั้งแรกเพื่อขับเคลื่อน LocalTransformer และเฉลี่ย audio embedding; การ deploy แบบ CoreML ล้วนถูกติดตามเป็นงานต่อเนื่อง

ตัวอย่าง:

# TTS พื้นฐาน
speech speak "Hello, world!" --output hello.wav

# การโคลนเสียง (Qwen3-TTS)
speech speak "Hello in your voice" --voice-sample reference.wav -o cloned.wav

# การโคลนเสียง (CosyVoice)
speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav

# CosyVoice หลายภาษา
speech speak "Hallo Welt" --engine cosyvoice --language german -o hallo.wav

# บทสนทนาหลายผู้พูด
speech speak "[S1] Hello there! [S2] Hey, how are you?" \
    --engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav

# แท็กอารมณ์/สไตล์แบบ inline
speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
    --engine cosyvoice -o emotion.wav

# รวมกัน: บทสนทนา + อารมณ์ + การโคลนเสียง
speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
    --engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav

# คำสั่งสไตล์กำหนดเอง
speech speak "Hello world" --engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav

# Magpie TTS หลายภาษา — เสียง Aria เดียวกันใน 9 ภาษา
speech speak "Hello, world." --engine magpie --magpie-speaker aria \
    --magpie-temperature 0 -o en.wav
speech speak "Hola mundo." --engine magpie --language es --magpie-speaker aria \
    --magpie-temperature 0 -o es.wav
# ภาษาญี่ปุ่นต้องการการสุ่มแบบ stochastic
speech speak "こんにちは世界、これは音声合成システムです。" \
    --engine magpie --language ja --magpie-temperature 0.6 \
    --magpie-top-k 80 --seed 42 -o ja.wav
speech speak --engine magpie --list-speakers

# Backend Magpie CoreML (เร่งด้วย ANE, 8 ภาษา, ไม่มี streaming)
speech speak "Hello world." --engine magpie-coreml --magpie-speaker aria -o en.wav
speech speak "Hola mundo." --engine magpie-coreml --language es \
    --magpie-speaker leo -o es.wav
# ภาษาญี่ปุ่น auto-route ไปยัง MLX (bundle CoreML ไม่มี tokenizer JA)
speech speak "こんにちは。" --engine magpie-coreml --language ja -o ja.wav

# การสังเคราะห์แบบสตรีม
speech speak "Long text here..." --stream

# การสังเคราะห์เป็นชุดจากไฟล์
speech speak --batch-file texts.txt --batch-size 4

# VoxCPM2 — เอาต์พุตระดับสตูดิโอ 48 kHz
speech speak "Hello there." --engine voxcpm2 --voxcpm2-variant int8 -o hi.wav

# VoxCPM2 — การออกแบบเสียง
speech speak "Welcome to the show." --engine voxcpm2 \
    --voxcpm2-instruct "A young woman, warm and gentle voice." -o design.wav

# VoxCPM2 — การโคลนจากการอ้างอิงเดียว
speech speak "This is a cloned voice." --engine voxcpm2 \
    --voice-sample speaker.wav -o clone.wav

kokoro

TTS แบบเบาโดยใช้ Kokoro-82M บน Neural Engine (CoreML) ไม่ใช่ autoregressive — forward pass ครั้งเดียว ความหน่วงประมาณ 45ms

speech kokoro "<text>" [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
<text>ข้อความที่จะสังเคราะห์
--voiceaf_heartเสียงสำเร็จ (50 เสียงใน 10 ภาษา)
--languageenรหัสภาษา: en, es, fr, hi, it, ja, pt, zh, ko, de
--output, -okokoro_output.wavเส้นทางไฟล์ WAV เอาต์พุต
--list-voicesแสดงรายชื่อเสียงที่มีทั้งหมดและออก
--model, -mHuggingFace model ID

ตัวอย่าง:

# Kokoro TTS พื้นฐาน
speech kokoro "Hello, world!" --voice af_heart -o hello.wav

# เสียงภาษาฝรั่งเศส
speech kokoro "Bonjour le monde" --voice ff_siwis --language fr -o bonjour.wav

# แสดง 50 เสียงทั้งหมด
speech kokoro --list-voices

respond

บทสนทนาเสียงพูดสู่เสียงพูดแบบ full-duplex โดยใช้ PersonaPlex 7B

speech respond [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
--input, -iไฟล์ WAV เสียงอินพุต (24kHz mono) (บังคับ)
--output, -oresponse.wavไฟล์ WAV ตอบกลับเอาต์พุต
--voiceNATM0เสียงสำเร็จ (เช่น NATM0, NATF1, VARF0)
--system-promptassistantPreset: assistant, focused, customer-service, teacher
--system-prompt-textข้อความ system prompt กำหนดเอง (เขียนทับ preset)
--max-steps200จำนวนขั้นการสร้างสูงสุดที่ 12.5Hz (~16s)
--streamส่ง chunk เสียงระหว่างการสร้าง
--compileเปิด compiled transformer (warmup + kernel fusion)
--list-voicesแสดงรายการเสียงสำเร็จที่มี
--list-promptsแสดงรายการ preset ของ system prompt ที่มี
--transcriptพิมพ์ข้อความบทพูดในใจของโมเดล
--jsonเอาต์พุตเป็น JSON (ข้อความถอด ความหน่วง เส้นทางเสียง)
--verboseแสดงข้อมูลเวลาอย่างละเอียด

การเขียนทับ Sampling

ตัวเลือกค่าเริ่มต้นคำอธิบาย
--audio-temp0.8อุณหภูมิการสุ่มเสียง
--text-temp0.7อุณหภูมิการสุ่มข้อความ
--audio-top-k250top-k ของผู้สมัครเสียง
--repetition-penalty1.2ค่าปรับการซ้ำของเสียง (1.0 = ปิด)
--text-repetition-penalty1.2ค่าปรับการซ้ำของข้อความ (1.0 = ปิด)
--repetition-window30หน้าต่างค่าปรับการซ้ำเป็นเฟรม
--silence-early-stop15เฟรมเงียบก่อนหยุดก่อนกำหนด (0 = ปิด)
--entropy-threshold0ขีดเริ่มต้น entropy ของข้อความเพื่อหยุดก่อนกำหนด (0 = ปิด)
--entropy-window10จำนวนขั้น entropy ต่ำต่อเนื่องก่อนหยุดก่อนกำหนด

ตัวอย่าง:

# เสียงพูดสู่เสียงพูดพื้นฐาน
speech respond --input question.wav

# ใช้เสียงผู้หญิงพร้อม compiled transformer
speech respond -i question.wav --voice NATF1 --compile

# Stream การตอบกลับและแสดงข้อความถอด
speech respond -i question.wav --stream --transcript --verbose

vad

การตรวจจับกิจกรรมเสียงพูดแบบออฟไลน์โดยใช้ Pyannote segmentation

speech vad <file> [options]
ตัวเลือกคำอธิบาย
<file>ไฟล์เสียงที่จะวิเคราะห์
--model, -mHuggingFace model ID
--onsetขีดเริ่มต้น onset (เริ่มเสียงพูด)
--offsetขีดเริ่มต้น offset (สิ้นสุดเสียงพูด)
--min-speechระยะเวลาเสียงพูดต่ำสุดเป็นวินาที
--min-silenceระยะเวลาเงียบต่ำสุดเป็นวินาที
--jsonเอาต์พุตเป็น JSON

vad-stream

การตรวจจับกิจกรรมเสียงพูดแบบสตรีมโดยใช้ Silero VAD v5 ประมวลผลเสียงพูดในชิ้นขนาด 32ms

speech vad-stream <file> [options]
ตัวเลือกคำอธิบาย
<file>ไฟล์เสียงที่จะวิเคราะห์
--engineเอนจิน VAD: mlx (ค่าเริ่มต้น) หรือ coreml
--model, -mHuggingFace model ID (เลือกอัตโนมัติตามเอนจิน)
--onsetขีดเริ่มต้น onset
--offsetขีดเริ่มต้น offset
--min-speechระยะเวลาเสียงพูดต่ำสุดเป็นวินาที
--min-silenceระยะเวลาเงียบต่ำสุดเป็นวินาที
--jsonเอาต์พุตเป็น JSON

wake

การตรวจจับ wake-word / keyword บนอุปกรณ์โดยใช้ KWS Zipformer (3.49M พารามิเตอร์ CoreML INT8, 26× เรียลไทม์ เฉพาะภาษาอังกฤษ)

speech wake <file> [options]
ตัวเลือกคำอธิบาย
<file>ไฟล์เสียงที่จะวิเคราะห์
--keywordsคีย์เวิร์ดหนึ่งคำหรือมากกว่า รูปแบบ: "hey soniqo" (greedy BPE), "hey soniqo:0.15:0.5" (พร้อมขีดเริ่มต้น/boost) หรือ "LIGHT UP|▁ L IGHT ▁UP:0.25:2.0" (ชิ้น BPE แบบชัดเจนสไตล์ sherpa-onnx)
--keywords-fileไฟล์คีย์เวิร์ด หนึ่งรายการต่อบรรทัด (รูปแบบเดียวกับ --keywords); ใช้ # สำหรับความเห็น
--model, -mHuggingFace model ID ค่าเริ่มต้นคือ aufklarer/KWS-Zipformer-3M-CoreML-INT8
--jsonเอาต์พุตเป็น JSON
# วลีธรรมดา ค่าเริ่มต้นที่ปรับแต่งไว้แล้ว
speech wake recording.wav --keywords "hey soniqo"

# ชิ้น BPE แบบชัดเจนสำหรับวลีที่ greedy tokenizer ผิด
speech wake recording.wav --keywords "LIGHT UP|▁ L IGHT ▁UP:0.25:2.0"

# หลายวลี + เอาต์พุต JSON
speech wake recording.wav \
  --keywords "lovely child|▁LOVE LY ▁CHI L D:0.25:2.0" \
             "for ever|▁FOR E VER:0.25:2.0" \
  --json

diarize

การแยกผู้พูด — ระบุว่าใครพูดเมื่อใด

speech diarize <file> [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
<file>ไฟล์เสียงที่จะวิเคราะห์
--enginepyannoteเอนจินแยกผู้พูด: pyannote (segmentation + การโยงผู้พูด) หรือ sortformer (end-to-end CoreML)
--target-speakerเสียงลงทะเบียนสำหรับการแยกผู้พูดเป้าหมาย (เฉพาะ pyannote)
--embedding-enginemlxเอนจินสร้าง embedding ผู้พูด: mlx หรือ coreml (เฉพาะ pyannote)
--vad-filterกรองล่วงหน้าด้วย Silero VAD (เฉพาะ pyannote)
--rttmเอาต์พุตในรูปแบบ RTTM
--jsonเอาต์พุตเป็น JSON
--score-againstไฟล์ RTTM อ้างอิงเพื่อคำนวณ DER

ตัวอย่าง:

# การแยกพื้นฐาน (pyannote, ค่าเริ่มต้น)
speech diarize meeting.wav

# Sortformer end-to-end (CoreML, Neural Engine)
speech diarize meeting.wav --engine sortformer

# เอาต์พุต RTTM เพื่อประเมิน
speech diarize meeting.wav --rttm

# การแยกผู้พูดเป้าหมาย (เฉพาะ pyannote)
speech diarize meeting.wav --target-speaker enrollment.wav

# ให้คะแนนเทียบกับอ้างอิง
speech diarize meeting.wav --score-against reference.rttm

embed-speaker

สกัด vector embedding ของผู้พูดจากเสียง

speech embed-speaker <file> [options]
ตัวเลือกคำอธิบาย
<file>ไฟล์เสียงที่มีเสียงผู้พูด
--engineเอนจิน inference: mlx (ค่าเริ่มต้น), coreml (WeSpeaker 256 มิติ) หรือ camplusplus (CAM++ CoreML 192 มิติ)
--jsonเอาต์พุตเป็น JSON

denoise

กำจัดเสียงรบกวนฉากหลังโดยใช้ DeepFilterNet3 บน Neural Engine

speech denoise <file> [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
<file>ไฟล์เสียงอินพุต
--output, -oinput_clean.wavเส้นทางไฟล์เอาต์พุต
--model, -mHuggingFace model ID

ตัวอย่าง:

speech denoise noisy-recording.wav -o clean.wav

compose

สร้างเพลง 30 วินาทีจาก prompt ข้อความโดยใช้ MAGNeT บน MLX

speech compose <prompt> [options]
ตัวเลือกค่าเริ่มต้นคำอธิบาย
<prompt>Prompt ข้อความอธิบายเพลงที่จะสร้าง (เช่น "happy rock")
--output, -omagnet.wavเส้นทาง WAV เอาต์พุต (32 kHz mono)
--variantsmall-int4รุ่นของโมเดล: small-int4, small-int8, medium-int4 หรือ medium-int8 แมปไปยัง aufklarer/MAGNeT-{Small,Medium}-30secs-MLX-{4,8}bit
--temperature3.0อุณหภูมิการสุ่ม ลดลงเชิงเส้นต่อแต่ละ stage
--top-p0.9ขีดเริ่มต้น nucleus sampling
--cfg-max10.0ค่าสัมประสิทธิ์ classifier-free guidance สูงสุด
--cfg-min1.0ค่าสัมประสิทธิ์ CFG ต่ำสุด (ลดลงตามตาราง mask)
--steps20,10,10,10จำนวนรอบ decode ต่อ codebook คั่นด้วยจุลภาค (4 ค่า)
--seedseed สุ่มเพื่อให้ผลลัพธ์ทำซ้ำได้

ตัวอย่าง:

# ค่าเริ่มต้น: small-int4, ประมาณ 10 s บนชิปตระกูล M สำหรับคลิป 30 s
speech compose "happy rock" -o happy_rock.wav

# โมเดลใหญ่กว่า — ตาม prompt ได้ดีกว่า ช้ากว่า
speech compose "lo-fi hip hop with mellow piano" --variant medium-int4 -o lofi.wav

# ทำซ้ำได้
speech compose "energetic EDM with synth lead" --seed 42 -o edm.wav