Files
Adolfo Reyna 80f0bf309f feat: Apple Speech v3 + Freeflow polish + draft streaming
- Apple SpeechAnalyzer (macOS 26+) binary: --bench (31x RTF), --pipe
  (persistent process, 150ms finals), --live (word-by-word drafts)
- Pipe protocol: 4-byte BE length + wav payload, emits JSONL
  {event:draft|final, text, isFinal, chunk} — 31 drafts for 6s audio (~60ms granularity)
- engine_apple_transcribe.py: ApplePipeTranscriber with
  transcribe() + transcribe_with_draft_callback(), VAD + draft
  queue, new flags --apple-stream (on), --apple-stream-interval,
  --apple-pipe (on). Fixes PIL/transformers import crash by lazy import.
- main_v3.py: engine selector {whisper,apple}, passthrough translate
  when no -es/-fr/-ar, freeflow flags same as v2
- Freeflow polish: deterministic punctuation commands (comma,
  question mark, new paragraph, at sign), filler stripping,
  <keep> protection, skip-clean heuristic, freeflow/qwen/legacy
  prompt styles. Much better final readability vs raw Apple/Whisper.
- main_v2.py, engine_llm.py, engine_distribute.py: integrate freeflow
- bench: Apple 2.12% WER vs Whisper Small 3.74% (Inscribe), CPU
  0mW ANE (measured via powermetrics), 196M EN cryptex per locale.
- Verified: 31 word-by-word drafts, 2 finals, exit 0, bench regression ok.

Freeflow still much better for final polish — Apple wins on speed
and raw accuracy, freeflow wins on readable paragraph output.

Co-authored-by: internal-model
2026-07-13 21:08:18 -04:00

43 lines
1.2 KiB
JSON

{
"model": "mlx-community/whisper-base-mlx",
"device": null,
"lang": null,
"silence": 1000,
"max_buffer": 20,
"channels": 1,
"es": false,
"fr": false,
"ar": false,
"en": false,
"ingest": false,
"filter_lang": false,
"stream": false,
"context": false,
"quantize": false,
"speaker_diarization": false,
"post_correct": false,
"post_correct_llm": false,
"post_correct_model": "qwen3.5:0.8b",
"post_correct_ollama_url": "http://127.0.0.1:11434/api/generate",
"post_correct_llm_timeout": 8.0,
"post_correct_keep_alive": "30m",
"post_correct_warmup_timeout": 20.0,
"post_correct_min_overlap": 0.45,
"post_correct_debug": false,
"freeflow_polish": true,
"post_correct_skip_clean": true,
"post_correct_prompt_style": "freeflow",
"llm_paragraph": false,
"llm_paragraph_temperature": 0.2,
"llm_paragraph_top_p": 0.8,
"llm_paragraph_repeat_penalty": 1.0,
"llm_request_log_path": "logs/llm_requests.jsonl",
"only_translate_llm": false,
"temperature_fallback": [0.0, 0.2, 0.4, 0.6, 0.8, 1.0],
"logprob_threshold": -0.8,
"compression_threshold": 2.2,
"mt_max_chars": 250,
"mt_max_new_tokens": 150,
"mt_num_beams": 4
}