Output:
Exit code: 0
Wall time: 0 seconds
Output:
total 80
drwxrwxr-x  2 ubuntu ubuntu  4096 Feb  6 04:47 .
drwxrwxr-x 14 ubuntu ubuntu  4096 Feb 12 23:23 ..
-rw-rw-r--  1 ubuntu ubuntu  3582 Feb  3 22:53 pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json
-rw-rw-r--  1 ubuntu ubuntu  3582 Feb  3 22:53 pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json
-rw-rw-r--  1 ubuntu ubuntu  6969 Feb  3 22:52 pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json
-rw-rw-r--  1 ubuntu ubuntu  6969 Feb  3 22:52 pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json
-rw-rw-r--  1 ubuntu ubuntu  3676 Feb  3 23:02 pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json
-rw-rw-r--  1 ubuntu ubuntu  3676 Feb  3 23:02 pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json
-rw-rw-r--  1 ubuntu ubuntu 32359 Feb  6 04:47 test_new_schema_20seg.json
-rw-rw-r--  1 ubuntu ubuntu  7887 Feb  6 04:42 test_new_schema_5segments.json


Output:
Exit code: 0
Wall time: 0 seconds
Output:
transcriptions/test_new_schema_20seg.json
transcriptions/test_new_schema_5segments.json
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json


Output:
Exit code: 0
Wall time: 0 seconds
Output:
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:3:  "model": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:4:  "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:28:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:29:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:46:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:47:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:64:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:65:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:82:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233_partial.json:83:      "thinking_level": "high",
transcriptions/test_new_schema_20seg.json:3:  "model": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:25:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:26:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:28:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:29:      "validation_score": null
transcriptions/test_new_schema_20seg.json:49:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:50:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:52:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:53:      "validation_score": null
transcriptions/test_new_schema_20seg.json:73:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:74:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:76:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:77:      "validation_score": null
transcriptions/test_new_schema_20seg.json:97:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:98:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:100:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:101:      "validation_score": null
transcriptions/test_new_schema_20seg.json:121:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:122:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:124:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:125:      "validation_score": null
transcriptions/test_new_schema_20seg.json:145:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:146:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:148:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:149:      "validation_score": null
transcriptions/test_new_schema_20seg.json:169:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:170:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:172:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:173:      "validation_score": null
transcriptions/test_new_schema_20seg.json:193:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:194:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:196:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:197:      "validation_score": null
transcriptions/test_new_schema_20seg.json:217:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:218:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:220:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:221:      "validation_score": null
transcriptions/test_new_schema_20seg.json:241:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:242:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:244:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:245:      "validation_score": null
transcriptions/test_new_schema_20seg.json:265:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:266:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:268:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:269:      "validation_score": null
transcriptions/test_new_schema_20seg.json:289:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:290:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:292:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:293:      "validation_score": null
transcriptions/test_new_schema_20seg.json:313:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:314:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:316:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:317:      "validation_score": null
transcriptions/test_new_schema_20seg.json:337:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:338:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:340:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:341:      "validation_score": null
transcriptions/test_new_schema_20seg.json:361:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:362:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:364:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:365:      "validation_score": null
transcriptions/test_new_schema_20seg.json:385:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:386:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:388:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:389:      "validation_score": null
transcriptions/test_new_schema_20seg.json:409:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:410:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:412:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:413:      "validation_score": null
transcriptions/test_new_schema_20seg.json:433:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:434:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:436:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:437:      "validation_score": null
transcriptions/test_new_schema_20seg.json:457:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:458:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:460:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:461:      "validation_score": null
transcriptions/test_new_schema_20seg.json:481:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:482:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:484:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:485:      "validation_score": null
transcriptions/test_new_schema_20seg.json:505:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:506:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:508:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:509:      "validation_score": null
transcriptions/test_new_schema_20seg.json:529:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_20seg.json:530:      "thinking_level": "low",
transcriptions/test_new_schema_20seg.json:532:      "validation_status": null,
transcriptions/test_new_schema_20seg.json:533:      "validation_score": null
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json:3:  "model": "gemini-2.5-flash",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json:4:  "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json:28:      "model_used": "gemini-2.5-flash",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json:29:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json:46:      "model_used": "gemini-2.5-flash",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339_partial.json:47:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:3:  "model": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:4:  "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:28:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:29:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:46:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:47:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:64:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:65:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:82:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_225233.json:83:      "thinking_level": "high",
transcriptions/test_new_schema_5segments.json:3:  "model": "gemini-3-flash-preview",
transcriptions/test_new_schema_5segments.json:25:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_5segments.json:26:      "thinking_level": "low",
transcriptions/test_new_schema_5segments.json:28:      "validation_status": null,
transcriptions/test_new_schema_5segments.json:29:      "validation_score": null
transcriptions/test_new_schema_5segments.json:49:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_5segments.json:50:      "thinking_level": "low",
transcriptions/test_new_schema_5segments.json:52:      "validation_status": null,
transcriptions/test_new_schema_5segments.json:53:      "validation_score": null
transcriptions/test_new_schema_5segments.json:73:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_5segments.json:74:      "thinking_level": "low",
transcriptions/test_new_schema_5segments.json:76:      "validation_status": null,
transcriptions/test_new_schema_5segments.json:77:      "validation_score": null
transcriptions/test_new_schema_5segments.json:97:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_5segments.json:98:      "thinking_level": "low",
transcriptions/test_new_schema_5segments.json:100:      "validation_status": null,
transcriptions/test_new_schema_5segments.json:101:      "validation_score": null
transcriptions/test_new_schema_5segments.json:121:      "model_used": "gemini-3-flash-preview",
transcriptions/test_new_schema_5segments.json:122:      "thinking_level": "low",
transcriptions/test_new_schema_5segments.json:124:      "validation_status": null,
transcriptions/test_new_schema_5segments.json:125:      "validation_score": null
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json:3:  "model": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json:4:  "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json:28:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json:29:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json:46:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246_partial.json:47:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json:3:  "model": "gemini-2.5-flash",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json:4:  "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json:28:      "model_used": "gemini-2.5-flash",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json:29:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json:46:      "model_used": "gemini-2.5-flash",
transcriptions/pF_BQpHaIdU_gemini_2.5_flash_20260203_225339.json:47:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json:3:  "model": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json:4:  "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json:28:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json:29:      "thinking_level": "high",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json:46:      "model_used": "gemini-3-flash-preview",
transcriptions/pF_BQpHaIdU_gemini_3_flash_preview_20260203_230246.json:47:      "thinking_level": "high",


# Collaboration Mode: Default

You are now in Default mode. Any previous instructions for other modes (e.g. Plan mode) are no longer active.

Your active mode changes only when new developer instructions with a different `<collaboration_mode>...</collaboration_mode>` change it; user requests or tool descriptions do not change mode by themselves. Known mode names are Default and Plan.

## request_user_input availability

The `request_user_input` tool is unavailable in Default mode. If you call it while in Default mode, it will return an error.

If a decision is necessary and cannot be discovered from local context, ask the user directly. However, in Default mode you should strongly prefer executing the user's request rather than stopping to ask questions.

Summary: auto

## Skills
A skill is a set of local instructions to follow that is stored in a `SKILL.md` file. Below is the list of skills that can be used. Each entry includes a name, description, and file path so you can open the source for full instructions when using a specific skill.
### Available skills
- skill-creator: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Codex's capabilities with specialized knowledge, workflows, or tool integrations. (file: /home/ubuntu/.codex/skills/.system/skill-creator/SKILL.md)
- skill-installer: Install Codex skills into $CODEX_HOME/skills from a curated list or a GitHub repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos). (file: /home/ubuntu/.codex/skills/.system/skill-installer/SKILL.md)
### How to use skills
- Discovery: The list above is the skills available in this session (name + description + file path). Skill bodies live on disk at the listed paths.
- Trigger rules: If the user names a skill (with `$SkillName` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned.
- Missing/blocked: If a named skill isn't in the list or the path can't be read, say so briefly and continue with the best fallback.
- How to use a skill (progressive disclosure):
  1) After deciding to use a skill, open its `SKILL.md`. Read only enough to follow the workflow.
  2) When `SKILL.md` references relative paths (e.g., `scripts/foo.py`), resolve them relative to the skill directory listed above first, and only consider other paths if needed.
  3) If `SKILL.md` points to extra folders such as `references/`, load only the specific files needed for the request; don't bulk-load everything.
  4) If `scripts/` exist, prefer running or patching them instead of retyping large code blocks.
  5) If `assets/` or templates exist, reuse them instead of recreating from scratch.
- Coordination and sequencing:
  - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them.
  - Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why.
- Context hygiene:
  - Keep context small: summarize long sections instead of pasting them; only load extra files when needed.
  - Avoid deep reference-chasing: prefer opening only files directly linked from `SKILL.md` unless you're blocked.
  - When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice.
- Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue.


**Assessing validation feasibility from existing data**


ls -la /tmp/maya3_transcribe/pF_BQpHaIdU/extracted/pF_BQpHaIdU/segments | sed -n '1,120p'


Output:
Exit code: 0
Wall time: 0 seconds
Output:
total 161660
drwxr-xr-x 4 ubuntu ubuntu   32768 Feb  6 04:47 .
drwxr-xr-x 3 ubuntu ubuntu    4096 Jan  8 15:17 ..
drwxrwxr-x 2 ubuntu ubuntu   28672 Feb  4 21:29 chunks
drwxrwxr-x 2 ubuntu ubuntu    4096 Feb  6 04:42 polished_test_run
-rw-r--r-- 1 ubuntu ubuntu  121577 Jan  8 15:17 SPEAKER_00_0000_0.03-2.61.flac
-rw-r--r-- 1 ubuntu ubuntu  413650 Jan  8 15:17 SPEAKER_00_0001_3.05-13.40.flac
-rw-r--r-- 1 ubuntu ubuntu  508993 Jan  8 15:17 SPEAKER_00_0002_16.08-28.31.flac
-rw-r--r-- 1 ubuntu ubuntu  207588 Jan  8 15:17 SPEAKER_00_0003_29.78-34.93.flac
-rw-r--r-- 1 ubuntu ubuntu   53193 Jan  8 15:17 SPEAKER_00_0004_36.29-37.41.flac
-rw-r--r-- 1 ubuntu ubuntu  320200 Jan  8 15:17 SPEAKER_00_0026_383.26-390.66.flac
-rw-r--r-- 1 ubuntu ubuntu  156204 Jan  8 15:17 SPEAKER_00_0027_394.58-397.79.flac
-rw-r--r-- 1 ubuntu ubuntu  256473 Jan  8 15:17 SPEAKER_00_0028_420.53-426.76.flac
-rw-r--r-- 1 ubuntu ubuntu  453218 Jan  8 15:17 SPEAKER_00_0031_450.01-460.11.flac
-rw-r--r-- 1 ubuntu ubuntu  214616 Jan  8 15:17 SPEAKER_00_0032_461.27-466.37.flac
-rw-r--r-- 1 ubuntu ubuntu  313557 Jan  8 15:17 SPEAKER_00_0037_521.61-528.64.flac
-rw-r--r-- 1 ubuntu ubuntu   91953 Jan  8 15:17 SPEAKER_00_0038_529.16-531.25.flac
-rw-r--r-- 1 ubuntu ubuntu  201489 Jan  8 15:17 SPEAKER_00_0039_531.77-535.96.flac
-rw-r--r-- 1 ubuntu ubuntu  201704 Jan  8 15:17 SPEAKER_00_0050_627.86-632.46.flac
-rw-r--r-- 1 ubuntu ubuntu  110451 Jan  8 15:17 SPEAKER_00_0057_715.64-717.95.flac
-rw-r--r-- 1 ubuntu ubuntu  532048 Jan  8 15:17 SPEAKER_00_0058_728.26-741.21.flac
-rw-r--r-- 1 ubuntu ubuntu  322216 Jan  8 15:17 SPEAKER_00_0059_741.63-748.92.flac
-rw-r--r-- 1 ubuntu ubuntu  286269 Jan  8 15:17 SPEAKER_00_0076_1013.51-1020.24.flac
-rw-r--r-- 1 ubuntu ubuntu   58699 Jan  8 15:17 SPEAKER_00_0077_1026.28-1027.43.flac
-rw-r--r-- 1 ubuntu ubuntu  281648 Jan  8 15:17 SPEAKER_00_0078_1028.09-1035.12.flac
-rw-r--r-- 1 ubuntu ubuntu  193993 Jan  8 15:17 SPEAKER_00_0079_1035.75-1040.36.flac
-rw-r--r-- 1 ubuntu ubuntu  374423 Jan  8 15:17 SPEAKER_00_0080_1041.01-1050.11.flac
-rw-r--r-- 1 ubuntu ubuntu  391285 Jan  8 15:17 SPEAKER_00_0081_1050.56-1060.10.flac
-rw-r--r-- 1 ubuntu ubuntu  156759 Jan  8 15:17 SPEAKER_00_0082_1061.11-1065.06.flac
-rw-r--r-- 1 ubuntu ubuntu  168398 Jan  8 15:17 SPEAKER_00_0083_1065.77-1069.50.flac
-rw-r--r-- 1 ubuntu ubuntu  360429 Jan  8 15:17 SPEAKER_00_0084_1069.99-1078.59.flac
-rw-r--r-- 1 ubuntu ubuntu  289880 Jan  8 15:17 SPEAKER_00_0085_1079.22-1086.36.flac
-rw-r--r-- 1 ubuntu ubuntu   53545 Jan  8 15:17 SPEAKER_00_0089_1111.53-1112.56.flac
-rw-r--r-- 1 ubuntu ubuntu  281563 Jan  8 15:17 SPEAKER_00_0107_1343.96-1350.94.flac
-rw-r--r-- 1 ubuntu ubuntu  543422 Jan  8 15:17 SPEAKER_00_0108_1352.02-1364.49.flac
-rw-r--r-- 1 ubuntu ubuntu   88403 Jan  8 15:17 SPEAKER_00_0109_1378.12-1380.03.flac
-rw-r--r-- 1 ubuntu ubuntu  269405 Jan  8 15:17 SPEAKER_00_0110_1381.19-1387.98.flac
-rw-r--r-- 1 ubuntu ubuntu  178701 Jan  8 15:17 SPEAKER_00_0111_1388.60-1392.70.flac
-rw-r--r-- 1 ubuntu ubuntu  519752 Jan  8 15:17 SPEAKER_00_0112_1393.17-1405.43.flac
-rw-r--r-- 1 ubuntu ubuntu  860043 Jan  8 15:17 SPEAKER_00_0113_1406.02-1426.61.flac
-rw-r--r-- 1 ubuntu ubuntu  379717 Jan  8 15:17 SPEAKER_00_0114_1427.31-1436.21.flac
-rw-r--r-- 1 ubuntu ubuntu  835264 Jan  8 15:17 SPEAKER_00_0119_1483.08-1502.67.flac
-rw-r--r-- 1 ubuntu ubuntu  410829 Jan  8 15:17 SPEAKER_00_0120_1503.26-1513.36.flac
-rw-r--r-- 1 ubuntu ubuntu  399477 Jan  8 15:17 SPEAKER_00_0121_1513.79-1522.94.flac
-rw-r--r-- 1 ubuntu ubuntu  547305 Jan  8 15:17 SPEAKER_00_0122_1523.70-1537.05.flac
-rw-r--r-- 1 ubuntu ubuntu   65690 Jan  8 15:17 SPEAKER_00_0123_1537.96-1539.33.flac
-rw-r--r-- 1 ubuntu ubuntu  518630 Jan  8 15:17 SPEAKER_00_0124_1540.10-1552.88.flac
-rw-r--r-- 1 ubuntu ubuntu  818556 Jan  8 15:17 SPEAKER_00_0144_1778.84-1799.06.flac
-rw-r--r-- 1 ubuntu ubuntu  667587 Jan  8 15:17 SPEAKER_00_0152_1927.31-1943.54.flac
-rw-r--r-- 1 ubuntu ubuntu  450262 Jan  8 15:17 SPEAKER_00_0153_1945.52-1956.62.flac
-rw-r--r-- 1 ubuntu ubuntu 1425121 Jan  8 15:17 SPEAKER_00_0154_1957.23-1991.72.flac
-rw-r--r-- 1 ubuntu ubuntu   86603 Jan  8 15:17 SPEAKER_00_0157_2015.78-2017.57.flac
-rw-r--r-- 1 ubuntu ubuntu  193497 Jan  8 15:17 SPEAKER_00_0176_2259.17-2263.23.flac
-rw-r--r-- 1 ubuntu ubuntu  196437 Jan  8 15:17 SPEAKER_00_0177_2263.64-2268.50.flac
-rw-r--r-- 1 ubuntu ubuntu  650714 Jan  8 15:17 SPEAKER_00_0178_2276.96-2292.57.flac
-rw-r--r-- 1 ubuntu ubuntu  478973 Jan  8 15:17 SPEAKER_00_0179_2292.89-2304.28.flac
-rw-r--r-- 1 ubuntu ubuntu  522534 Jan  8 15:17 SPEAKER_00_0180_2304.75-2317.31.flac
-rw-r--r-- 1 ubuntu ubuntu  224624 Jan  8 15:17 SPEAKER_00_0181_2318.17-2323.84.flac
-rw-r--r-- 1 ubuntu ubuntu  404186 Jan  8 15:17 SPEAKER_00_0182_2324.43-2333.26.flac
-rw-r--r-- 1 ubuntu ubuntu  323377 Jan  8 15:17 SPEAKER_00_0183_2334.00-2341.24.flac
-rw-r--r-- 1 ubuntu ubuntu  306941 Jan  8 15:17 SPEAKER_00_0184_2342.28-2349.47.flac
-rw-r--r-- 1 ubuntu ubuntu   93320 Jan  8 15:17 SPEAKER_00_0201_2641.72-2643.90.flac
-rw-r--r-- 1 ubuntu ubuntu  873847 Jan  8 15:17 SPEAKER_00_0202_2647.29-2668.89.flac
-rw-r--r-- 1 ubuntu ubuntu  849833 Jan  8 15:17 SPEAKER_00_0203_2669.34-2689.88.flac
-rw-r--r-- 1 ubuntu ubuntu   85393 Jan  8 15:17 SPEAKER_00_0204_2690.42-2692.08.flac
-rw-r--r-- 1 ubuntu ubuntu  940117 Jan  8 15:17 SPEAKER_00_0226_2942.29-2965.90.flac
-rw-r--r-- 1 ubuntu ubuntu  180754 Jan  8 15:17 SPEAKER_00_0227_2967.50-2971.70.flac
-rw-r--r-- 1 ubuntu ubuntu  416639 Jan  8 15:17 SPEAKER_00_0228_2972.24-2981.95.flac
-rw-r--r-- 1 ubuntu ubuntu  179593 Jan  8 15:17 SPEAKER_00_0229_2984.54-2988.63.flac
-rw-r--r-- 1 ubuntu ubuntu  332523 Jan  8 15:17 SPEAKER_00_0230_2998.82-3006.64.flac
-rw-r--r-- 1 ubuntu ubuntu  241018 Jan  8 15:17 SPEAKER_00_0231_3007.33-3013.30.flac
-rw-r--r-- 1 ubuntu ubuntu 1102092 Jan  8 15:17 SPEAKER_00_0232_3018.90-3045.17.flac
-rw-r--r-- 1 ubuntu ubuntu  295375 Jan  8 15:17 SPEAKER_00_0233_3045.73-3052.90.flac
-rw-r--r-- 1 ubuntu ubuntu  111038 Jan  8 15:17 SPEAKER_00_0234_3053.56-3056.02.flac
-rw-r--r-- 1 ubuntu ubuntu   78899 Jan  8 15:17 SPEAKER_00_0238_3134.05-3135.87.flac
-rw-r--r-- 1 ubuntu ubuntu   67415 Jan  8 15:17 SPEAKER_00_0243_3170.06-3171.51.flac
-rw-r--r-- 1 ubuntu ubuntu  152304 Jan  8 15:17 SPEAKER_00_0244_3175.31-3178.67.flac
-rw-r--r-- 1 ubuntu ubuntu  232736 Jan  8 15:17 SPEAKER_00_0250_3238.42-3244.06.flac
-rw-r--r-- 1 ubuntu ubuntu  183055 Jan  8 15:17 SPEAKER_00_0272_3431.43-3435.67.flac
-rw-r--r-- 1 ubuntu ubuntu  697357 Jan  8 15:17 SPEAKER_00_0273_3436.25-3452.57.flac
-rw-r--r-- 1 ubuntu ubuntu  282486 Jan  8 15:17 SPEAKER_00_0275_3482.61-3489.33.flac
-rw-r--r-- 1 ubuntu ubuntu  158090 Jan  8 15:17 SPEAKER_00_0276_3490.42-3494.16.flac
-rw-r--r-- 1 ubuntu ubuntu  166982 Jan  8 15:17 SPEAKER_00_0277_3494.78-3498.80.flac
-rw-r--r-- 1 ubuntu ubuntu  395305 Jan  8 15:17 SPEAKER_00_0278_3499.40-3508.90.flac
-rw-r--r-- 1 ubuntu ubuntu  536127 Jan  8 15:17 SPEAKER_00_0279_3515.64-3528.80.flac
-rw-r--r-- 1 ubuntu ubuntu  107495 Jan  8 15:17 SPEAKER_00_0284_3585.31-3587.49.flac
-rw-r--r-- 1 ubuntu ubuntu  569998 Jan  8 15:17 SPEAKER_00_0285_3590.36-3604.38.flac
-rw-r--r-- 1 ubuntu ubuntu  379357 Jan  8 15:17 SPEAKER_00_0317_4030.23-4039.68.flac
-rw-r--r-- 1 ubuntu ubuntu  257356 Jan  8 15:17 SPEAKER_00_0318_4040.42-4046.53.flac
-rw-r--r-- 1 ubuntu ubuntu  313858 Jan  8 15:17 SPEAKER_00_0319_4047.10-4054.56.flac
-rw-r--r-- 1 ubuntu ubuntu  508412 Jan  8 15:17 SPEAKER_00_0320_4054.91-4067.60.flac
-rw-r--r-- 1 ubuntu ubuntu   53435 Jan  8 15:17 SPEAKER_00_0335_4309.43-4310.64.flac
-rw-r--r-- 1 ubuntu ubuntu  400575 Jan  8 15:17 SPEAKER_00_0337_4327.94-4337.93.flac
-rw-r--r-- 1 ubuntu ubuntu  414262 Jan  8 15:17 SPEAKER_00_0338_4338.74-4349.39.flac
-rw-r--r-- 1 ubuntu ubuntu  242338 Jan  8 15:17 SPEAKER_00_0339_4349.87-4355.34.flac
-rw-r--r-- 1 ubuntu ubuntu  157458 Jan  8 15:17 SPEAKER_00_0345_4444.95-4448.80.flac
-rw-r--r-- 1 ubuntu ubuntu  871582 Jan  8 15:17 SPEAKER_00_0349_4482.24-4503.70.flac
-rw-r--r-- 1 ubuntu ubuntu  547063 Jan  8 15:17 SPEAKER_00_0350_4507.00-4520.45.flac
-rw-r--r-- 1 ubuntu ubuntu   56609 Jan  8 15:17 SPEAKER_00_0352_4531.98-4533.35.flac
-rw-r--r-- 1 ubuntu ubuntu  263813 Jan  8 15:17 SPEAKER_00_0359_4628.50-4634.80.flac
-rw-r--r-- 1 ubuntu ubuntu   82716 Jan  8 15:17 SPEAKER_00_0360_4668.04-4669.97.flac
-rw-r--r-- 1 ubuntu ubuntu  504556 Jan  8 15:17 SPEAKER_00_0377_4921.83-4934.77.flac
-rw-r--r-- 1 ubuntu ubuntu   47205 Jan  8 15:17 SPEAKER_00_0379_4954.92-4955.97.flac
-rw-r--r-- 1 ubuntu ubuntu  466612 Jan  8 15:17 SPEAKER_00_0380_4956.31-4967.76.flac
-rw-r--r-- 1 ubuntu ubuntu  475614 Jan  8 15:17 SPEAKER_00_0383_5026.83-5038.42.flac
-rw-r--r-- 1 ubuntu ubuntu  166602 Jan  8 15:17 SPEAKER_00_0385_5060.02-5063.93.flac
-rw-r--r-- 1 ubuntu ubuntu  185401 Jan  8 15:17 SPEAKER_00_0387_5076.78-5081.08.flac
-rw-r--r-- 1 ubuntu ubuntu  255285 Jan  8 15:17 SPEAKER_00_0395_5175.01-5180.93.flac
-rw-r--r-- 1 ubuntu ubuntu  137597 Jan  8 15:17 SPEAKER_00_0396_5181.54-5184.81.flac
-rw-r--r-- 1 ubuntu ubuntu  319092 Jan  8 15:17 SPEAKER_00_0398_5191.39-5199.21.flac
-rw-r--r-- 1 ubuntu ubuntu  153055 Jan  8 15:17 SPEAKER_00_0399_5203.34-5206.82.flac
-rw-r--r-- 1 ubuntu ubuntu   74178 Jan  8 15:17 SPEAKER_00_0402_5223.74-5225.31.flac
-rw-r--r-- 1 ubuntu ubuntu  542619 Jan  8 15:17 SPEAKER_00_0403_5226.41-5240.42.flac
-rw-r--r-- 1 ubuntu ubuntu  271919 Jan  8 15:17 SPEAKER_00_0409_5299.43-5305.82.flac
-rw-r--r-- 1 ubuntu ubuntu 1015391 Jan  8 15:17 SPEAKER_00_0413_5341.94-5367.40.flac
-rw-r--r-- 1 ubuntu ubuntu  209439 Jan  8 15:17 SPEAKER_01_0005_37.78-42.84.flac
-rw-r--r-- 1 ubuntu ubuntu 1448473 Jan  8 15:17 SPEAKER_01_0006_44.36-81.30.flac
-rw-r--r-- 1 ubuntu ubuntu  699929 Jan  8 15:17 SPEAKER_01_0007_81.60-98.51.flac
-rw-r--r-- 1 ubuntu ubuntu  652245 Jan  8 15:17 SPEAKER_01_0008_101.60-117.85.flac
-rw-r--r-- 1 ubuntu ubuntu  378175 Jan  8 15:17 SPEAKER_01_0009_118.27-128.06.flac


Summary: auto


**Planning batch transcription evaluation**


I found local audio segments, so I can run your exact dual validator on the latest 20-segment transcription sample and get real accept/retry/reject behavior with current thresholds. I’m running that now to quantify practical quality and failure modes.


venv/bin/python - <<'PY'
import json, os
from collections import Counter
from statistics import mean
from src.validators import validate_transcription, cleanup

input_file = 'transcriptions/test_new_schema_20seg.json'
base_audio = '/tmp/maya3_transcribe/pF_BQpHaIdU/extracted/pF_BQpHaIdU/segments'

with open(input_file, encoding='utf-8') as f:
    data = json.load(f)

rows = []
for r in data['results']:
    seg = r['segment_id']
    ap = os.path.join(base_audio, seg)
    if not os.path.exists(ap):
        continue
    native = r['transcription']['transcription']
    roman = r['transcription'].get('romanized','')
    vr = validate_transcription(ap, native, language='te', romanized_text=roman)
    rows.append({
        'segment': seg,
        'status': vr.status,
        'S': vr.combined_score,
        'N': vr.native_ctc_score,
        'R': vr.roman_mms_score,
        'diff': abs(vr.native_ctc_score - vr.roman_mms_score),
        'reasons': vr.reasons or []
    })

cleanup()

print('evaluated', len(rows))
print('status_counts', dict(Counter(r['status'] for r in rows)))
print('mean_S', round(mean(r['S'] for r in rows), 4) if rows else None)
print('min_S', round(min(r['S'] for r in rows), 4) if rows else None)
print('max_S', round(max(r['S'] for r in rows), 4) if rows else None)
print('mean_N', round(mean(r['N'] for r in rows), 4) if rows else None)
print('mean_R', round(mean(r['R'] for r in rows), 4) if rows else None)
print('high_disagreement', sum(1 for r in rows if r['diff'] > 0.25))

print('\nworst5')
for r in sorted(rows, key=lambda x:x['S'])[:5]:
    print(r['segment'], 'S=', round(r['S'],3), 'N=', round(r['N'],3), 'R=', round(r['R'],3), 'status=', r['status'])
    if r['reasons']:
        print('  reason:', '; '.join(r['reasons'][:2]))

print('\nretry_or_reject')
for r in rows:
    if r['status'] in ('retry','reject'):
        print(r['segment'], 'S=', round(r['S'],3), 'N=', round(r['N'],3), 'R=', round(r['R'],3), 'status=', r['status'])

PY


Output:
Exit code: 0
Wall time: 15.8 seconds
Output:
[CTCAligner] Loading anuragshas/wav2vec2-large-xlsr-53-telugu...
[CTCAligner] Ready on cuda
[MMSAligner] Ready on cuda (29 labels, SR=16000)
evaluated 22
status_counts {'accept': 21, 'reject': 1}
mean_S 0.0
min_S 0.0
max_S 0.0
mean_N 0.0
mean_R 0.7819
high_disagreement 21

worst5
SPEAKER_00_0000_0.03-2.61.flac S= 0.0 N= 0.0 R= 0.72 status= accept
SPEAKER_00_0001_3.05-13.40.flac S= 0.0 N= 0.0 R= 0.772 status= accept
SPEAKER_00_0002_16.08-28.31.flac S= 0.0 N= 0.0 R= 0.862 status= accept
SPEAKER_00_0002_16.08-28.31.flac S= 0.0 N= 0.0 R= 0.951 status= accept
SPEAKER_00_0003_29.78-34.93.flac S= 0.0 N= 0.0 R= 0.901 status= accept

retry_or_reject
SPEAKER_00_0077_1026.28-1027.43.flac S= 0.0 N= 0.0 R= 0.0 status= reject
/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/transformers/configuration_utils.py:309: UserWarning: Passing `gradient_checkpointing` to a config initialization is deprecated and will be removed in v5 Transformers. Using `model.gradient_checkpointing_enable()` instead, or if you are using the `Trainer` API, pass `gradient_checkpointing=True` in your `TrainingArguments`.
  warnings.warn(
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)
Traceback (most recent call last):
  File "/home/ubuntu/maya3_transcribe/src/validators/ctc_forced_aligner.py", line 334, in align
    targets, oov_ratio = self._text_to_tokens(transcription)
ValueError: too many values to unpack (expected 2)


**Identifying critical logic bug**


nl -ba src/validators/ctc_forced_aligner.py | sed -n '180,280p'


nl -ba src/validators/ctc_forced_aligner.py | sed -n '320,390p'


nl -ba src/validators/simple_validator.py | sed -n '330,430p'


Output:
Exit code: 0
Wall time: 0 seconds
Output:
   180	            data = data.mean(axis=1)
   181
   182	        if sr != 16000:
   183	            waveform = torch.from_numpy(data).float().unsqueeze(0)
   184	            data = torchaudio.functional.resample(waveform, sr, 16000).squeeze().numpy()
   185	            sr = 16000
   186
   187	        return data, sr
   188
   189	    def _get_emissions(self, audio: np.ndarray) -> torch.Tensor:
   190	        """Get CTC log-probability emissions."""
   191	        inputs = self.processor(
   192	            audio, sampling_rate=16000, return_tensors="pt", padding=True
   193	        )
   194
   195	        with torch.no_grad():
   196	            logits = self.model(inputs.input_values.to(self.device)).logits
   197
   198	        emissions = torch.log_softmax(logits.cpu(), dim=-1)
   199	        return emissions
   200
   201	    def _text_to_tokens(self, text: str) -> tuple:
   202	        """Convert text to token IDs. Returns (tensor, oov_ratio).
   203	        OOV chars are dropped but tracked. High OOV = unreliable score."""
   204	        tokens = []
   205	        total_chars = 0
   206	        oov_chars = 0
   207	        for char in text:
   208	            if char == " ":
   209	                if "|" in self.vocab:
   210	                    tokens.append(self.vocab["|"])
   211	            elif char in self.vocab:
   212	                tokens.append(self.vocab[char])
   213	                total_chars += 1
   214	                total_chars += 1
   215	            else:
   216	                oov_chars += 1
   217	                total_chars += 1
   218	        oov_ratio = oov_chars / max(total_chars, 1)
   219	        if oov_ratio > 0.1:
   220	            print(f"[CTCAligner] WARNING: {oov_ratio:.0%} OOV chars "
   221	                  f"({oov_chars}/{total_chars})")
   222	        oov_ratio = oov_chars / max(total_chars, 1)
   223	        return torch.tensor([tokens], dtype=torch.int32), oov_ratio, oov_ratio
   224
   225	    def _compute_word_alignments(
   226	        self,
   227	        text: str,
   228	        alignment: torch.Tensor,
   229	        scores: torch.Tensor,
   230	        frame_duration: float
   231	    ) -> List[WordAlignment]:
   232	        """Extract word-level alignments from frame-level results."""
   233	        words = text.split()
   234
   235	        # Build character-to-word mapping
   236	        char_to_word = []
   237	        for word_idx, word in enumerate(words):
   238	            for _ in word:
   239	                char_to_word.append(word_idx)
   240	            char_to_word.append(-1)  # Space/separator
   241
   242	        # Remove trailing separator
   243	        if char_to_word and char_to_word[-1] == -1:
   244	            char_to_word = char_to_word[:-1]
   245
   246	        # Aggregate scores per word
   247	        word_scores = {i: [] for i in range(len(words))}
   248	        word_frames = {i: [] for i in range(len(words))}
   249
   250	        alignment_np = alignment[0].numpy()
   251	        scores_np = scores[0].numpy()
   252
   253	        char_idx = 0
   254	        for frame_idx, (token_idx, score) in enumerate(zip(alignment_np, scores_np)):
   255	            if token_idx != self.blank_id and char_idx < len(char_to_word):
   256	                word_idx = char_to_word[char_idx]
   257	                if word_idx >= 0:
   258	                    word_scores[word_idx].append(score)
   259	                    word_frames[word_idx].append(frame_idx)
   260	                char_idx += 1
   261
   262	        # Create WordAlignment objects
   263	        alignments = []
   264	        for word_idx, word in enumerate(words):
   265	            word_score_list = word_scores.get(word_idx, [])
   266	            frame_list = word_frames.get(word_idx, [])
   267
   268	            if word_score_list:
   269	                mean_log_prob = np.mean(word_score_list)
   270	                # Convert log prob to 0-1 confidence
   271	                # log_prob of 0 = prob of 1 (perfect)
   272	                # log_prob of -5 = prob of ~0.007 (bad)
   273	                confidence = np.exp(mean_log_prob)
   274	                confidence = min(1.0, max(0.0, confidence))
   275
   276	                start_frame = min(frame_list)
   277	                end_frame = max(frame_list) + 1
   278	            else:
   279	                mean_log_prob = -10.0
   280	                confidence = 0.0


Output:
Exit code: 0
Wall time: 0 seconds
Output:
   320
   321	        start_time = time.time()
   322
   323	        try:
   324	            # Load audio
   325	            audio, sr = self._load_audio(audio_path)
   326	            audio_duration = len(audio) / sr
   327
   328	            # Get emissions
   329	            emissions = self._get_emissions(audio)
   330	            num_frames = emissions.shape[1]
   331	            frame_duration = audio_duration / num_frames
   332
   333	            # Convert text to tokens (returns tuple with OOV ratio)
   334	            targets, oov_ratio = self._text_to_tokens(transcription)
   335
   336	            if targets.shape[1] == 0:
   337	                return AlignmentResult(
   338	                    audio_path=audio_path,
   339	                    transcription=transcription,
   340	                    alignment_score=0.0,
   341	                    mean_log_prob=-10.0,
   342	                    audio_duration_sec=audio_duration,
   343	                    processing_time_sec=time.time() - start_time
   344	                )
   345
   346	            # Run forced alignment
   347	            input_lengths = torch.tensor([num_frames])
   348	            target_lengths = torch.tensor([targets.shape[1]])
   349
   350	            alignment, scores = torchaudio.functional.forced_align(
   351	                emissions,
   352	                targets,
   353	                input_lengths,
   354	                target_lengths,
   355	                blank=self.blank_id
   356	            )
   357
   358	            # Compute word alignments
   359	            word_alignments = self._compute_word_alignments(
   360	                transcription, alignment, scores, frame_duration
   361	            )
   362
   363	            # Overall scores
   364	            mean_log_prob = scores.mean().item()
   365
   366	            # Convert to 0-1 score
   367	            # Typical range: -0.5 (excellent) to -5.0 (poor)
   368	            # Map to 0-1: score = 1 + (log_prob / 5)
   369	            alignment_score = max(0.0, min(1.0, 1.0 + mean_log_prob / 5.0))
   370	            # Penalize when many chars were OOV (alignment unreliable)
   371	            if oov_ratio > 0.1:
   372	                alignment_score *= (1.0 - oov_ratio * 0.5)
   373	            # Penalize score when many chars were OOV (alignment is unreliable)
   374	            if oov_ratio > 0.1:
   375	                alignment_score *= (1.0 - oov_ratio * 0.5)
   376
   377	            # Find low confidence words
   378	            low_conf_words = [wa.word for wa in word_alignments if wa.is_low_confidence]
   379	            low_conf_ratio = len(low_conf_words) / max(len(word_alignments), 1)
   380
   381	            processing_time = time.time() - start_time
   382
   383	            return AlignmentResult(
   384	                audio_path=audio_path,
   385	                transcription=transcription,
   386	                alignment_score=alignment_score,
   387	                mean_log_prob=mean_log_prob,
   388	                word_alignments=word_alignments,
   389	                low_confidence_words=low_conf_words,
   390	                low_confidence_ratio=low_conf_ratio,


Output:
Exit code: 0
Wall time: 0 seconds
Output:
   330	            char_valid=False,
   331	            invalid_chars=char_check["invalid_chars"],
   332	            script_ratio=char_check["script_ratio"],
   333	            reasons=["Invalid/alien characters found"]
   334	        )
   335
   336	    if char_check["script_ratio"] < 0.5:
   337	        reasons.append(f"Too few native chars ({char_check['script_ratio']:.0%})")
   338
   339	    # === STEP 2: Native CTC alignment ===
   340	    native_ctc_score = 0.0
   341	    low_conf_words = []
   342	    low_conf_ratio = 0.0
   343
   344	    if check_audio:
   345	        try:
   346	            aligner = _get_ctc_aligner(language)
   347	            ctc_result = aligner.align(audio_path, clean_text)
   348	            native_ctc_score = ctc_result.alignment_score
   349	            low_conf_words = ctc_result.low_confidence_words
   350	            low_conf_ratio = ctc_result.low_confidence_ratio
   351	        except Exception as e:
   352	            reasons.append(f"CTC alignment failed: {str(e)[:50]}")
   353
   354	    # === STEP 3: Romanized MMS alignment ===
   355	    roman_mms_score = 0.0
   356
   357	    if check_audio and clean_roman:
   358	        try:
   359	            mms = _get_mms_aligner()
   360	            mms_result = mms.align(audio_path, clean_roman)
   361	            roman_mms_score = mms_result.alignment_score
   362	        except Exception as e:
   363	            reasons.append(f"MMS alignment failed: {str(e)[:50]}")
   364
   365	    # === STEP 4: Combined scoring ===
   366	    if check_audio and native_ctc_score > 0 and roman_mms_score > 0:
   367	        # Dual scoring: weighted formula with disagreement penalty
   368	        combined_score, verdict = compute_combined_score(
   369	            native_ctc_score, roman_mms_score
   370	        )
   371	        if verdict == "review" and abs(native_ctc_score - roman_mms_score) > 0.25:
   372	            reasons.append(
   373	                f"High validator disagreement: CTC={native_ctc_score:.2f} vs "
   374	                f"MMS={roman_mms_score:.2f}"
   375	            )
   376	    elif check_audio and native_ctc_score > 0:
   377	        # Fallback: CTC only (no romanized text provided)
   378	        combined_score = native_ctc_score
   379	        if native_ctc_score >= 0.70:
   380	            verdict = "accept"
   381	        elif native_ctc_score >= 0.50:
   382	            verdict = "retry"
   383	        else:
   384	            verdict = "reject"
   385	    else:
   386	        # No audio check or both failed
   387	        combined_score = 0.0
   388	        verdict = "review" if reasons else "accept"
   389
   390	    # Character validation failures override
   391	    if not char_check["valid"]:
   392	        verdict = "reject"
   393
   394	    # Append score-based reasons
   395	    if verdict == "retry":
   396	        reasons.append(
   397	            f"Below threshold: combined={combined_score:.2f} "
   398	            f"(CTC={native_ctc_score:.2f}, MMS={roman_mms_score:.2f})"
   399	        )
   400	    elif verdict == "reject" and combined_score > 0:
   401	        reasons.append(
   402	            f"Poor alignment: combined={combined_score:.2f} "
   403	            f"(CTC={native_ctc_score:.2f}, MMS={roman_mms_score:.2f})"
   404	        )
   405
   406	    return ValidationResult(
   407	        status=verdict,
   408	        char_valid=char_check["valid"],
   409	        invalid_chars=char_check.get("invalid_chars"),
   410	        script_ratio=char_check["script_ratio"],
   411	        alignment_score=native_ctc_score,  # backward compat
   412	        native_ctc_score=native_ctc_score,
   413	        roman_mms_score=roman_mms_score,
   414	        combined_score=combined_score,
   415	        low_confidence_words=low_conf_words,
   416	        low_confidence_ratio=low_conf_ratio,
   417	        reasons=reasons if reasons else None,
   418	    )
   419
   420
   421	def cleanup():
   422	    """Release all aligner resources (CTC + MMS)."""
   423	    global _ctc_aligner, _mms_aligner
   424	    if _ctc_aligner is not None:
   425	        _ctc_aligner.cleanup()
   426	        _ctc_aligner = None
   427	    if _mms_aligner is not None:
   428	        _mms_aligner.cleanup()
   429	        _mms_aligner = None
   430


**Evaluating test stability and consistency**


I found a critical validator bug: native CTC is currently failing silently, and those segments can still be marked `accept` with `combined_score=0`. I’m checking your consistency and benchmark artifacts next so I can give you a fair final score after accounting for this failure mode.


rg -n "consisten|determin|same|run|variance|diff|temperature|thinking|model|pass|fail" consistency_test -S


Output:
Exit code: 0
Wall time: 0 seconds
Output:
total 132
drwxrwxr-x  2 ubuntu ubuntu  4096 Feb  7 03:46 .
drwxrwxr-x 14 ubuntu ubuntu  4096 Feb 12 23:23 ..
-rw-rw-r--  1 ubuntu ubuntu 58301 Feb  7 03:26 comparison.json
-rw-rw-r--  1 ubuntu ubuntu  3161 Feb  7 03:48 roman_alignment.json
-rw-rw-r--  1 ubuntu ubuntu 17942 Feb  7 03:24 run_1.json
-rw-rw-r--  1 ubuntu ubuntu 17941 Feb  7 03:25 run_2.json
-rw-rw-r--  1 ubuntu ubuntu 17940 Feb  7 03:26 run_3.json


Output:
Exit code: 0
Wall time: 0 seconds
Output:
consistency_test/run_1.json
consistency_test/run_2.json
consistency_test/run_3.json
consistency_test/comparison.json
consistency_test/roman_alignment.json


Output:
Exit code: 0
Wall time: 0 seconds
Output:
consistency_test/comparison.json:3:    "model": "gemini-3-flash-preview",
consistency_test/comparison.json:4:    "temperature": 0.0,
consistency_test/comparison.json:5:    "thinking_level": "low",
consistency_test/comparison.json:7:    "num_runs": 3,
consistency_test/comparison.json:13:    "minor_diff": 0,
consistency_test/comparison.json:14:    "major_diff": 0
consistency_test/comparison.json:16:  "runs": [


sed -n '1,200p' consistency_test/run_1.json


Output:
Exit code: 0
Wall time: 0 seconds
Total output lines: 1062
Output:
{
  "config": {
    "model": "gemini-3-flash-preview",
    "temperature": 0.0,
    "thinking_level": "low",
    "language": "Telugu",
    "num_runs": 3,
    "num_segments": 10
  },
  "summary": {
    "total": 10,
    "identical": 10,
    "minor_diff": 0,
    "major_diff": 0
  },
  "runs": [
    {
      "SPEAKER_00_0000_0.03-2.61.flac": {
        "transcription": "వస్తుందన్నమాట. నాకు కొన్ని యాడ్స్ గుర్తుంటాయి లైక్ ఎగ్జాంపుల్ కచ్చా మ్యాంగో బైట్.",
        "code_switch": "వస్తుందన్నమాట. నాకు కొన్ని ads గుర్తుంటాయి like example కచ్చా మ్యాంగో బైట్.",
        "romanized": "vastundannamaata. naaku konni ads gurtuntaayi like example kachcha mango bite.",
        "tagged": "వస్తుందన్నమాట. నాకు కొన్ని ads గుర్తుంటాయి like example కచ్చా మ్యాంగో బైట్.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.18,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.7173,
          "low_conf_words": [
            "వస్తుందన్నమాట",
            "నాకు",
            "కొన్ని",
            "యాడ్స్",
            "గుర్తుంటాయి",
            "లైక్",
            "ఎగ్జాంపుల్",
            "మ్యాంగో",
            "బైట్"
          ]
        }
      },
      "SPEAKER_00_0001_3.05-13.40.flac": {
        "transcription": "ఆ మా చెమ్మంగిలో ఒక రిటైర్డ్ తాతమ్మ ఒకడున్నాడు ఐ విల్ నాట్ నేమ్ హిమ్ బట్ మరి ఏంటంటే మ్యాంగోస్ తీసుకుని జిరాక్స్ షాప్ కి వెళ్ళాడన్నమాట ఇన్ ఫ్యాక్ట్ నాకు ఫోటో కాపీ అంటే వేరు జిరాక్స్ అంటే వేరు అని తెలిసింది అక్కడే అవును",
        "code_switch": "ఆ మా చెమ్మంగిలో ఒక retired తాతమ్మ ఒకడున్నాడు I will not name him but మరి ఏంటంటే mangoes తీసుకుని xerox shop కి వెళ్ళాడన్నమాట in fact నాకు photocopy అంటే వేరు xerox అంటే వేరు అని తెలిసింది అక్కడే అవును",
        "romanized": "aa maa chemmangilo oka retired taatamma okadunnaadu I will not name him but mari entante mangoes teesukuni xerox shop ki vellaadannamaata in fact naaku photocopy ante veru xerox ante veru ani telisindi akkade avunu",
        "tagged": "ఆ మా చెమ్మంగిలో ఒక retired తాతమ్మ ఒకడున్నాడు I will not name him but మరి ఏంటంటే mangoes తీసుకుని xerox shop కి వెళ్ళాడన్నమాట in fact నాకు photocopy అంటే వేరు xerox అంటే వేరు అని తెలిసింది అక్కడే అవును",
        "speaker": {
          "emotion": "happy",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 4.06,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.7026,
          "low_conf_words": [
            "మా",
            "చెమ్మంగిలో",
            "ఒక",
            "రిటైర్డ్",
            "తాతమ్మ",
            "ఒకడున్నాడు",
            "విల్",
            "నాట్",
            "నేమ్",
            "హిమ్",
            "బట్",
            "మరి",
            "ఏంటంటే",
            "మ్యాంగోస్",
            "తీసుకుని",
            "జిరాక్స్",
            "షాప్",
            "కి",
            "వెళ్ళాడన్నమాట",
            "ఇన్",
            "ఫ్యాక్ట్",
            "నాకు",
            "ఫోటో",
            "అంటే",
            "వేరు",
            "వేరు",
            "తెలిసింది",
            "అక్కడే",
            "అవును"
          ]
        }
      },
      "SPEAKER_00_0003_29.78-34.93.flac": {
        "transcription": "అసలు ఆ ఇన్ ఫ్యాక్ట్ లైక్ ఐ గాట్ టు నో దట్ యు వర్ బిహైండ్ ది కచ్చా మ్యాంగోస్",
        "code_switch": "అసలు ఆ in fact like I got to know that you were behind the Kaccha Mangoes",
        "romanized": "asalu aa in fact like I got to know that you were behind the Kaccha Mangoes",
        "tagged": "అసలు ఆ [breath] in fact like I got to know that you were behind the Kaccha Mangoes",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.81,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.8158,
          "low_conf_words": [
            "ఫ్యాక్ట్",
            "లైక్",
            "గాట్",
            "టు",
            "నో",
            "యు",
            "వర్",
            "బిహైండ్",
            "మ్యాంగోస్"
          ]
        }
      },
      "SPEAKER_00_0004_36.29-37.41.flac": {
        "transcription": "టాక్ అబౌట్ దట్ స్టోరీ యాజ్ వెల్.",
        "code_switch": "talk about that story as well.",
        "romanized": "talk about that story as well.",
        "tagged": "talk about that story as well.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.43,
        "validation": {
          "status": "reject",
          "char_valid": true,
          "alignment_score": 0.4755,
          "low_conf_words": [
            "టాక్",
            "అబౌట్",
            "దట్",
            "స్టోరీ",
            "యాజ్",
            "వెల్"
          ]
        }
      },
      "SPEAKER_00_0026_383.26-390.66.flac": {
        "transcription": "కనెక్షన్ ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా కనెక్టెడ్ క్వశ్చన్స్ ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక పార్లేజీ గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు పాడ్కాస్ట్ చూశారు కదా.",
        "code_switch": "connection ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా connected questions ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక Parle-G గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు podcast చూశారు కదా.",
        "romanized": "connection untundannamaata. aa ante deeni gurinchi chaala connected questions unnaayi naaku. deenikante mundu indaaka Parle-G gurinchi teesukochhaaru kaabatti avunu. ippativaraku podcast chooshaaru kada.",
        "tagged": "connection ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా connected questions ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక Parle-G గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు podcast చూశారు కదా.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.73,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.7138,
          "low_conf_words": [
            "ఉంటుందన్నమాట",
            "అంటే",
            "దీని",
            "చాలా",
            "కనెక్టెడ్",
            "క్వశ్చన్స్",
            "ఉన్నాయి",
            "నాకు",
            "దీనికంటే",
            "ముందు",
            "ఇందాక",
            "పార్లేజీ",
            "తీసుకొచ్చారు",
            "కాబట్టి",
            "అవును",
            "ఇప్పటివరకు",
            "పాడ్కాస్ట్",
            "చూశారు",
            "కదా"
          ]
        }
      },
      "SPEAKER_00_0027_394.58-397.79.flac": {
        "transcription": "పాడ్కాస్ట్ చూస్తున్న పది మందిలో ఐదుగురికి మార్కెటర్ అవ్వాలన్న థాట్ వస్తది",
        "code_switch": "Podcast చూస్తున్న పది మందిలో ఐదుగురికి Marketer అవ్వాలన్న Thought వస్తది",
        "romanized": "Podcast chustunna padi mandilo aiduguriki Marketer avvalanna Thought vastadi",
        "tagged": "Podcast చూస్తున్న పది మందిలో ఐదుగురికి Marketer అవ్వాలన్న Thought వస్తది",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.09,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.7259,
          "low_conf_words": [
            "పాడ్కాస్ట్",
            "చూస్తున్న",
            "మందిలో",
            "ఐదుగురికి",
            "అవ్వాలన్న",
            "థాట్",
            "వస్తది"
          ]
        }
      },
      "SPEAKER_00_0031_450.01-460.11.flac": {
        "transcription": "సర్ ఆల్మోస్ట్ ఫిఫ్టీ వన్ ఫిఫ్టీ వన్ పాడ్కాస్ట్ ఫిఫ్టీ పాడ్కాస్ట్స్ అయిపోయినాయి. మనది ఫిఫ్టీ సెకండ్ అప్రాక్సిమేట్లీ. కంగ్రాచులేషన్స్. థాంక్యూ థాంక్యూ. మీ మీ తెలుగు చాలా క్లాసీగా ఉంది సర్.",
        "code_switch": "Sir almost 51 51 podcast 50 podcasts అయిపోయినాయి. మనది 52nd approximately. Congratulations. Thank you thank you. మీ మీ తెలుగు చాలా classy గా ఉంది sir.",
        "romanized": "Sir almost fifty one fifty one podcast fifty podcasts ayipoyinayi. Manadi fifty second approximately. Congratulations. Thank you thank you. Mee mee Telugu chaala classy ga undi sir.",
        "tagged": "Sir almost 51 51 podcast 50 podcasts అయిపోయినాయి. మనది 52nd approximately. Congratulations. Thank you thank you. మీ మీ తెలుగు చాలా classy గా ఉంది sir.",
        "speaker": {
          "emotion": "happy",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.63,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.7218,
          "low_conf_words": [
            "సర్",
            "ఆల్మోస్ట్",
            "ఫిఫ్టీ",
            "ఫిఫ్టీ",
            "పాడ్కాస్ట్స్",
            "అయిపోయినాయి",
            "మనది",
            "ఫిఫ్టీ",
            "సెకండ్",
            "అప్రాక్సిమేట్లీ",
            "కంగ్రాచులేషన్స్",
            "థాంక్యూ",
            "మీ",
            "మీ",
            "తెలుగు",
            "చాలా",
            "ఉంది",
            "సర్"
          ]
        }
      },
      "SPEAKER_00_0037_521.61-528.64.flac": {
        "transcription": "స్మూత్ ఉంది కాకపోతే కొంచెం క్లాసీ వర్డ్స్ వస్తున్నాయి ఎనీవేస్. సో ఇంకో రెండు మూడు ప్రొడక్ట్స్ గురించి కూడా క్వశ్చన్స్ ఉన్నాయి అనుకో.",
        "code_switch": "స్మూత్ ఉంది కాకపోతే కొంచెం classy words వస్తున్నాయి anyways. సో ఇంకో రెండు మూడు products గురించి కూడా questions ఉన్నాయి అనుకో.",
        "romanized": "smooth undi kakapothe konchem classy words vasthunnayi anyways. so inko rendu moodu products gurinchi kooda questions unnayi anuko.",
        "tagged": "స్మూత్ ఉంది కాకపోతే కొంచెం classy words వస్తున్నాయి anyways. సో ఇంకో రెండు మూడు products గురించి కూడా questions ఉన్నాయి అనుకో.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.72,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.6768,
          "low_conf_words": [
            "స్మూత్",
            "కాకపోతే",
            "కొంచెం",
            "క్లాసీ",
            "వర్డ్స్",
            "వస్తున్నాయి",
            "ఎనీవేస్",
            "సో",
            "మూడు",
            "ప్రొడక్ట్స్",
            "గురించి",
            "కూడా",
            "క్వశ్చన్స్",
            "ఉన్నాయి",
            "అనుకో"
          ]
        }
      },
      "SPEAKER_00_0050_627.86-632.46.flac": {
        "transcription": "సో ఈ గ్లూకోజ్ బిస్కెట్ నుంచి గ్లూకో ఏంది గ్లూకో నుంచి జి ఏంది కరెక్ట్ పార్లే జి కరెక్ట్ కరెక్ట్",
        "code_switch": "సో ఈ glucose biscuit నుంచి gluco ఏంది gluco నుంచి G ఏంది correct Parle-G correct correct",
        "romanized": "so ee glucose biscuit nunchi gluco endi gluco nunchi G endi correct Parle-G correct correct",
        "tagged": "సో ఈ glucose biscuit నుంచి gluco ఏంది gluco నుంచి G ఏంది correct Parle-G correct correct",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.31,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.7822,
          "low_conf_words": [
            "ఈ",
            "గ్లూకోజ్",
            "బిస్కెట్",
            "నుంచి",
            "నుంచి",
            "జి",
            "ఏంది",
            "కరెక్ట్",
            "పార్లే",
            "జి",
            "కరెక్ట్"
          ]
        }
      },
      "SPEAKER_00_0058_728.26-741.21.flac": {
        "transcription": "ఫోర్ ఫిఫ్టీ ఫైవ్ హండ్రెడ్ వరకు ఉన్నాయండి. ఓకే అందులో ఒక ఎస్ కే యు గురించి హా ఐ హర్డ్ ఇట్ కరెక్ట్ మీ ఇఫ్ ఐ యామ్ రాంగ్ రోలా కోలా అనే ఒక ప్రొడక్ట్ దాన్ని డిస్కేల్ చేద్దామని ఆపేసి తర్వాత ఎవరో ట్విట్టర్ లో ట్వీట్ చేస్తే",
        "code_switch": "450 500 వరకు ఉన్నాయండి. ఓకే అందులో ఒక SKU గురించి హా I heard it correct me if I am wrong Rola Cola అనే ఒక product దాన్ని descale చేద్దామని ఆపేసి తర్వాత ఎవరో Twitter లో tweet చేస్తే",
        "romanized": "four fifty five hundred varaku unnayandi. okay andulo oka SKU gurinchi ha I heard it correct me if I am wrong Rola Cola ane oka product danni descale cheddamani apesi tarvata evaro Twitter lo tweet cheste",
        "tagged": "450 500 వరకు ఉన్నాయండి. ఓకే అందులో ఒక SKU గురించి హా I heard it correct me if I am wrong Rola Cola అనే ఒక product దాన్ని descale చేద్దామని ఆపేసి తర్వాత ఎవరో Twitter లో tweet చేస్తే",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 4.07,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.8389,
          "low_conf_words": [
            "ఫోర్",
            "ఫిఫ్టీ",
            "ఫైవ్",
            "హండ్రెడ్",
            "వరకు",
            "ఉన్నాయండి",
            "ఓకే",
            "అందులో",
            "ఎస్",
            "గురించి",
            "హా",
            "ఇట్",
            "కరెక్ట్",
            "ఇఫ్",
            "ఐ",
            "యామ్",
            "రాంగ్",
            "రోలా",
            "కోలా",
            "అనే",
            "డిస్కేల్",
            "తర్వాత",
            "ట్వీట్"
          ]
        }
      }
    },
    {
      "SPEAKER_00_0000_0.03-2.61.flac": {
        "transcription": "వస్తుందన్నమాట. నాకు కొన్ని యాడ్స్ గుర్తుంటాయి లైక్ ఎగ్జాంపుల్ కచ్చా మ్యాంగో బైట్.",
        "code_switch": "వస్తుందన్నమాట. నాక…4576 tokens truncated…  "ఫైవ్",
            "హండ్రెడ్",
            "వరకు",
            "ఉన్నాయండి",
            "ఓకే",
            "అందులో",
            "ఎస్",
            "గురించి",
            "హా",
            "ఇట్",
            "కరెక్ట్",
            "ఇఫ్",
            "ఐ",
            "యామ్",
            "రాంగ్",
            "రోలా",
            "కోలా",
            "అనే",
            "డిస్కేల్",
            "తర్వాత",
            "ట్వీట్"
          ]
        }
      }
    },
    {
      "SPEAKER_00_0000_0.03-2.61.flac": {
        "transcription": "వస్తుందన్నమాట. నాకు కొన్ని యాడ్స్ గుర్తుంటాయి లైక్ ఎగ్జాంపుల్ కచ్చా మ్యాంగో బైట్.",
        "code_switch": "వస్తుందన్నమాట. నాకు కొన్ని ads గుర్తుంటాయి like example కచ్చా మ్యాంగో బైట్.",
        "romanized": "vastundannamaata. naaku konni ads gurtuntaayi like example kachcha mango bite.",
        "tagged": "వస్తుందన్నమాట. నాకు కొన్ని ads గుర్తుంటాయి like example కచ్చా మ్యాంగో బైట్.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.76,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.7173,
          "low_conf_words": [
            "వస్తుందన్నమాట",
            "నాకు",
            "కొన్ని",
            "యాడ్స్",
            "గుర్తుంటాయి",
            "లైక్",
            "ఎగ్జాంపుల్",
            "మ్యాంగో",
            "బైట్"
          ]
        }
      },
      "SPEAKER_00_0001_3.05-13.40.flac": {
        "transcription": "ఆ మా చెమ్మంగిలో ఒక రిటైర్డ్ తాతమ్మ ఒకడున్నాడు ఐ విల్ నాట్ నేమ్ హిమ్ బట్ మరి ఏంటంటే మ్యాంగోస్ తీసుకుని జిరాక్స్ షాప్ కి వెళ్ళాడన్నమాట ఇన్ ఫ్యాక్ట్ నాకు ఫోటో కాపీ అంటే వేరు జిరాక్స్ అంటే వేరు అని తెలిసింది అక్కడే అవును",
        "code_switch": "ఆ మా చెమ్మంగిలో ఒక retired తాతమ్మ ఒకడున్నాడు I will not name him but మరి ఏంటంటే mangoes తీసుకుని xerox shop కి వెళ్ళాడన్నమాట in fact నాకు photocopy అంటే వేరు xerox అంటే వేరు అని తెలిసింది అక్కడే అవును",
        "romanized": "aa maa chemmangilo oka retired taatamma okadunnaadu I will not name him but mari entante mangoes teesukuni xerox shop ki vellaadannamaata in fact naaku photocopy ante veru xerox ante veru ani telisindi akkade avunu",
        "tagged": "ఆ మా చెమ్మంగిలో ఒక retired తాతమ్మ ఒకడున్నాడు I will not name him but మరి ఏంటంటే mangoes తీసుకుని xerox shop కి వెళ్ళాడన్నమాట in fact నాకు photocopy అంటే వేరు xerox అంటే వేరు అని తెలిసింది అక్కడే అవును",
        "speaker": {
          "emotion": "happy",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.34,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.7026,
          "low_conf_words": [
            "మా",
            "చెమ్మంగిలో",
            "ఒక",
            "రిటైర్డ్",
            "తాతమ్మ",
            "ఒకడున్నాడు",
            "విల్",
            "నాట్",
            "నేమ్",
            "హిమ్",
            "బట్",
            "మరి",
            "ఏంటంటే",
            "మ్యాంగోస్",
            "తీసుకుని",
            "జిరాక్స్",
            "షాప్",
            "కి",
            "వెళ్ళాడన్నమాట",
            "ఇన్",
            "ఫ్యాక్ట్",
            "నాకు",
            "ఫోటో",
            "అంటే",
            "వేరు",
            "వేరు",
            "తెలిసింది",
            "అక్కడే",
            "అవును"
          ]
        }
      },
      "SPEAKER_00_0003_29.78-34.93.flac": {
        "transcription": "అసలు ఆ ఇన్ ఫ్యాక్ట్ లైక్ ఐ గాట్ టు నో దట్ యు వర్ బిహైండ్ ది కచ్చా మ్యాంగోస్",
        "code_switch": "అసలు ఆ in fact like I got to know that you were behind the Kaccha Mangoes",
        "romanized": "asalu aa in fact like I got to know that you were behind the Kaccha Mangoes",
        "tagged": "అసలు ఆ [breath] in fact like I got to know that you were behind the Kaccha Mangoes",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.86,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.8158,
          "low_conf_words": [
            "ఫ్యాక్ట్",
            "లైక్",
            "గాట్",
            "టు",
            "నో",
            "యు",
            "వర్",
            "బిహైండ్",
            "మ్యాంగోస్"
          ]
        }
      },
      "SPEAKER_00_0004_36.29-37.41.flac": {
        "transcription": "టాక్ అబౌట్ దట్ స్టోరీ యాజ్ వెల్.",
        "code_switch": "talk about that story as well.",
        "romanized": "talk about that story as well.",
        "tagged": "talk about that story as well.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.32,
        "validation": {
          "status": "reject",
          "char_valid": true,
          "alignment_score": 0.4755,
          "low_conf_words": [
            "టాక్",
            "అబౌట్",
            "దట్",
            "స్టోరీ",
            "యాజ్",
            "వెల్"
          ]
        }
      },
      "SPEAKER_00_0026_383.26-390.66.flac": {
        "transcription": "కనెక్షన్ ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా కనెక్టెడ్ క్వశ్చన్స్ ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక పార్లేజీ గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు పాడ్కాస్ట్ చూశారు కదా.",
        "code_switch": "connection ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా connected questions ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక Parle-G గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు podcast చూశారు కదా.",
        "romanized": "connection untundannamaata. aa ante deeni gurinchi chaala connected questions unnaayi naaku. deenikante mundu indaaka Parle-G gurinchi teesukochhaaru kaabatti avunu. ippativaraku podcast chooshaaru kada.",
        "tagged": "connection ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా connected questions ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక Parle-G గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు podcast చూశారు కదా.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.0,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.7138,
          "low_conf_words": [
            "ఉంటుందన్నమాట",
            "అంటే",
            "దీని",
            "చాలా",
            "కనెక్టెడ్",
            "క్వశ్చన్స్",
            "ఉన్నాయి",
            "నాకు",
            "దీనికంటే",
            "ముందు",
            "ఇందాక",
            "పార్లేజీ",
            "తీసుకొచ్చారు",
            "కాబట్టి",
            "అవును",
            "ఇప్పటివరకు",
            "పాడ్కాస్ట్",
            "చూశారు",
            "కదా"
          ]
        }
      },
      "SPEAKER_00_0027_394.58-397.79.flac": {
        "transcription": "పాడ్కాస్ట్ చూస్తున్న పది మందిలో ఐదుగురికి మార్కెటర్ అవ్వాలన్న థాట్ వస్తది",
        "code_switch": "Podcast చూస్తున్న పది మందిలో ఐదుగురికి Marketer అవ్వాలన్న Thought వస్తది",
        "romanized": "Podcast chustunna padi mandilo aiduguriki Marketer avvalanna Thought vastadi",
        "tagged": "Podcast చూస్తున్న పది మందిలో ఐదుగురికి Marketer అవ్వాలన్న Thought వస్తది",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.8,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.7259,
          "low_conf_words": [
            "పాడ్కాస్ట్",
            "చూస్తున్న",
            "మందిలో",
            "ఐదుగురికి",
            "అవ్వాలన్న",
            "థాట్",
            "వస్తది"
          ]
        }
      },
      "SPEAKER_00_0031_450.01-460.11.flac": {
        "transcription": "సర్ ఆల్మోస్ట్ ఫిఫ్టీ వన్ ఫిఫ్టీ వన్ పాడ్కాస్ట్ ఫిఫ్టీ పాడ్కాస్ట్స్ అయిపోయినాయి. మనది ఫిఫ్టీ సెకండ్ అప్రాక్సిమేట్లీ. కంగ్రాచులేషన్స్. థాంక్యూ థాంక్యూ. మీ మీ తెలుగు చాలా క్లాసీగా ఉంది సర్.",
        "code_switch": "Sir almost 51 51 podcast 50 podcasts అయిపోయినాయి. మనది 52nd approximately. Congratulations. Thank you thank you. మీ మీ తెలుగు చాలా classy గా ఉంది sir.",
        "romanized": "Sir almost fifty one fifty one podcast fifty podcasts ayipoyinayi. Manadi fifty second approximately. Congratulations. Thank you thank you. Mee mee Telugu chaala classy ga undi sir.",
        "tagged": "Sir almost 51 51 podcast 50 podcasts అయిపోయినాయి. మనది 52nd approximately. Congratulations. Thank you thank you. మీ మీ తెలుగు చాలా classy గా ఉంది sir.",
        "speaker": {
          "emotion": "happy",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.93,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.7218,
          "low_conf_words": [
            "సర్",
            "ఆల్మోస్ట్",
            "ఫిఫ్టీ",
            "ఫిఫ్టీ",
            "పాడ్కాస్ట్స్",
            "అయిపోయినాయి",
            "మనది",
            "ఫిఫ్టీ",
            "సెకండ్",
            "అప్రాక్సిమేట్లీ",
            "కంగ్రాచులేషన్స్",
            "థాంక్యూ",
            "మీ",
            "మీ",
            "తెలుగు",
            "చాలా",
            "ఉంది",
            "సర్"
          ]
        }
      },
      "SPEAKER_00_0037_521.61-528.64.flac": {
        "transcription": "స్మూత్ ఉంది కాకపోతే కొంచెం క్లాసీ వర్డ్స్ వస్తున్నాయి ఎనీవేస్. సో ఇంకో రెండు మూడు ప్రొడక్ట్స్ గురించి కూడా క్వశ్చన్స్ ఉన్నాయి అనుకో.",
        "code_switch": "స్మూత్ ఉంది కాకపోతే కొంచెం classy words వస్తున్నాయి anyways. సో ఇంకో రెండు మూడు products గురించి కూడా questions ఉన్నాయి అనుకో.",
        "romanized": "smooth undi kakapothe konchem classy words vasthunnayi anyways. so inko rendu moodu products gurinchi kooda questions unnayi anuko.",
        "tagged": "స్మూత్ ఉంది కాకపోతే కొంచెం classy words వస్తున్నాయి anyways. సో ఇంకో రెండు మూడు products గురించి కూడా questions ఉన్నాయి అనుకో.",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.23,
        "validation": {
          "status": "review",
          "char_valid": true,
          "alignment_score": 0.6768,
          "low_conf_words": [
            "స్మూత్",
            "కాకపోతే",
            "కొంచెం",
            "క్లాసీ",
            "వర్డ్స్",
            "వస్తున్నాయి",
            "ఎనీవేస్",
            "సో",
            "మూడు",
            "ప్రొడక్ట్స్",
            "గురించి",
            "కూడా",
            "క్వశ్చన్స్",
            "ఉన్నాయి",
            "అనుకో"
          ]
        }
      },
      "SPEAKER_00_0050_627.86-632.46.flac": {
        "transcription": "సో ఈ గ్లూకోజ్ బిస్కెట్ నుంచి గ్లూకో ఏంది గ్లూకో నుంచి జి ఏంది కరెక్ట్ పార్లే జి కరెక్ట్ కరెక్ట్",
        "code_switch": "సో ఈ glucose biscuit నుంచి gluco ఏంది gluco నుంచి G ఏంది correct Parle-G correct correct",
        "romanized": "so ee glucose biscuit nunchi gluco endi gluco nunchi G endi correct Parle-G correct correct",
        "tagged": "సో ఈ glucose biscuit నుంచి gluco ఏంది gluco నుంచి G ఏంది correct Parle-G correct correct",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 2.94,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.7822,
          "low_conf_words": [
            "ఈ",
            "గ్లూకోజ్",
            "బిస్కెట్",
            "నుంచి",
            "నుంచి",
            "జి",
            "ఏంది",
            "కరెక్ట్",
            "పార్లే",
            "జి",
            "కరెక్ట్"
          ]
        }
      },
      "SPEAKER_00_0058_728.26-741.21.flac": {
        "transcription": "ఫోర్ ఫిఫ్టీ ఫైవ్ హండ్రెడ్ వరకు ఉన్నాయండి. ఓకే అందులో ఒక ఎస్ కే యు గురించి హా ఐ హర్డ్ ఇట్ కరెక్ట్ మీ ఇఫ్ ఐ యామ్ రాంగ్ రోలా కోలా అనే ఒక ప్రొడక్ట్ దాన్ని డిస్కేల్ చేద్దామని ఆపేసి తర్వాత ఎవరో ట్విట్టర్ లో ట్వీట్ చేస్తే",
        "code_switch": "450 500 వరకు ఉన్నాయండి. ఓకే అందులో ఒక SKU గురించి హా I heard it correct me if I am wrong Rola Cola అనే ఒక product దాన్ని descale చేద్దామని ఆపేసి తర్వాత ఎవరో Twitter లో tweet చేస్తే",
        "romanized": "four fifty five hundred varaku unnayandi. okay andulo oka SKU gurinchi ha I heard it correct me if I am wrong Rola Cola ane oka product danni descale cheddamani apesi tarvata evaro Twitter lo tweet cheste",
        "tagged": "450 500 వరకు ఉన్నాయండి. ఓకే అందులో ఒక SKU గురించి హా I heard it correct me if I am wrong Rola Cola అనే ఒక product దాన్ని descale చేద్దామని ఆపేసి తర్వాత ఎవరో Twitter లో tweet చేస్తే",
        "speaker": {
          "emotion": "neutral",
          "speaking_style": "conversational",
          "pace": "normal",
          "accent": ""
        },
        "processing_time": 3.06,
        "validation": {
          "status": "accept",
          "char_valid": true,
          "alignment_score": 0.8389,
          "low_conf_words": [
            "ఫోర్",
            "ఫిఫ్టీ",
            "ఫైవ్",
            "హండ్రెడ్",
            "వరకు",
            "ఉన్నాయండి",
            "ఓకే",
            "అందులో",
            "ఎస్",
            "గురించి",
            "హా",
            "ఇట్",
            "కరెక్ట్",
            "ఇఫ్",
            "ఐ",
            "యామ్",
            "రాంగ్",
            "రోలా",
            "కోలా",
            "అనే",
            "డిస్కేల్",
            "తర్వాత",
            "ట్వీట్"
          ]
        }
      }
    }
  ]
}


Output:
Exit code: 0
Wall time: 0 seconds
Output:
{
  "SPEAKER_00_0000_0.03-2.61.flac": {
    "romanized_text": "vastundannamaata. naaku konni ads gurtuntaayi like example kachcha mango bite.",
    "mms_score": 0.6177,
    "mms_log_prob": -1.9116,
    "native_ctc_score": 0.7173,
    "native_status": "review"
  },
  "SPEAKER_00_0001_3.05-13.40.flac": {
    "romanized_text": "aa maa chemmangilo oka retired taatamma okadunnaadu I will not name him but mari entante mangoes teesukuni xerox shop ki vellaadannamaata in fact naaku photocopy ante veru xerox ante veru ani telisindi akkade avunu",
    "mms_score": 0.7987,
    "mms_log_prob": -1.0066,
    "native_ctc_score": 0.7026,
    "native_status": "review"
  },
  "SPEAKER_00_0003_29.78-34.93.flac": {
    "romanized_text": "asalu aa in fact like I got to know that you were behind the Kaccha Mangoes",
    "mms_score": 0.9046,
    "mms_log_prob": -0.477,
    "native_ctc_score": 0.8158,
    "native_status": "accept"
  },
  "SPEAKER_00_0004_36.29-37.41.flac": {
    "romanized_text": "talk about that story as well.",
    "mms_score": 0.7689,
    "mms_log_prob": -1.1556,
    "native_ctc_score": 0.4755,
    "native_status": "reject"
  },
  "SPEAKER_00_0026_383.26-390.66.flac": {
    "romanized_text": "connection untundannamaata. aa ante deeni gurinchi chaala connected questions unnaayi naaku. deenikante mundu indaaka Parle-G gurinchi teesukochhaaru kaabatti avunu. ippativaraku podcast chooshaaru kada.",
    "mms_score": 0.747,
    "mms_log_prob": -1.2649,
    "native_ctc_score": 0.7138,
    "native_status": "review"
  },
  "SPEAKER_00_0027_394.58-397.79.flac": {
    "romanized_text": "Podcast chustunna padi mandilo aiduguriki Marketer avvalanna Thought vastadi",
    "mms_score": 0.8147,
    "mms_log_prob": -0.9266,
    "native_ctc_score": 0.7259,
    "native_status": "accept"
  },
  "SPEAKER_00_0031_450.01-460.11.flac": {
    "romanized_text": "Sir almost fifty one fifty one podcast fifty podcasts ayipoyinayi. Manadi fifty second approximately. Congratulations. Thank you thank you. Mee mee Telugu chaala classy ga undi sir.",
    "mms_score": 0.8361,
    "mms_log_prob": -0.8194,
    "native_ctc_score": 0.7218,
    "native_status": "accept"
  },
  "SPEAKER_00_0037_521.61-528.64.flac": {
    "romanized_text": "smooth undi kakapothe konchem classy words vasthunnayi anyways. so inko rendu moodu products gurinchi kooda questions unnayi anuko.",
    "mms_score": 0.7957,
    "mms_log_prob": -1.0216,
    "native_ctc_score": 0.6768,
    "native_status": "review"
  },
  "SPEAKER_00_0050_627.86-632.46.flac": {
    "romanized_text": "so ee glucose biscuit nunchi gluco endi gluco nunchi G endi correct Parle-G correct correct",
    "mms_score": 0.8312,
    "mms_log_prob": -0.844,
    "native_ctc_score": 0.7822,
    "native_status": "accept"
  },
  "SPEAKER_00_0058_728.26-741.21.flac": {
    "romanized_text": "four fifty five hundred varaku unnayandi. okay andulo oka SKU gurinchi ha I heard it correct me if I am wrong Rola Cola ane oka product danni descale cheddamani apesi tarvata evaro Twitter lo tweet cheste",
    "mms_score": 0.8654,
    "mms_log_prob": -0.6731,
    "native_ctc_score": 0.8389,
    "native_status": "accept"
  }
}


Output:
Exit code: 0
Wall time: 0 seconds
Output:
{
  "SPEAKER_00_0000_0.03-2.61.flac": {
    "transcription": "వస్తుందన్నమాట. నాకు కొన్ని యాడ్స్ గుర్తుంటాయి లైక్ ఎగ్జాంపుల్ కచ్చా మ్యాంగో బైట్.",
    "code_switch": "వస్తుందన్నమాట. నాకు కొన్ని ads గుర్తుంటాయి like example కచ్చా మ్యాంగో బైట్.",
    "romanized": "vastundannamaata. naaku konni ads gurtuntaayi like example kachcha mango bite.",
    "tagged": "వస్తుందన్నమాట. నాకు కొన్ని ads గుర్తుంటాయి like example కచ్చా మ్యాంగో బైట్.",
    "speaker": {
      "emotion": "neutral",
      "speaking_style": "conversational",
      "pace": "normal",
      "accent": ""
    },
    "processing_time": 3.18,
    "validation": {
      "status": "review",
      "char_valid": true,
      "alignment_score": 0.7173,
      "low_conf_words": [
        "వస్తుందన్నమాట",
        "నాకు",
        "కొన్ని",
        "యాడ్స్",
        "గుర్తుంటాయి",
        "లైక్",
        "ఎగ్జాంపుల్",
        "మ్యాంగో",
        "బైట్"
      ]
    }
  },
  "SPEAKER_00_0001_3.05-13.40.flac": {
    "transcription": "ఆ మా చెమ్మంగిలో ఒక రిటైర్డ్ తాతమ్మ ఒకడున్నాడు ఐ విల్ నాట్ నేమ్ హిమ్ బట్ మరి ఏంటంటే మ్యాంగోస్ తీసుకుని జిరాక్స్ షాప్ కి వెళ్ళాడన్నమాట ఇన్ ఫ్యాక్ట్ నాకు ఫోటో కాపీ అంటే వేరు జిరాక్స్ అంటే వేరు అని తెలిసింది అక్కడే అవును",
    "code_switch": "ఆ మా చెమ్మంగిలో ఒక retired తాతమ్మ ఒకడున్నాడు I will not name him but మరి ఏంటంటే mangoes తీసుకుని xerox shop కి వెళ్ళాడన్నమాట in fact నాకు photocopy అంటే వేరు xerox అంటే వేరు అని తెలిసింది అక్కడే అవును",
    "romanized": "aa maa chemmangilo oka retired taatamma okadunnaadu I will not name him but mari entante mangoes teesukuni xerox shop ki vellaadannamaata in fact naaku photocopy ante veru xerox ante veru ani telisindi akkade avunu",
    "tagged": "ఆ మా చెమ్మంగిలో ఒక retired తాతమ్మ ఒకడున్నాడు I will not name him but మరి ఏంటంటే mangoes తీసుకుని xerox shop కి వెళ్ళాడన్నమాట in fact నాకు photocopy అంటే వేరు xerox అంటే వేరు అని తెలిసింది అక్కడే అవును",
    "speaker": {
      "emotion": "happy",
      "speaking_style": "conversational",
      "pace": "normal",
      "accent": ""
    },
    "processing_time": 4.06,
    "validation": {
      "status": "review",
      "char_valid": true,
      "alignment_score": 0.7026,
      "low_conf_words": [
        "మా",
        "చెమ్మంగిలో",
        "ఒక",
        "రిటైర్డ్",
        "తాతమ్మ",
        "ఒకడున్నాడు",
        "విల్",
        "నాట్",
        "నేమ్",
        "హిమ్",
        "బట్",
        "మరి",
        "ఏంటంటే",
        "మ్యాంగోస్",
        "తీసుకుని",
        "జిరాక్స్",
        "షాప్",
        "కి",
        "వెళ్ళాడన్నమాట",
        "ఇన్",
        "ఫ్యాక్ట్",
        "నాకు",
        "ఫోటో",
        "అంటే",
        "వేరు",
        "వేరు",
        "తెలిసింది",
        "అక్కడే",
        "అవును"
      ]
    }
  },
  "SPEAKER_00_0003_29.78-34.93.flac": {
    "transcription": "అసలు ఆ ఇన్ ఫ్యాక్ట్ లైక్ ఐ గాట్ టు నో దట్ యు వర్ బిహైండ్ ది కచ్చా మ్యాంగోస్",
    "code_switch": "అసలు ఆ in fact like I got to know that you were behind the Kaccha Mangoes",
    "romanized": "asalu aa in fact like I got to know that you were behind the Kaccha Mangoes",
    "tagged": "అసలు ఆ [breath] in fact like I got to know that you were behind the Kaccha Mangoes",
    "speaker": {
      "emotion": "neutral",
      "speaking_style": "conversational",
      "pace": "normal",
      "accent": ""
    },
    "processing_time": 2.81,
    "validation": {
      "status": "accept",
      "char_valid": true,
      "alignment_score": 0.8158,
      "low_conf_words": [
        "ఫ్యాక్ట్",
        "లైక్",
        "గాట్",
        "టు",
        "నో",
        "యు",
        "వర్",
        "బిహైండ్",
        "మ్యాంగోస్"
      ]
    }
  },
  "SPEAKER_00_0004_36.29-37.41.flac": {
    "transcription": "టాక్ అబౌట్ దట్ స్టోరీ యాజ్ వెల్.",
    "code_switch": "talk about that story as well.",
    "romanized": "talk about that story as well.",
    "tagged": "talk about that story as well.",
    "speaker": {
      "emotion": "neutral",
      "speaking_style": "conversational",
      "pace": "normal",
      "accent": ""
    },
    "processing_time": 2.43,
    "validation": {
      "status": "reject",
      "char_valid": true,
      "alignment_score": 0.4755,
      "low_conf_words": [
        "టాక్",
        "అబౌట్",
        "దట్",
        "స్టోరీ",
        "యాజ్",
        "వెల్"
      ]
    }
  },
  "SPEAKER_00_0026_383.26-390.66.flac": {
    "transcription": "కనెక్షన్ ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా కనెక్టెడ్ క్వశ్చన్స్ ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక పార్లేజీ గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు పాడ్కాస్ట్ చూశారు కదా.",
    "code_switch": "connection ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా connected questions ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక Parle-G గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు podcast చూశారు కదా.",
    "romanized": "connection untundannamaata. aa ante deeni gurinchi chaala connected questions unnaayi naaku. deenikante mundu indaaka Parle-G gurinchi teesukochhaaru kaabatti avunu. ippativaraku podcast chooshaaru kada.",
    "tagged": "connection ఉంటుందన్నమాట. ఆ అంటే దీని గురించి చాలా connected questions ఉన్నాయి నాకు. దీనికంటే ముందు ఇందాక Parle-G గురించి తీసుకొచ్చారు కాబట్టి అవును. ఇప్పటివరకు podcast చూశారు కదా.",
    "speaker": {
      "emotion": "neutral",
      "speaking_style": "conversational",
      "pace": "normal",
      "accent": ""
    },
    "processing_time": 3.73,
    "validation": {
      "status": "review",
      "char_valid": true,
      "alignment_score": 0.7138,
      "low_conf_words": [
        "ఉంటుందన్నమాట",
        "అంటే",
        "దీని",
        "చాలా",
        "కనెక్టెడ్",
        "క్వశ్చన్స్",
        "ఉన్నాయి",
        "నాకు",
        "దీనికంటే",
        "ముందు",
        "ఇందాక",
        "పార్లేజీ",
        "తీసుకొచ్చారు",
        "కాబట్టి",
        "అవును",
        "ఇప్పటివరకు",
        "పాడ్కాస్ట్",
        "చూశారు",
        "కదా"
      ]
    }
  },
  "SPEAKER_00_0027_394.58-397.79.flac": {
    "transcription": "పాడ్కాస్ట్ చూస్తున్న పది మందిలో ఐదుగురికి మార్కెటర్ అవ్వాలన్న థాట్ వస్తది",
    "code_switch": "Podcast చూస్తున్న పది మందిలో ఐదుగురికి Marketer అవ్వాలన్న Thought వస్తది",
    "romanized": "Podcast chustunna padi mandilo aiduguriki Marketer avvalanna Thought vastadi",
    "tagged": "Podcast చూస్తున్న పది మందిలో ఐదుగురికి Marketer అవ్వాలన్న Thought వస్తది",
    "speaker": {
      "emotion": "neutral",
      "speaking_style": "conversational",
      "pace": "normal",
      "accent": ""
    },
    "processing_time": 3.09,
    "validation": {
      "status": "accept",
      "char_valid": true,
      "alignment_score": 0.7259,
      "low_conf_words": [
        "పాడ్కాస్ట్",
        "చూస్తున్న",
        "మందిలో",
        "ఐదుగురికి",
        "అవ్వాలన్న",
        "థాట్",
        "వస్తది"
      ]
    }
  },


**Evaluating validator consistency and scoring**


I also checked your prior consistency run artifacts. They show good determinism on a 10-segment sample, but they used an older validator path and don’t replace a ground-truth quality benchmark. I’ll now compute a concise readiness rating and a concrete scoring policy recommendation (`AND`/`avg`/weighted) for your 70% retry design.


venv/bin/python - <<'PY'
import json
from collections import Counter

with open('consistency_test/comparison.json', encoding='utf-8') as f:
    d=json.load(f)

# run1 style counts
run0=d['runs'][0]
statuses=Counter()
scores=[]
for seg,res in run0.items():
    v=res.get('validation',{})
    if 'status' in v:
        statuses[v['status']]+=1
    if 'alignment_score' in v:
        scores.append(v['alignment_score'])

print('run0_count', len(run0))
print('statuses', dict(statuses))
if scores:
    print('mean_alignment', round(sum(scores)/len(scores),4))
    print('min_alignment', round(min(scores),4))
    print('max_alignment', round(max(scores),4))
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:
run0_count 10
statuses {'review': 4, 'accept': 5, 'reject': 1}
mean_alignment 0.7171
min_alignment 0.4755
max_alignment 0.8389


**Identifying retry logic and threshold mismatches**


Output:
Exit code: 0
Wall time: 0 seconds
Output:
"""
Configuration module for the transcription pipeline.
Loads environment variables and defines available models and settings.
"""
import os
from pathlib import Path
from dotenv import load_dotenv

# Load .env from project root
_project_root = Path(__file__).parent.parent.parent
load_dotenv(_project_root / ".env")

# === R2 Cloud Storage Config ===
R2_ENDPOINT_URL = os.getenv("R2_ENDPOINT_URL")
R2_BUCKET = os.getenv("R2_BUCKET")
R2_ACCESS_KEY_ID = os.getenv("R2_ACCESS_KEY_ID")
R2_SECRET_ACCESS_KEY = os.getenv("R2_SECRET_ACCESS_KEY")

# === Gemini API Config ===
GEMINI_API_KEY = os.getenv("GEMINI_KEY")

# === Supabase Config ===
SUPABASE_URL = os.getenv("URL")
SUPABASE_ANON_KEY = os.getenv("SUPABASE_ANON")
SUPABASE_ADMIN_KEY = os.getenv("SUPABASE_ADMIN")

# === Available Gemini Models ===
# Models supporting audio transcription
GEMINI_MODELS = {
    "gemini-3-pro-preview": {
        "name": "gemini-3-pro-preview",
        "thinking_levels": ["low", "high"],
        "supports_thinking": True,
        "cost_tier": "premium"
    },
    "gemini-3-flash-preview": {
        "name": "gemini-3-flash-preview",
        "thinking_levels": ["minimal", "low", "medium", "high"],
        "supports_thinking": True,
        "cost_tier": "standard"
    },
    "gemini-2.5-pro": {
        "name": "gemini-2.5-pro",
        "thinking_levels": None,
        "supports_thinking": True,
        "cost_tier": "premium"
    },
    "gemini-2.5-flash": {
        "name": "gemini-2.5-flash",
        "thinking_levels": None,
        "supports_thinking": True,
        "cost_tier": "standard"
    },
    "gemini-2.5-flash-lite": {
        "name": "gemini-2.5-flash-lite",
        "thinking_levels": None,
        "supports_thinking": True,
        "cost_tier": "lite"
    },
    "gemini-2.0-flash": {
        "name": "gemini-2.0-flash",
        "thinking_levels": None,
        "supports_thinking": False,
        "cost_tier": "standard"
    }
}

# Alias mapping for easier usage
MODEL_ALIASES = {
    "gemini-flash-latest": "gemini-3-flash-preview",
    "gemini-flash-lite-latest": "gemini-2.5-flash-lite",
}

# === Default Pipeline Settings ===
DEFAULT_SETTINGS = {
    "max_segment_duration_sec": 10.0,  # Hard limit for segment duration
    "min_segment_duration_sec": 1.0,   # Minimum segment duration
    "default_model": "gemini-3-flash-preview",
    "default_thinking_level": "high",
    "work_dir": "/tmp/maya3_transcribe",
    "output_dir": "./transcriptions"
}

# === Language Mapping (for Supabase language codes) ===
LANGUAGE_MAP = {
    "te": "Telugu",
    "hi": "Hindi",
    "ta": "Tamil",
    "kn": "Kannada",
    "ml": "Malayalam",
    "bn": "Bengali",
    "gu": "Gujarati",
    "mr": "Marathi",
    "pa": "Punjabi",
    "or": "Odia",
    "en": "English",
    "Telugu": "Telugu",
    "Hindi": "Hindi",
}

def get_model_name(model_key: str) -> str:
    """Resolve model alias to actual model name."""
    if model_key in MODEL_ALIASES:
        return MODEL_ALIASES[model_key]
    if model_key in GEMINI_MODELS:
        return model_key
    raise ValueError(f"Unknown model: {model_key}. Available: {list(GEMINI_MODELS.keys()) + list(MODEL_ALIASES.keys())}")


**Identifying env key mismatch and validation gaps**


venv/bin/python - <<'PY'
import json, os
from src.validators import validate_transcription, cleanup

input_file='transcriptions/test_new_schema_20seg.json'
base_audio='/tmp/maya3_transcribe/pF_BQpHaIdU/extracted/pF_BQpHaIdU/segments'
with open(input_file, encoding='utf-8') as f:
    data=json.load(f)
Rs=[]
Ns=[]
for r in data['results']:
    ap=os.path.join(base_audio, r['segment_id'])
    if not os.path.exists(ap):
        continue
    v=validate_transcription(ap, r['transcription']['transcription'], romanized_text=r['transcription'].get('romanized',''), language='te')
    Rs.append(v.roman_mms_score)
    Ns.append(v.native_ctc_score)
cleanup()

print('count',len(Rs))
for t in [0.7,0.75,0.8,0.85,0.9]:
    c=sum(1 for x in Rs if x>=t)
    print(f'R>={t}: {c}/{len(Rs)} ({c/len(Rs):.1%})')
print('R_zero',sum(1 for x in Rs if x==0))
print('N_nonzero',sum(1 for x in Ns if x>0))
PY