Files
searchi/docs/SPEECH-DTW.md
T

147 lines
9.2 KiB
Markdown
Raw Permalink Normal View History

# DTW diagnostic: strict UTF-8 failure
Status: internal CPU diagnosis and completed tiny VAD/DTW comparison, 2026-10-13.
Production ASR integration and broader independent acceptance remain open;
no new media rating follows from this evidence.
Google EmbeddingGemma 2 remains the production semantic model.
The original fifteen-window DTW experiment stopped on strict UTF-8 parsing.
Its temporary raw output was cleaned, so that first run's exact bytes could not
be inspected. Its partial report remains unchanged. A separate coordinator-
authorized diagnostic reproduced exactly the second `music01` window: source
offset 30000 ms, duration 30000 ms, primary audio stream, 480000 decoded samples.
No labels selected text/timestamps, and the whole experiment was not rerun.
## Revalidated execution
The whisper.cpp checkout was clean at pinned commit
`d1be6fde11ac6e0407606b4e42fe72d34add8037`. Before execution, the fixture and
source hashes, base model size/hash, worker hash and both decoder hashes were
checked against frozen evidence. The owned runner retained raw output, WAV,
probe, stderr and report directly under ignored
`.searchi/speech/dtw-window-diagnostic-v1`; no temporary cleanup removed them.
| Artifact | SHA-256 |
| --- | --- |
| Frozen fixture | `b4e465a0eb9582b826eebd2a20797e1680e4907e336d02d0ef2194e2ba0af393` |
| Source music01 | `29fcd20414ee19c2a5aa4339eaf6375079dc87959051ab0aea32c76df52f34dc` |
| CPU worker | `12c681b4bcd9c7679b647b9a041e121a2f9e72cb2a9c6f189f529ec8b79c36f8` |
| Multilingual base model | `60ed5bc3dd14eea856493d334349b405782ddcaf0028d4b5df4088345fba2efe` |
| FFmpeg | `b778ca5786ee4b0b4f37f34478617093d2fdb9a532d281fb76cda69d1d579d46` |
| FFprobe | `4e1b0afd27bf02d79739f27b2d650137470925afb19d54b5e89a708b7a389236` |
| Raw JSON, 29148 bytes | `f1de2c295b0c9a223619abe6dbf34823be6a6aa3dbcad69fea1d6121fa0c200e` |
| Native log | `28d174198a3ef980aa5c8c1237618f450a19b0a80c8a270209dce113a8de3a7a` |
| Diagnostic report | `b4b0dedfac6365c59793806801b1fc5d9f8f203891b623fb86ad508352ad0114` |
Windows VM execution forced CPU: `SEARCHI_FORCE_CPU=1`, native flags
`--no-gpu --threads 1 --processors 1 --language auto --output-json-full
--dtw base --no-flash-attn`, verified base model and the decoded owned WAV.
The existing bounded decoder used absolute 30-second seeking and sample trimming;
its output contained exactly 480000 samples. Native ASR exited zero after
42493.25 ms; decoding took 271.42 ms. The owned diagnostic runner exited zero
after recording `strict_parse: rejected`. This is not a successful ASR result
or a warmed throughput measurement. No other model inference ran concurrently
under this coordinator's CPU slot; unrelated VM load was not instrumented.
## Exact failure and pinned native source
Strict UTF-8 decoding rejects bytes **1137–1138** (zero-based half-open range
1137–1139). The segment text ends with bytes `E2 80` immediately before the
closing JSON quote: a three-byte UTF-8 sequence has no final continuation byte.
The last ordinary token, id 913, also ends with exactly `E2 80` at byte 28900.
Earlier token text contains complete `E2 80 8D` codepoints. Raw bytes were
inspected directly, without replacement decoding or writing repaired JSON.
The pinned native core constructs segment text by concatenating token strings.
The CLI full-JSON serializer merges adjacent token byte pieces while a codepoint
needs continuation **and another token exists**. At the last token there is no
continuation to merge; it writes the remaining incomplete bytes. Its segment
text serializer likewise writes the already incomplete segment bytes. The
escaping function only escapes quotes/backslashes; it cannot restore a missing
codepoint byte. Thus this is incomplete recognized byte output, reproduced in
both segment and token text, rather than a Python ANSI conversion or DTW time
unit error. The exact internal reason the decoder terminated this token sequence
has not been instrumented and remains unproven.
Relevant pinned source: [CLI serializer and token merging](https://github.com/ggml-org/whisper.cpp/blob/d1be6fde11ac6e0407606b4e42fe72d34add8037/examples/cli/cli.cpp),
[UTF-8 continuation helper](https://github.com/ggml-org/whisper.cpp/blob/d1be6fde11ac6e0407606b4e42fe72d34add8037/examples/common-whisper.cpp),
and [segment construction](https://github.com/ggml-org/whisper.cpp/blob/d1be6fde11ac6e0407606b4e42fe72d34add8037/src/whisper.cpp).
## Minimal next change and limits
Before changing a native worker, add a strict UTF-8 validator at its JSON boundary
for original segment strings and merged token strings. If original recognized
bytes remain invalid after adjacent-token merging, return an explicit typed
recognition-output error with bounded raw evidence; never replace characters,
truncate text, synthesize missing bytes or fabricate timestamps. Test a valid
split codepoint and an incomplete final codepoint. This makes the failure
machine-readable; it does **not** repair recognition or establish improved
retrieval. An alternative timestamp/recognition policy must be declared and
evaluated separately before any default changes.
The Python harness already fails closed, retains bounded raw bytes with SHA and
parse positions, and atomically records an incomplete, ineligible checkpoint.
The original partial DTW report contains three NASA windows with 21 valid
point-based sentence spans and one separately retained ordinary-interval error.
It lacks remaining piano windows and three other competitors. Neither that
partial report nor this one-window diagnosis can receive an accepted quality
score. Packaging, independent bilingual speech, silence/music hallucination,
resource peaks and actual production hybrid integration remain open.
## Complete frozen VAD + DTW follow-up
A subsequent separately frozen combination used the same original Silero VAD
source intersections and base DTW point policy. All five sources remained
explicit: twelve speech windows in NASA, and four no-speech competitors that
launched no ASR because of the unchanged actual VAD decisions. No label selected
the gate or removed the malformed piano window. Raw Google audio retrieval stays
unchanged. This combination finished with zero parsing/alignment failures and
21 sentence passages. Source/tool hashes were revalidated; the combination
manifest SHA is `d3bf453f21dac03fd029344af2fe700480cf686d2ba5b5d7fcc79134dda1c563`.
Independent Rust verification reconstructed every VAD window and DTW point from
raw evidence before actual Google document/query CPU inference. Both models used
one thread; indexing role retained 2048 tokens and query role 512. The normal
auto-capable Google worker reported `google/embeddinggemma-2`, 768 dimensions,
CPU and `b11461-no-logits-v1`. The scorer accepted the complete report with zero
excluded windows against the unchanged eight queries.
| Fixed metric | Ungated base | Frozen VAD base | Frozen VAD + DTW |
| --- | ---: | ---: | ---: |
| Correct top file | 8/8 | 8/8 | 8/8 |
| Strict timestamp-start hits | 4/8 | 4/8 | **6/8** |
| Labelled interval overlap | 6/8 | 6/8 | 6/8 |
The two gains against **gated base** are the Mars queries: start changed from
54.440 seconds, before the labelled 56.539–63.496 interval, to 58.820 seconds.
Moon starts changed from ungated 0.000 seconds to gated-base 1.700 seconds and
gated-DTW 1.820 seconds; both gated starts already pass the frozen 1.551–3.603
interval. Funding queries still pass. Both orange-soil queries still fail;
their top DTW point spans are 26.690–27.030 seconds, outside the topic. Correct
file identity alone does not solve this missing recognized passage.
These are four topics in **one English NASA recording**, with eight correlated
English/German search queries. They do not validate German speech or independent
accents. VAD produced no recognized passages for the four competitors, so 8/8
file identity is especially weak evidence; all five source identities remain
verified, but this is not broad music/no-answer quality. The direct recognized-
text diagnostic is not production hybrid search. No production default,
transcription integration or improved media self-rating follows.
ASR process time summed to 88090.51 ms; window decoding summed to 1784.10 ms.
This excludes probe/hash/checkpoint and the earlier VAD cost. Google indexing
session initialization plus document encoding took 3086.03 ms, query-session
startup 919.69 ms. Eight query/ranking measurements had median 96.83 ms and
nearest-rank p95 128.75 ms; these tiny shared-VM measurements are not desktop
first-input, clean-room or large-library latency. The already running user app
retained its warmed CPU model; it received no further coordinated search inputs.
| Retained ignored artifact | SHA-256 |
| --- | --- |
| `gated-base-dtw-results-v1.json` | `3b6a791df6503a7a4e91ed708be7b722d1c124a2cf6c5a290cd94296bebc3c41` |
| `gated-base-dtw-google-ranks-v1.json` | `f743265a53ade09b36fef25fe4e90b70a46cd2610a12aaa976f179ab9835fe91` |
| `gated-base-dtw-google-score-v1.json` | `4cfbc0f540ed8edcbed6e45f55fac80ee11867597152928d3407dabd7db34502` |
| Actual Google worker | `c01cb3ec13cfca722ee768e8350e1399a8b9a4d14a24a35adc3473a5cfc82a73` |
| Actual ranking executable | `58f4b1cf90cbf403220b60579d72ced9dd7bc795bd05a7386820e9ab84b5f519` |
The original failed ungated DTW and ordinary-token reports remain unchanged.