Output:
Exit code: 0
Wall time: 2121.7 seconds
Output:

  0%|          | 0.00/29.1G [00:00<?, ?B/s]
  0%|          | 88.0k/29.1G [00:00<9:41:33, 895kB/s]
  0%|          | 576k/29.1G [00:00<2:37:45, 3.30MB/s]
  0%|          | 1.45M/29.1G [00:00<1:27:40, 5.94MB/s]
  0%|          | 4.38M/29.1G [00:00<35:14, 14.8MB/s]
  0%|          | 10.3M/29.1G [00:00<19:53, 26.2MB/s]
  0%|          | 14.8M/29.1G [00:00<16:58, 30.6MB/s]
  0%|          | 20.9M/29.1G [00:00<13:25, 38.7MB/s]
  0%|          | 26.8M/29.1G [00:00<12:04, 43.1MB/s]
  0%|          | 35.0M/29.1G [00:01<09:27, 54.9MB/s]
  0%|          | 40.4M/29.1G [00:01<09:33, 54.3MB/s]
  0%|          | 45.6M/29.1G [00:01<09:46, 53.2MB/s]
  0%|          | 54.1M/29.1G [00:01<09:02, 57.4MB/s]
  0%|          | 62.2M/29.1G [00:01<08:01, 64.7MB/s]
  0%|          | 68.6M/29.1G [00:01<07:56, 65.4MB/s]
  0%|          | 75.9M/29.1G [00:01<07:53, 65.7MB/s]
  0%|          | 83.9M/29.1G [00:02<12:02, 43.1MB/s]
  0%|          | 94.5M/29.1G [00:02<09:13, 56.3MB/s]
  0%|          | 106M/29.1G [00:02<07:16, 71.3MB/s]
  0%|          | 115M/29.1G [00:02<10:32, 49.2MB/s]
  0%|          | 121M/29.1G [00:02<10:54, 47.5MB/s]
  0%|          | 127M/29.1G [00:02<10:46, 48.1MB/s]
  0%|          | 134M/29.1G [00:02<09:56, 52.1MB/s]
  0%|          | 141M/29.1G [00:03<08:54, 58.1MB/s]
  1%|          | 149M/29.1G [00:03<07:57, 65.0MB/s]
  1%|          | 156M/29.1G [00:03<09:15, 55.9MB/s]
  1%|          | 162M/29.1G [00:03<09:46, 52.9MB/s]
  1%|          | 168M/29.1G [00:03<09:42, 53.3MB/s]
  1%|          | 177M/29.1G [00:03<08:08, 63.6MB/s]
  1%|          | 184M/29.1G [00:03<09:15, 55.8MB/s]
  1%|          | 192M/29.1G [00:03<08:26, 61.3MB/s]
  1%|          | 198M/29.1G [00:04<08:16, 62.4MB/s]
  1%|          | 204M/29.1G [00:04<08:25, 61.3MB/s]
  1%|          | 211M/29.1G [00:04<08:30, 60.7MB/s]
  1%|          | 217M/29.1G [00:04<09:03, 57.1MB/s]
  1%|          | 222M/29.1G [00:04<09:59, 51.7MB/s]
  1%|          | 228M/29.1G [00:04<09:22, 55.1MB/s]
  1%|          | 234M/29.1G [00:04<11:39, 44.3MB/s]
  1%|          | 238M/29.1G [00:04<12:14, 42.1MB/s]
  1%|          | 244M/29.1G [00:05<11:48, 43.7MB/s]
  1%|          | 250M/29.1G [00:05<10:47, 47.8MB/s]
  1%|          | 255M/29.1G [00:05<11:39, 44.3MB/s]
  1%|          | 260M/29.1G [00:05<11:10, 46.1MB/s]
  1%|          | 269M/29.1G [00:05<09:09, 56.3MB/s]
  1%|          | 274M/29.1G [00:05<09:08, 56.4MB/s]
  1%|          | 283M/29.1G [00:05<07:43, 66.7MB/s]
  1%|          | 294M/29.1G [00:05<06:28, 79.6MB/s]
  1%|          | 302M/29.1G [00:05<06:52, 74.9MB/s]
  1%|          | 309M/29.1G [00:06<09:01, 57.1MB/s]
  1%|          | 315M/29.1G [00:06<12:28, 41.3MB/s]
  1%|          | 320M/29.1G [00:06<12:56, 39.8MB/s]
  1%|          | 325M/29.1G [00:06<12:37, 40.7MB/s]
  1%|          | 333M/29.1G [00:06<10:21, 49.7MB/s]
  1%|          | 341M/29.1G [00:06<08:51, 58.1MB/s]
  1%|          | 347M/29.1G [00:07<08:25, 61.1MB/s]
  1%|          | 355M/29.1G [00:07<07:58, 64.4MB/s]
  1%|          | 361M/29.1G [00:07<08:19, 61.8MB/s]
  1%|          | 368M/29.1G [00:07<08:56, 57.5MB/s]
  1%|▏         | 376M/29.1G [00:07<08:20, 61.6MB/s]
  1%|▏         | 383M/29.1G [00:07<07:49, 65.6MB/s]
  1%|▏         | 390M/29.1G [00:07<08:02, 63.9MB/s]
  1%|▏         | 398M/29.1G [00:07<07:37, 67.3MB/s]
  1%|▏         | 405M/29.1G [00:07<08:59, 57.1MB/s]
  1%|▏         | 410M/29.1G [00:08<09:56, 51.6MB/s]
  1%|▏         | 416M/29.1G [00:08<11:17, 45.5MB/s]
  1%|▏         | 420M/29.1G [00:08<13:54, 36.9MB/s]
  1%|▏         | 424M/29.1G [00:08<13:45, 37.3MB/s]
  1%|▏         | 428M/29.1G [00:08<14:59, 34.2MB/s]
  1%|▏         | 432M/29.1G [00:08<13:59, 36.6MB/s]
  1%|▏         | 436M/29.1G [00:09<15:06, 33.9MB/s]
  1%|▏         | 439M/29.1G [00:09<14:56, 34.3MB/s]
  1%|▏         | 443M/29.1G [00:09<16:08, 31.7MB/s]
  1%|▏         | 446M/29.1G [00:09<16:19, 31.4MB/s]
  2%|▏         | 450M/29.1G [00:09<15:02, 34.1MB/s]
  2%|▏         | 454M/29.1G [00:09<14:45, 34.7MB/s]
  2%|▏         | 458M/29.1G [00:09<13:26, 38.1MB/s]
  2%|▏         | 462M/29.1G [00:09<14:47, 34.6MB/s]
  2%|▏         | 466M/29.1G [00:09<14:22, 35.6MB/s]
  2%|▏         | 471M/29.1G [00:10<15:38, 32.7MB/s]
  2%|▏         | 475M/29.1G [00:10<15:28, 33.1MB/s]
  2%|▏         | 479M/29.1G [00:10<13:54, 36.8MB/s]
  2%|▏         | 483M/29.1G [00:10<21:19, 24.0MB/s]
  2%|▏         | 487M/29.1G [00:10<18:51, 27.1MB/s]
  2%|▏         | 490M/29.1G [00:10<18:54, 27.1MB/s]
  2%|▏         | 495M/29.1G [00:10<16:37, 30.8MB/s]
  2%|▏         | 500M/29.1G [00:11<13:57, 36.7MB/s]
  2%|▏         | 504M/29.1G [00:11<14:47, 34.6MB/s]
  2%|▏         | 508M/29.1G [00:11<13:50, 36.9MB/s]
  2%|▏         | 513M/29.1G [00:11<12:56, 39.5MB/s]
  2%|▏         | 520M/29.1G [00:11<10:26, 49.0MB/s]
  2%|▏         | 525M/29.1G [00:11<10:15, 49.8MB/s]
  2%|▏         | 530M/29.1G [00:11<11:17, 45.3MB/s]
  2%|▏         | 537M/29.1G [00:11<10:05, 50.6MB/s]
  2%|▏         | 542M/29.1G [00:11<09:41, 52.7MB/s]
  2%|▏         | 550M/29.1G [00:12<08:18, 61.5MB/s]
  2%|▏         | 559M/29.1G [00:12<07:10, 71.2MB/s]
  2%|▏         | 566M/29.1G [00:12<07:56, 64.2MB/s]
  2%|▏         | 573M/29.1G [00:12<07:56, 64.3MB/s]
  2%|▏         | 579M/29.1G [00:12<07:53, 64.7MB/s]
  2%|▏         | 585M/29.1G [00:12<08:13, 62.0MB/s]
  2%|▏         | 592M/29.1G [00:12<08:22, 60.9MB/s]
  2%|▏         | 598M/29.1G [00:12<08:19, 61.2MB/s]
  2%|▏         | 607M/29.1G [00:12<07:13, 70.6MB/s]
  2%|▏         | 614M/29.1G [00:13<08:04, 63.1MB/s]
  2%|▏         | 622M/29.1G [00:13<07:20, 69.3MB/s]
  2%|▏         | 629M/29.1G [00:13<09:01, 56.4MB/s]
  2%|▏         | 638M/29.1G [00:13<07:52, 64.7MB/s]
  2%|▏         | 645M/29.1G [00:13<08:38, 58.9MB/s]
  2%|▏         | 651M/29.1G [00:13<08:49, 57.7MB/s]
  2%|▏         | 656M/29.1G [00:13<08:56, 56.9MB/s]
  2%|▏         | 664M/29.1G [00:13<08:46, 58.0MB/s]
  2%|▏         | 674M/29.1G [00:14<07:16, 69.9MB/s]
  2%|▏         | 681M/29.1G [00:14<07:03, 72.1MB/s]
  2%|▏         | 689M/29.1G [00:14<07:07, 71.3MB/s]
  2%|▏         | 696M/29.1G [00:14<07:18, 69.5MB/s]
  2%|▏         | 703M/29.1G [00:14<07:23, 68.7MB/s]
  2%|▏         | 709M/29.1G [00:14<07:40, 66.2MB/s]
  2%|▏         | 716M/29.1G [00:14<07:53, 64.3MB/s]
  2%|▏         | 724M/29.1G [00:14<07:49, 64.9MB/s]
  2%|▏         | 734M/29.1G [00:14<06:47, 74.7MB/s]
  2%|▏         | 743M/29.1G [00:15<06:15, 81.0MB/s]
  3%|▎         | 751M/29.1G [00:15<06:32, 77.5MB/s]
  3%|▎         | 761M/29.1G [00:15<06:02, 84.0MB/s]
  3%|▎         | 769M/29.1G [00:15<07:13, 70.2MB/s]
  3%|▎         | 776M/29.1G [00:15<07:44, 65.4MB/s]
  3%|▎         | 782M/29.1G [00:15<07:41, 65.9MB/s]
  3%|▎         | 791M/29.1G [00:15<07:01, 72.2MB/s]
  3%|▎         | 803M/29.1G [00:15<05:46, 87.8MB/s]
  3%|▎         | 816M/29.1G [00:16<05:03, 100MB/s]
  3%|▎         | 826M/29.1G [00:16<05:46, 87.7MB/s]
  3%|▎         | 835M/29.1G [00:16<06:29, 77.8MB/s]
  3%|▎         | 843M/29.1G [00:16<06:29, 78.0MB/s]
  3%|▎         | 851M/29.1G [00:16<06:31, 77.4MB/s]
  3%|▎         | 863M/29.1G [00:16<05:42, 88.6MB/s]
  3%|▎         | 872M/29.1G [00:16<05:45, 87.8MB/s]
  3%|▎         | 883M/29.1G [00:16<05:12, 97.0MB/s]
  3%|▎         | 893M/29.1G [00:16<05:26, 92.8MB/s]
  3%|▎         | 902M/29.1G [00:17<05:54, 85.5MB/s]
  3%|▎         | 912M/29.1G [00:17<05:36, 89.9MB/s]
  3%|▎         | 920M/29.1G [00:17<05:47, 87.1MB/s]
  3%|▎         | 929M/29.1G [00:17<06:31, 77.2MB/s]
  3%|▎         | 936M/29.1G [00:17<07:08, 70.6MB/s]
  3%|▎         | 943M/29.1G [00:17<07:14, 69.5MB/s]
  3%|▎         | 951M/29.1G [00:17<06:55, 72.8MB/s]
  3%|▎         | 958M/29.1G [00:17<07:43, 65.1MB/s]
  3%|▎         | 965M/29.1G [00:18<07:54, 63.6MB/s]
  3%|▎         | 971M/29.1G [00:18<08:37, 58.3MB/s]
  3%|▎         | 981M/29.1G [00:18<07:23, 68.1MB/s]
  3%|▎         | 989M/29.1G [00:18<06:59, 72.0MB/s]
  3%|▎         | 996M/29.1G [00:18<09:04, 55.4MB/s]
  3%|▎         | 0.98G/29.1G [00:18<09:44, 51.6MB/s]
  3%|▎         | 0.99G/29.1G [00:18<08:50, 56.8MB/s]
  3%|▎         | 0.99G/29.1G [00:19<13:44, 36.6MB/s]
  3%|▎         | 1.00G/29.1G [00:19<13:01, 38.6MB/s]
  3%|▎         | 1.00G/29.1G [00:19<12:42, 39.5MB/s]
  3%|▎         | 1.01G/29.1G [00:19<12:06, 41.5MB/s]
  3%|▎         | 1.01G/29.1G [00:19<10:55, 46.0MB/s]
  4%|▎         | 1.02G/29.1G [00:19<08:59, 55.8MB/s]
  4%|▎         | 1.03G/29.1G [00:19<09:23, 53.4MB/s]
  4%|▎         | 1.03G/29.1G [00:20<09:17, 54.0MB/s]
  4%|▎         | 1.04G/29.1G [00:20<07:44, 64.7MB/s]
  4%|▎         | 1.05G/29.1G [00:20<07:50, 64.0MB/s]
  4%|▎         | 1.06G/29.1G [00:20<07:55, 63.3MB/s]
  4%|▎         | 1.06G/29.1G [00:20<08:09, 61.5MB/s]
  4%|▎         | 1.07G/29.1G [00:20<08:48, 56.9MB/s]
  4%|▎         | 1.07G/29.1G [00:21<15:07, 33.1MB/s]
  4%|▎         | 1.08G/29.1G [00:21<14:19, 35.0MB/s]
  4%|▎         | 1.08G/29.1G [00:21<13:14, 37.8MB/s]
  4%|▎         | 1.09G/29.1G [00:21<11:46, 42.5MB/s]
  4%|▍         | 1.10G/29.1G [00:21<09:20, 53.6MB/s]
  4%|▍         | 1.10G/29.1G [00:21<09:24, 53.2MB/s]
  4%|▍         | 1.11G/29.1G [00:21<08:29, 58.9MB/s]
  4%|▍         | 1.12G/29.1G [00:21<08:00, 62.4MB/s]
  4%|▍         | 1.12G/29.1G [00:21<07:57, 62.8MB/s]
  4%|▍         | 1.13G/29.1G [00:22<06:42, 74.6MB/s]
  4%|▍         | 1.14G/29.1G [00:22<05:56, 84.2MB/s]
  4%|▍         | 1.15G/29.1G [00:22<07:57, 62.8MB/s]
  4%|▍         | 1.16G/29.1G [00:22<07:52, 63.4MB/s]
  4%|▍         | 1.17G/29.1G [00:22<08:04, 61.8MB/s]
  4%|▍         | 1.17G/29.1G [00:22<08:11, 60.9MB/s]
  4%|▍         | 1.18G/29.1G [00:22<07:33, 66.0MB/s]
  4%|▍         | 1.19G/29.1G [00:22<09:44, 51.3MB/s]
  4%|▍         | 1.19G/29.1G [00:23<08:53, 56.2MB/s]
  4%|▍         | 1.20G/29.1G [00:23<08:20, 59.8MB/s]
  4%|▍         | 1.21G/29.1G [00:23<07:40, 65.0MB/s]
  4%|▍         | 1.21G/29.1G [00:23<07:13, 69.0MB/s]
  4%|▍         | 1.22G/29.1G [00:23<07:19, 68.1MB/s]
  4%|▍         | 1.23G/29.1G [00:23<07:38, 65.2MB/s]
  4%|▍         | 1.23G/29.1G [00:23<08:00, 62.2MB/s]
  4%|▍         | 1.24G/29.1G [00:23<07:29, 66.4MB/s]
  4%|▍         | 1.25G/29.1G [00:24<08:17, 60.1MB/s]
  4%|▍         | 1.25G/29.1G [00:24<09:10, 54.3MB/s]
  4%|▍         | 1.26G/29.1G [00:24<09:30, 52.4MB/s]
  4%|▍         | 1.26G/29.1G [00:24<09:46, 50.9MB/s]
  4%|▍         | 1.27G/29.1G [00:24<09:01, 55.2MB/s]
  4%|▍         | 1.28G/29.1G [00:24<08:55, 55.7MB/s]
  4%|▍         | 1.28G/29.1G [00:24<08:59, 55.4MB/s]
  4%|▍         | 1.29G/29.1G [00:24<08:56, 55.7MB/s]
  4%|▍         | 1.29G/29.1G [00:24<08:36, 57.8MB/s]
  4%|▍         | 1.30G/29.1G [00:25<08:12, 60.6MB/s]
  4%|▍         | 1.31G/29.1G [00:25<08:17, 59.9MB/s]
  5%|▍         | 1.31G/29.1G [00:25<08:29, 58.5MB/s]
  5%|▍         | 1.32G/29.1G [00:25<08:13, 60.4MB/s]
  5%|▍         | 1.32G/29.1G [00:25<08:17, 59.9MB/s]
  5%|▍         | 1.33G/29.1G [00:25<06:51, 72.3MB/s]
  5%|▍         | 1.34G/29.1G [00:25<07:11, 69.0MB/s]
  5%|▍         | 1.35G/29.1G [00:25<07:39, 64.8MB/s]
  5%|▍         | 1.35G/29.1G [00:25<07:15, 68.3MB/s]
  5%|▍         | 1.36G/29.1G [00:25<07:33, 65.7MB/s]
  5%|▍         | 1.37G/29.1G [00:26<07:32, 65.8MB/s]
  5%|▍         | 1.37G/29.1G [00:26<07:07, 69.5MB/s]
  5%|▍         | 1.38G/29.1G [00:26<07:24, 67.0MB/s]
  5%|▍         | 1.39G/29.1G [00:26<07:46, 63.8MB/s]
  5%|▍         | 1.39G/29.1G [00:26<08:59, 55.1MB/s]
  5%|▍         | 1.40G/29.1G [00:26<08:49, 56.1MB/s]
  5%|▍         | 1.40G/29.1G [00:26<08:27, 58.6MB/s]
  5%|▍         | 1.41G/29.1G [00:26<08:27, 58.5MB/s]
  5%|▍         | 1.42G/29.1G [00:27<09:02, 54.8MB/s]
  5%|▍         | 1.42G/29.1G [00:27<09:42, 51.0MB/s]
  5%|▍         | 1.43G/29.1G [00:27<08:11, 60.4MB/s]
  5%|▍         | 1.43G/29.1G [00:27<09:39, 51.2MB/s]
  5%|▍         | 1.44G/29.1G [00:27<09:47, 50.5MB/s]
  5%|▍         | 1.45G/29.1G [00:27<09:30, 52.0MB/s]
  5%|▌         | 1.45G/29.1G [00:27<08:23, 58.9MB/s]
  5%|▌         | 1.46G/29.1G [00:27<07:39, 64.6MB/s]
  5%|▌         | 1.47G/29.1G [00:27<07:19, 67.5MB/s]
  5%|▌         | 1.48G/29.1G [00:28<07:27, 66.3MB/s]
  5%|▌         | 1.48G/29.1G [00:28<08:52, 55.7MB/s]
  5%|▌         | 1.49G/29.1G [00:28<08:12, 60.2MB/s]
  5%|▌         | 1.49G/29.1G [00:28<12:13, 40.4MB/s]
  5%|▌         | 1.50G/29.1G [00:28<12:58, 38.0MB/s]
  5%|▌         | 1.51G/29.1G [00:28<10:37, 46.4MB/s]
  5%|▌         | 1.51G/29.1G [00:29<11:11, 44.1MB/s]
  5%|▌         | 1.52G/29.1G [00:29<13:07, 37.6MB/s]
  5%|▌         | 1.52G/29.1G [00:29<12:14, 40.3MB/s]
  5%|▌         | 1.53G/29.1G [00:29<11:26, 43.1MB/s]
  5%|▌         | 1.54G/29.1G [00:29<08:48, 55.9MB/s]
  5%|▌         | 1.54G/29.1G [00:29<08:34, 57.5MB/s]
  5%|▌         | 1.55G/29.1G [00:29<07:50, 62.9MB/s]
  5%|▌         | 1.56G/29.1G [00:29<07:39, 64.3MB/s]
  5%|▌         | 1.56G/29.1G [00:30<08:03, 61.1MB/s]
  5%|▌         | 1.57G/29.1G [00:30<09:38, 51.0MB/s]
  5%|▌         | 1.58G/29.1G [00:30<09:09, 53.7MB/s]
  5%|▌         | 1.58G/29.1G [00:30<11:18, 43.5MB/s]
  5%|▌         | 1.59G/29.1G [00:30<10:13, 48.1MB/s]
  5%|▌         | 1.59G/29.1G [00:30<11:24, 43.1MB/s]
  6%|▌         | 1.60G/29.1G [00:30<11:02, 44.6MB/s]
  6%|▌         | 1.61G/29.1G [00:31<11:55, 41.2MB/s]
  6%|▌         | 1.61G/29.1G [00:31<14:08, 34.7MB/s]
  6%|▌         | 1.62G/29.1G [00:31<08:58, 54.7MB/s]
  6%|▌         | 1.63G/29.1G [00:31<06:53, 71.2MB/s]
  6%|▌         | 1.64G/29.1G [00:31<08:13, 59.7MB/s]
  6%|▌         | 1.65G/29.1G [00:31<08:10, 60.0MB/s]
  6%|▌         | 1.66G/29.1G [00:31<07:42, 63.7MB/s]
  6%|▌         | 1.66G/29.1G [00:32<07:08, 68.7MB/s]
  6%|▌         | 1.67G/29.1G [00:32<07:08, 68.7MB/s]
  6%|▌         | 1.68G/29.1G [00:32<08:45, 56.0MB/s]
  6%|▌         | 1.68G/29.1G [00:32<08:15, 59.4MB/s]
  6%|▌         | 1.69G/29.1G [00:32<10:01, 48.9MB/s]
  6%|▌         | 1.69G/29.1G [00:32<11:15, 43.5MB/s]
  6%|▌         | 1.70G/29.1G [00:32<11:22, 43.1MB/s]
  6%|▌         | 1.71G/29.1G [00:33<09:44, 50.3MB/s]
  6%|▌         | 1.71G/29.1G [00:33<09:41, 50.5MB/s]
  6%|▌         | 1.72G/29.1G [00:33<08:32, 57.3MB/s]
  6%|▌         | 1.73G/29.1G [00:33<08:18, 58.9MB/s]
  6%|▌         | 1.73G/29.1G [00:33<07:44, 63.3MB/s]
  6%|▌         | 1.74G/29.1G [00:33<08:20, 58.7MB/s]
  6%|▌         | 1.74G/29.1G [00:33<11:07, 44.0MB/s]
  6%|▌         | 1.75G/29.1G [00:33<10:37, 46.1MB/s]
  6%|▌         | 1.76G/29.1G [00:34<09:07, 53.6MB/s]
  6%|▌         | 1.76G/29.1G [00:34<09:03, 54.0MB/s]
  6%|▌         | 1.77G/29.1G [00:34<12:06, 40.4MB/s]
  6%|▌         | 1.77G/29.1G [00:34<15:03, 32.4MB/s]
  6%|▌         | 1.78G/29.1G [00:34<16:46, 29.1MB/s]
  6%|▌         | 1.78G/29.1G [00:35<30:04, 16.2MB/s]
  6%|▌         | 1.78G/29.1G [00:35<28:25, 17.2MB/s]
  6%|▌         | 1.78G/29.1G [00:35<26:22, 18.5MB/s]
  6%|▌         | 1.79G/29.1G [00:35<25:30, 19.2MB/s]
  6%|▌         | 1.79G/29.1G [00:35<27:02, 18.1MB/s]
  6%|▌         | 1.79G/29.1G [00:35<23:40, 20.6MB/s]
  6%|▌         | 1.79G/29.1G [00:36<25:32, 19.1MB/s]
  6%|▌         | 1.80G/29.1G [00:36<28:29, 17.1MB/s]
  6%|▌         | 1.80G/29.1G [00:36<29:38, 16.5MB/s]
  6%|▌         | 1.80G/29.1G [00:36<29:44, 16.4MB/s]
  6%|▌         | 1.80G/29.1G [00:36<31:00, 15.7MB/s]
  6%|▌         | 1.80G/29.1G [00:36<34:07, 14.3MB/s]
  6%|▌         | 1.81G/29.1G [00:36<31:00, 15.7MB/s]
  6%|▌         | 1.81G/29.1G [00:37<28:18, 17.2MB/s]
  6%|▌         | 1.81G/29.1G [00:37<30:00, 16.3MB/s]
  6%|▌         | 1.81G/29.1G [00:37<29:05, 16.8MB/s]
  6%|▌         | 1.81G/29.1G [00:37<31:12, 15.6MB/s]
  6%|▌         | 1.81G/29.1G [00:37<32:06, 15.2MB/s]
  6%|▌         | 1.82G/29.1G [00:37<31:46, 15.4MB/s]
  6%|▋         | 1.82G/29.1G [00:37<31:42, 15.4MB/s]
  6%|▋         | 1.82G/29.1G [00:37<31:09, 15.7MB/s]
  6%|▋         | 1.82G/29.1G [00:37<28:21, 17.2MB/s]
  6%|▋         | 1.82G/29.1G [00:38<37:10, 13.1MB/s]
  6%|▋         | 1.83G/29.1G [00:38<30:51, 15.8MB/s]
  6%|▋         | 1.83G/29.1G [00:38<33:22, 14.6MB/s]
  6%|▋         | 1.83G/29.1G [00:38<27:15, 17.9MB/s]
  6%|▋         | 1.83G/29.1G [00:38<27:11, 17.9MB/s]
  6%|▋         | 1.83G/29.1G [00:38<30:23, 16.0MB/s]
  6%|▋         | 1.84G/29.1G [00:38<26:35, 18.3MB/s]
  6%|▋         | 1.84G/29.1G [00:39<27:08, 18.0MB/s]
  6%|▋         | 1.84G/29.1G [00:39<27:07, 18.0MB/s]
  6%|▋         | 1.84G/29.1G [00:39<27:03, 18.0MB/s]
  6%|▋         | 1.84G/29.1G [00:39<23:15, 21.0MB/s]
  6%|▋         | 1.85G/29.1G [00:39<25:41, 19.0MB/s]
  6%|▋         | 1.85G/29.1G [00:39<23:15, 21.0MB/s]
  6%|▋         | 1.85G/29.1G [00:39<25:51, 18.8MB/s]
  6%|▋         | 1.85G/29.1G [00:39<25:50, 18.9MB/s]
  6%|▋         | 1.86G/29.1G [00:39<22:54, 21.3MB/s]
  6%|▋         | 1.86G/29.1G [00:40<24:53, 19.6MB/s]
  6%|▋         | 1.86G/29.1G [00:40<25:17, 19.3MB/s]
  6%|▋         | 1.86G/29.1G [00:40<20:52, 23.3MB/s]
  6%|▋         | 1.87G/29.1G [00:40<24:22, 20.0MB/s]
  6%|▋         | 1.87G/29.1G [00:40<24:12, 20.1MB/s]
  6%|▋         | 1.87G/29.1G [00:40<27:05, 18.0MB/s]
  6%|▋         | 1.87G/29.1G [00:40<23:59, 20.3MB/s]
  6%|▋         | 1.87G/29.1G [00:40<23:36, 20.6MB/s]
  6%|▋         | 1.88G/29.1G [00:41<23:25, 20.8MB/s]
  6%|▋         | 1.88G/29.1G [00:41<20:44, 23.5MB/s]
  6%|▋         | 1.88G/29.1G [00:41<20:47, 23.4MB/s]
  6%|▋         | 1.89G/29.1G [00:41<48:21, 10.1MB/s]
  6%|▋         | 1.89G/29.1G [00:42<43:09, 11.3MB/s]
  6%|▋         | 1.89G/29.1G [00:42<39:51, 12.2MB/s]
  7%|▋         | 1.89G/29.1G [00:42<31:15, 15.6MB/s]
  7%|▋         | 1.89G/29.1G [00:42<31:20, 15.5MB/s]
  7%|▋         | 1.90G/29.1G [00:42<25:48, 18.8MB/s]
  7%|▋         | 1.90G/29.1G [00:42<26:16, 18.5MB/s]
  7%|▋         | 1.90G/29.1G [00:42<22:40, 21.4MB/s]
  7%|▋         | 1.90G/29.1G [00:42<23:20, 20.8MB/s]
  7%|▋         | 1.91G/29.1G [00:43<25:31, 19.1MB/s]
  7%|▋         | 1.91G/29.1G [00:43<22:44, 21.4MB/s]
  7%|▋         | 1.91G/29.1G [00:43<22:09, 21.9MB/s]
  7%|▋         | 1.92G/29.1G [00:43<17:47, 27.3MB/s]
  7%|▋         | 1.92G/29.1G [00:43<19:19, 25.2MB/s]
  7%|▋         | 1.92G/29.1G [00:43<21:35, 22.5MB/s]
  7%|▋         | 1.92G/29.1G [00:43<28:31, 17.0MB/s]
  7%|▋         | 1.93G/29.1G [00:44<26:50, 18.1MB/s]
  7%|▋         | 1.93G/29.1G [00:44<22:43, 21.4MB/s]
  7%|▋         | 1.93G/29.1G [00:44<18:47, 25.9MB/s]
  7%|▋         | 1.94G/29.1G [00:44<16:48, 28.9MB/s]
  7%|▋         | 1.94G/29.1G [00:44<19:08, 25.4MB/s]
  7%|▋         | 1.94G/29.1G [00:44<19:34, 24.8MB/s]
  7%|▋         | 1.94G/29.1G [00:44<21:55, 22.1MB/s]
  7%|▋         | 1.95G/29.1G [00:44<23:29, 20.7MB/s]
  7%|▋         | 1.95G/29.1G [00:45<21:45, 22.3MB/s]
  7%|▋         | 1.95G/29.1G [00:45<23:04, 21.0MB/s]
  7%|▋         | 1.95G/29.1G [00:45<23:45, 20.4MB/s]
  7%|▋         | 1.96G/29.1G [00:45<23:08, 21.0MB/s]
  7%|▋         | 1.96G/29.1G [00:45<24:06, 20.1MB/s]
  7%|▋         | 1.96G/29.1G [00:45<29:05, 16.7MB/s]
  7%|▋         | 1.96G/29.1G [00:45<28:22, 17.1MB/s]
  7%|▋         | 1.96G/29.1G [00:45<26:37, 18.2MB/s]
  7%|▋         | 1.97G/29.1G [00:46<23:33, 20.6MB/s]
  7%|▋         | 1.97G/29.1G [00:46<24:44, 19.6MB/s]
  7%|▋         | 1.97G/29.1G [00:46<24:57, 19.4MB/s]
  7%|▋         | 1.97G/29.1G [00:46<28:59, 16.7MB/s]
  7%|▋         | 1.98G/29.1G [00:46<25:47, 18.8MB/s]
  7%|▋         | 1.98G/29.1G [00:46<25:05, 19.3MB/s]
  7%|▋         | 1.98G/29.1G [00:46<28:02, 17.3MB/s]
  7%|▋         | 1.98G/29.1G [00:46<22:57, 21.1MB/s]
  7%|▋         | 1.99G/29.1G [00:47<23:53, 20.3MB/s]
  7%|▋         | 1.99G/29.1G [00:47<23:11, 20.9MB/s]
  7%|▋         | 1.99G/29.1G [00:47<27:53, 17.4MB/s]
  7%|▋         | 1.99G/29.1G [00:47<21:48, 22.2MB/s]
  7%|▋         | 2.00G/29.1G [00:47<24:44, 19.6MB/s]
  7%|▋ …69486 tokens truncated…G [09:20<00:33, 51.5MB/s]
 94%|█████████▍| 27.5G/29.1G [09:20<00:32, 53.8MB/s]
 94%|█████████▍| 27.5G/29.1G [09:20<00:30, 56.5MB/s]
 94%|█████████▍| 27.5G/29.1G [09:21<00:33, 52.3MB/s]
 94%|█████████▍| 27.5G/29.1G [09:21<00:30, 55.9MB/s]
 95%|█████████▍| 27.5G/29.1G [09:21<00:30, 56.9MB/s]
 95%|█████████▍| 27.5G/29.1G [09:21<00:32, 52.8MB/s]
 95%|█████████▍| 27.5G/29.1G [09:21<00:32, 53.2MB/s]
 95%|█████████▍| 27.5G/29.1G [09:21<00:30, 56.6MB/s]
 95%|█████████▍| 27.5G/29.1G [09:21<00:28, 59.1MB/s]
 95%|█████████▍| 27.5G/29.1G [09:21<00:28, 60.2MB/s]
 95%|█████████▍| 27.5G/29.1G [09:21<00:27, 61.5MB/s]
 95%|█████████▍| 27.5G/29.1G [09:22<00:26, 62.0MB/s]
 95%|█████████▍| 27.5G/29.1G [09:22<00:26, 61.8MB/s]
 95%|█████████▍| 27.5G/29.1G [09:22<00:26, 63.2MB/s]
 95%|█████████▍| 27.5G/29.1G [09:22<00:26, 63.0MB/s]
 95%|█████████▍| 27.5G/29.1G [09:22<00:25, 64.1MB/s]
 95%|█████████▍| 27.5G/29.1G [09:22<00:25, 65.0MB/s]
 95%|█████████▍| 27.6G/29.1G [09:22<00:24, 65.7MB/s]
 95%|█████████▍| 27.6G/29.1G [09:22<00:24, 66.0MB/s]
 95%|█████████▍| 27.6G/29.1G [09:22<00:24, 65.5MB/s]
 95%|█████████▍| 27.6G/29.1G [09:22<00:25, 63.1MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:25, 62.0MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:25, 62.2MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:25, 62.3MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:25, 62.3MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:32, 49.1MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:30, 52.4MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:33, 47.4MB/s]
 95%|█████████▍| 27.6G/29.1G [09:23<00:34, 45.4MB/s]
 95%|█████████▌| 27.6G/29.1G [09:24<00:39, 39.7MB/s]
 95%|█████████▌| 27.6G/29.1G [09:24<00:34, 44.8MB/s]
 95%|█████████▌| 27.6G/29.1G [09:24<00:48, 32.0MB/s]
 95%|█████████▌| 27.6G/29.1G [09:24<00:41, 36.9MB/s]
 95%|█████████▌| 27.6G/29.1G [09:24<00:36, 42.5MB/s]
 95%|█████████▌| 27.6G/29.1G [09:24<00:36, 42.4MB/s]
 95%|█████████▌| 27.7G/29.1G [09:24<00:36, 42.1MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:38, 39.3MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:39, 38.8MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:43, 34.7MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:43, 34.9MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:40, 36.8MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:36, 41.6MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:32, 45.3MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:29, 50.3MB/s]
 95%|█████████▌| 27.7G/29.1G [09:25<00:28, 52.2MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:26, 55.9MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:25, 57.3MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:24, 59.5MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:24, 59.6MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:26, 54.2MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:29, 49.5MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:27, 52.7MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:25, 55.8MB/s]
 95%|█████████▌| 27.7G/29.1G [09:26<00:24, 59.2MB/s]
 95%|█████████▌| 27.8G/29.1G [09:27<00:41, 34.3MB/s]
 95%|█████████▌| 27.8G/29.1G [09:27<00:39, 35.6MB/s]
 95%|█████████▌| 27.8G/29.1G [09:27<00:33, 41.9MB/s]
 96%|█████████▌| 27.8G/29.1G [09:27<00:29, 47.9MB/s]
 96%|█████████▌| 27.8G/29.1G [09:27<00:26, 53.1MB/s]
 96%|█████████▌| 27.8G/29.1G [09:27<00:24, 56.1MB/s]
 96%|█████████▌| 27.8G/29.1G [09:27<00:23, 58.3MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:23, 59.2MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:25, 52.6MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:24, 56.2MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:23, 57.6MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:22, 59.9MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:22, 59.1MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:21, 62.1MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:20, 63.4MB/s]
 96%|█████████▌| 27.8G/29.1G [09:28<00:20, 64.5MB/s]
 96%|█████████▌| 27.9G/29.1G [09:28<00:19, 65.9MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:19, 66.1MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:19, 66.5MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:19, 66.3MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:21, 60.3MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:25, 50.1MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:23, 54.5MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:22, 56.9MB/s]
 96%|█████████▌| 27.9G/29.1G [09:29<00:22, 56.4MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:21, 58.2MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:24, 51.8MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:25, 48.8MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:24, 50.4MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:23, 53.5MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:21, 57.6MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:20, 60.5MB/s]
 96%|█████████▌| 27.9G/29.1G [09:30<00:19, 62.3MB/s]
 96%|█████████▌| 28.0G/29.1G [09:30<00:18, 64.4MB/s]
 96%|█████████▌| 28.0G/29.1G [09:30<00:18, 65.2MB/s]
 96%|█████████▌| 28.0G/29.1G [09:31<00:18, 66.1MB/s]
 96%|█████████▌| 28.0G/29.1G [09:31<00:17, 66.8MB/s]
 96%|█████████▌| 28.0G/29.1G [09:31<00:17, 67.0MB/s]
 96%|█████████▌| 28.0G/29.1G [09:31<00:17, 67.7MB/s]
 96%|█████████▋| 28.0G/29.1G [09:31<00:17, 67.3MB/s]
 96%|█████████▋| 28.0G/29.1G [09:31<00:17, 67.9MB/s]
 96%|█████████▋| 28.0G/29.1G [09:31<00:17, 67.6MB/s]
 96%|█████████▋| 28.0G/29.1G [09:31<00:16, 68.0MB/s]
 96%|█████████▋| 28.0G/29.1G [09:31<00:19, 58.1MB/s]
 96%|█████████▋| 28.0G/29.1G [09:32<00:18, 60.7MB/s]
 96%|█████████▋| 28.0G/29.1G [09:32<00:18, 61.8MB/s]
 96%|█████████▋| 28.0G/29.1G [09:32<00:20, 54.4MB/s]
 96%|█████████▋| 28.0G/29.1G [09:32<00:19, 57.8MB/s]
 96%|█████████▋| 28.0G/29.1G [09:32<00:20, 54.1MB/s]
 96%|█████████▋| 28.1G/29.1G [09:32<00:19, 57.8MB/s]
 97%|█████████▋| 28.1G/29.1G [09:32<00:17, 60.7MB/s]
 97%|█████████▋| 28.1G/29.1G [09:32<00:18, 60.2MB/s]
 97%|█████████▋| 28.1G/29.1G [09:32<00:17, 62.1MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:16, 63.3MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:16, 65.4MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:16, 65.8MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:17, 59.3MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:18, 56.8MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:17, 59.8MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:18, 56.9MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:18, 54.9MB/s]
 97%|█████████▋| 28.1G/29.1G [09:33<00:17, 58.5MB/s]
 97%|█████████▋| 28.1G/29.1G [09:34<00:18, 55.4MB/s]
 97%|█████████▋| 28.1G/29.1G [09:34<00:17, 58.7MB/s]
 97%|█████████▋| 28.1G/29.1G [09:34<00:20, 49.4MB/s]
 97%|█████████▋| 28.1G/29.1G [09:34<00:21, 46.0MB/s]
 97%|█████████▋| 28.2G/29.1G [09:34<00:19, 51.4MB/s]
 97%|█████████▋| 28.2G/29.1G [09:34<00:17, 55.6MB/s]
 97%|█████████▋| 28.2G/29.1G [09:34<00:16, 58.6MB/s]
 97%|█████████▋| 28.2G/29.1G [09:34<00:17, 54.6MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:18, 50.9MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:18, 51.2MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:19, 48.0MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:17, 53.2MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:17, 52.4MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:16, 56.6MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:17, 51.6MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:16, 55.9MB/s]
 97%|█████████▋| 28.2G/29.1G [09:35<00:15, 59.2MB/s]
 97%|█████████▋| 28.2G/29.1G [09:36<00:14, 61.7MB/s]
 97%|█████████▋| 28.2G/29.1G [09:36<00:14, 63.6MB/s]
 97%|█████████▋| 28.2G/29.1G [09:36<00:14, 60.9MB/s]
 97%|█████████▋| 28.3G/29.1G [09:36<00:14, 62.7MB/s]
 97%|█████████▋| 28.3G/29.1G [09:36<00:25, 33.9MB/s]
 97%|█████████▋| 28.3G/29.1G [09:36<00:21, 40.1MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:20, 43.0MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:17, 49.0MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:16, 53.1MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:14, 57.3MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:13, 60.2MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:22, 37.8MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:18, 43.7MB/s]
 97%|█████████▋| 28.3G/29.1G [09:37<00:16, 49.1MB/s]
 97%|█████████▋| 28.3G/29.1G [09:38<00:15, 53.6MB/s]
 97%|█████████▋| 28.3G/29.1G [09:38<00:14, 57.3MB/s]
 97%|█████████▋| 28.3G/29.1G [09:38<00:13, 60.3MB/s]
 97%|█████████▋| 28.3G/29.1G [09:38<00:12, 62.3MB/s]
 97%|█████████▋| 28.3G/29.1G [09:38<00:12, 63.9MB/s]
 98%|█████████▊| 28.4G/29.1G [09:38<00:11, 65.1MB/s]
 98%|█████████▊| 28.4G/29.1G [09:38<00:11, 66.0MB/s]
 98%|█████████▊| 28.4G/29.1G [09:38<00:11, 66.7MB/s]
 98%|█████████▊| 28.4G/29.1G [09:38<00:11, 67.0MB/s]
 98%|█████████▊| 28.4G/29.1G [09:38<00:11, 67.2MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 67.6MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 67.8MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 67.8MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 67.9MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 68.0MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 68.1MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 68.2MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 68.1MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 68.1MB/s]
 98%|█████████▊| 28.4G/29.1G [09:39<00:10, 65.8MB/s]
 98%|█████████▊| 28.4G/29.1G [09:40<00:10, 66.7MB/s]
 98%|█████████▊| 28.5G/29.1G [09:40<00:09, 66.9MB/s]
 98%|█████████▊| 28.5G/29.1G [09:40<00:09, 67.5MB/s]
 98%|█████████▊| 28.5G/29.1G [09:40<00:10, 61.9MB/s]
 98%|█████████▊| 28.5G/29.1G [09:40<00:11, 54.3MB/s]
 98%|█████████▊| 28.5G/29.1G [09:40<00:13, 48.1MB/s]
 98%|█████████▊| 28.5G/29.1G [09:40<00:12, 49.2MB/s]
 98%|█████████▊| 28.5G/29.1G [09:40<00:11, 53.0MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:13, 47.5MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:11, 52.4MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:11, 55.1MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:10, 59.3MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:09, 62.0MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:09, 63.3MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:12, 48.2MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:11, 50.9MB/s]
 98%|█████████▊| 28.5G/29.1G [09:41<00:10, 55.9MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:09, 59.4MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:09, 59.8MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:08, 61.7MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:08, 61.9MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:08, 64.5MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:08, 62.7MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:08, 62.7MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:09, 54.6MB/s]
 98%|█████████▊| 28.6G/29.1G [09:42<00:08, 58.0MB/s]
 98%|█████████▊| 28.6G/29.1G [09:43<00:08, 57.9MB/s]
 98%|█████████▊| 28.6G/29.1G [09:43<00:08, 56.2MB/s]
 98%|█████████▊| 28.6G/29.1G [09:43<00:09, 53.8MB/s]
 98%|█████████▊| 28.6G/29.1G [09:43<00:08, 57.8MB/s]
 98%|█████████▊| 28.6G/29.1G [09:43<00:09, 50.7MB/s]
 98%|█████████▊| 28.6G/29.1G [09:43<00:08, 53.2MB/s]
 99%|█████████▊| 28.6G/29.1G [09:43<00:08, 54.6MB/s]
 99%|█████████▊| 28.6G/29.1G [09:43<00:07, 58.9MB/s]
 99%|█████████▊| 28.7G/29.1G [09:43<00:08, 54.2MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:07, 57.5MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:07, 60.8MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:06, 62.5MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:06, 64.4MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:06, 65.0MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:08, 48.8MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:08, 50.6MB/s]
 99%|█████████▊| 28.7G/29.1G [09:44<00:07, 55.6MB/s]
 99%|█████████▊| 28.7G/29.1G [09:45<00:06, 56.6MB/s]
 99%|█████████▉| 28.7G/29.1G [09:45<00:06, 60.1MB/s]
 99%|█████████▉| 28.7G/29.1G [09:45<00:06, 61.5MB/s]
 99%|█████████▉| 28.7G/29.1G [09:45<00:05, 64.0MB/s]
 99%|█████████▉| 28.7G/29.1G [09:45<00:05, 65.1MB/s]
 99%|█████████▉| 28.7G/29.1G [09:45<00:05, 63.1MB/s]
 99%|█████████▉| 28.7G/29.1G [09:45<00:05, 64.4MB/s]
 99%|█████████▉| 28.8G/29.1G [09:45<00:05, 65.3MB/s]
 99%|█████████▉| 28.8G/29.1G [09:45<00:05, 66.6MB/s]
 99%|█████████▉| 28.8G/29.1G [09:45<00:05, 66.5MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:04, 67.4MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:04, 67.6MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:04, 64.5MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:04, 64.0MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:05, 57.1MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:05, 49.2MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:05, 53.9MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:05, 56.2MB/s]
 99%|█████████▉| 28.8G/29.1G [09:46<00:04, 59.0MB/s]
 99%|█████████▉| 28.8G/29.1G [09:47<00:04, 59.2MB/s]
 99%|█████████▉| 28.8G/29.1G [09:47<00:04, 54.1MB/s]
 99%|█████████▉| 28.8G/29.1G [09:47<00:04, 53.3MB/s]
 99%|█████████▉| 28.8G/29.1G [09:47<00:04, 58.0MB/s]
 99%|█████████▉| 28.8G/29.1G [09:47<00:04, 54.2MB/s]
 99%|█████████▉| 28.9G/29.1G [09:47<00:04, 58.0MB/s]
 99%|█████████▉| 28.9G/29.1G [09:47<00:03, 60.2MB/s]
 99%|█████████▉| 28.9G/29.1G [09:47<00:03, 61.4MB/s]
 99%|█████████▉| 28.9G/29.1G [09:47<00:03, 64.0MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:03, 65.0MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:03, 65.9MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:05, 39.3MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:04, 45.1MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:03, 50.2MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:03, 54.6MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:02, 58.2MB/s]
 99%|█████████▉| 28.9G/29.1G [09:48<00:02, 60.6MB/s]
 99%|█████████▉| 28.9G/29.1G [09:49<00:02, 62.8MB/s]
100%|█████████▉| 28.9G/29.1G [09:49<00:02, 64.1MB/s]
100%|█████████▉| 28.9G/29.1G [09:49<00:02, 65.4MB/s]
100%|█████████▉| 28.9G/29.1G [09:49<00:02, 57.1MB/s]
100%|█████████▉| 29.0G/29.1G [09:49<00:02, 57.5MB/s]
100%|█████████▉| 29.0G/29.1G [09:49<00:02, 60.9MB/s]
100%|█████████▉| 29.0G/29.1G [09:49<00:01, 62.8MB/s]
100%|█████████▉| 29.0G/29.1G [09:49<00:01, 64.2MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:02, 50.1MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:02, 43.6MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:01, 49.1MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:01, 46.6MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:01, 51.1MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:01, 48.1MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:01, 53.1MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:01, 56.5MB/s]
100%|█████████▉| 29.0G/29.1G [09:50<00:00, 59.5MB/s]
100%|█████████▉| 29.0G/29.1G [09:51<00:00, 62.4MB/s]
100%|█████████▉| 29.0G/29.1G [09:51<00:00, 63.3MB/s]
100%|█████████▉| 29.0G/29.1G [09:51<00:00, 64.6MB/s]
100%|█████████▉| 29.1G/29.1G [09:51<00:00, 63.5MB/s]
100%|█████████▉| 29.1G/29.1G [09:51<00:00, 64.1MB/s]
100%|█████████▉| 29.1G/29.1G [09:51<00:00, 61.2MB/s]
100%|█████████▉| 29.1G/29.1G [09:51<00:00, 54.5MB/s]
100%|█████████▉| 29.1G/29.1G [09:51<00:00, 52.3MB/s]
100%|██████████| 29.1G/29.1G [09:51<00:00, 52.7MB/s]

  0%|          | 0.00/89.3k [00:00<?, ?B/s]
100%|██████████| 89.3k/89.3k [00:00<00:00, 933kB/s]


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) If `SKILL.md` points to extra folders such as `references/`, load only the specific files needed for the request; don't bulk-load everything.
  3) If `scripts/` exist, prefer running or patching them instead of retyping large code blocks.
  4) 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.


**Verifying transcription output**

The script completed successfully with exit code 0, so next I'll check the results file for line count and any errors to confirm transcription completeness and correctness.


python3 - <<'PY'
from pathlib import Path
path = Path('outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl')
print('exists', path.exists())
if path.exists():
    count = sum(1 for _ in path.open())
    print('rows', count)
    with path.open() as f:
        for i in range(2):
            print(f.readline().strip())
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:
exists True
rows 1200
{"schema_version": 1, "segment_id": "fleurs__as_in__test__285__1764-5006634a7372640e", "src_path": "data/bench/maya_hf_v2_100/audio/asm/fleurs__as_in__test__285__1764.wav", "route": {"language_hint": "asm", "language_hint_source": "refs"}, "config": {"model_card": "omniASR_LLM_7B_v2", "batch_size": 4}, "asr_errors": {}, "asr": {"omniasr:omniASR_LLM_7B_v2": {"model": "omniASR_LLM_7B_v2", "text": "উপস্থিত থকা লোকৰ সংখ্যা ইমানেই বেছি আছিল যে ছেইণ্ট পিটাৰৰ স্কুৱেৰত অন্তিম সংস্কাৰলৈ সকলো লোক যোৱাটো সম্ভৱপৰ নাছিল", "language": "asm_Beng"}}, "final": {"text": "উপস্থিত থকা লোকৰ সংখ্যা ইমানেই বেছি আছিল যে ছেইণ্ট পিটাৰৰ স্কুৱেৰত অন্তিম সংস্কাৰলৈ সকলো লোক যোৱাটো সম্ভৱপৰ নাছিল", "source": "asr:omniasr:omniASR_LLM_7B_v2"}}
{"schema_version": 1, "segment_id": "fleurs__as_in__test__204__1790-3d591a345e393aec", "src_path": "data/bench/maya_hf_v2_100/audio/asm/fleurs__as_in__test__204__1790.wav", "route": {"language_hint": "asm", "language_hint_source": "refs"}, "config": {"model_card": "omniASR_LLM_7B_v2", "batch_size": 4}, "asr_errors": {}, "asr": {"omniasr:omniASR_LLM_7B_v2": {"model": "omniASR_LLM_7B_v2", "text": "তেওঁৰ কাম এনে স্বীকৃত মানদণ্ড আৰু সূক্ষ্ম আছিল যে তেওঁ ডাক টিকট সংগ্ৰহকাৰীসকলৰ মাজত অতি কম সংখ্যক পৰিচিত নামসমূহৰ অন্যতম আছিল কিছুমানে তেওঁ কেৱল কৰ্মৰাজীৰ সংগ্ৰহটোৱে বিষয়ক্ষ আছিল", "language": "asm_Beng"}}, "final": {"text": "তেওঁৰ কাম এনে স্বীকৃত মানদণ্ড আৰু সূক্ষ্ম আছিল যে তেওঁ ডাক টিকট সংগ্ৰহকাৰীসকলৰ মাজত অতি কম সংখ্যক পৰিচিত নামসমূহৰ অন্যতম আছিল কিছুমানে তেওঁ কেৱল কৰ্মৰাজীৰ সংগ্ৰহটোৱে বিষয়ক্ষ আছিল", "source": "asr:omniasr:omniASR_LLM_7B_v2"}}


Summary: auto


**Running Seamless M4T script with long timeout**


source .venv_omni/bin/activate && python scripts/run_seamless_m4t_v2_large.py


Output:
Exit code: 0
Wall time: 394.3 seconds
Output:
`torch_dtype` is deprecated! Use `dtype` instead!

Fetching 2 files:   0%|          | 0/2 [00:00<?, ?it/s]
Fetching 2 files:  50%|█████     | 1/2 [00:08<00:08,  8.08s/it]
Fetching 2 files: 100%|██████████| 2/2 [00:08<00:00,  3.43s/it]
Fetching 2 files: 100%|██████████| 2/2 [00:08<00:00,  4.13s/it]
Instantiating a decoder SeamlessM4Tv2Attention without passing `layer_idx` is not recommended and will lead to errors during the forward call, if caching is used. Please make sure to provide a `layer_idx` when creating this class.

Loading checkpoint shards:   0%|          | 0/2 [00:00<?, ?it/s]
Loading checkpoint shards:  50%|█████     | 1/2 [00:01<00:01,  1.51s/it]
Loading checkpoint shards: 100%|██████████| 2/2 [00:02<00:00,  1.03it/s]
Loading checkpoint shards: 100%|██████████| 2/2 [00:02<00:00,  1.05s/it]


**Completing M4T script run**

The M4T script finished efficiently in about 6.5 minutes, so next I'll verify the results file to ensure output correctness.


python3 - <<'PY'
from pathlib import Path
path = Path('outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl')
print('exists', path.exists())
if path.exists():
    count = sum(1 for _ in path.open())
    print('rows', count)
    with path.open() as f:
        for i in range(2):
            print(f.readline().strip())
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:
exists True
rows 1200
{"schema_version": 1, "segment_id": "fleurs__as_in__test__285__1764-5006634a7372640e", "src_path": "data/bench/maya_hf_v2_100/audio/asm/fleurs__as_in__test__285__1764.wav", "route": {"language_hint": "asm", "language_hint_source": "refs"}, "config": {"model_id": "facebook/seamless-m4t-v2-large", "batch_size": 4}, "asr_errors": {}, "asr": {"m4t:facebook/seamless-m4t-v2-large": {"model": "facebook/seamless-m4t-v2-large", "text": "উপস্থিত থকা মানুহৰ সংখ্যা ইমানেই বেছি আছিল যে ছেইণ্ট পিটাৰৰ স্কোৱাৰত অন্তিম সংস্কাৰলৈ সকলো লোক যোৱাটো সম্ভৱপৰ নাছিল।", "language": "asm"}}, "final": {"text": "উপস্থিত থকা মানুহৰ সংখ্যা ইমানেই বেছি আছিল যে ছেইণ্ট পিটাৰৰ স্কোৱাৰত অন্তিম সংস্কাৰলৈ সকলো লোক যোৱাটো সম্ভৱপৰ নাছিল।", "source": "asr:m4t:facebook/seamless-m4t-v2-large"}}
{"schema_version": 1, "segment_id": "fleurs__as_in__test__204__1790-3d591a345e393aec", "src_path": "data/bench/maya_hf_v2_100/audio/asm/fleurs__as_in__test__204__1790.wav", "route": {"language_hint": "asm", "language_hint_source": "refs"}, "config": {"model_id": "facebook/seamless-m4t-v2-large", "batch_size": 4}, "asr_errors": {}, "asr": {"m4t:facebook/seamless-m4t-v2-large": {"model": "facebook/seamless-m4t-v2-large", "text": "তেওঁৰ কাম এনে স্বীকৃত মানদণ্ড আৰু সুক্ষ্ম আছিল যে তেওঁ ডাক টিকট সংগ্ৰহকাৰীসকলৰ মাজত অতি কম সংখ্যক পৰিচিত নামসমূহৰ অন্যতম আছিল। কিছুমানে তেওঁক কেৱল কৰ্মৰাজিৰ সংগ্ৰহতেই বিশেষ আছিল।", "language": "asm"}}, "final": {"text": "তেওঁৰ কাম এনে স্বীকৃত মানদণ্ড আৰু সুক্ষ্ম আছিল যে তেওঁ ডাক টিকট সংগ্ৰহকাৰীসকলৰ মাজত অতি কম সংখ্যক পৰিচিত নামসমূহৰ অন্যতম আছিল। কিছুমানে তেওঁক কেৱল কৰ্মৰাজিৰ সংগ্ৰহতেই বিশেষ আছিল।", "source": "asr:m4t:facebook/seamless-m4t-v2-large"}}


**Running evaluation for new models**

I'm preparing to compute eval.json outputs for both OmniASR and M4T by running the evaluation CLI with their respective result files and references, targeting the specified output paths.


python3 -m maya_transcribe.cli eval --results outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl --refs data/bench/maya_hf_v2_100/refs.jsonl --out outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/eval.json


Output:
Exit code: 0
Wall time: 0.7 seconds
Output:
{
  "hypothesis": "final",
  "pairs_evaluated": 1200,
  "wer_mean": 0.22288037163230812,
  "cer_mean": 0.04855238819506099,
  "wer_p50": 0.18181818181818182,
  "wer_p90": 0.5,
  "wer_p95": 0.6,
  "cer_p50": 0.03333333333333333,
  "cer_p90": 0.11363636363636363,
  "cer_p95": 0.14814814814814814,
  "segment_error_rate": 0.8275,
  "pct_wer_gt_5pct": 0.8083333333333333,
  "pct_wer_gt_10pct": 0.6766666666666666,
  "wer_by_language_mean": {
    "asm": 0.2181537812829902,
    "ben": 0.13896603396603394,
    "eng": 0.06049001563404041,
    "guj": 0.16276623376623373,
    "hin": 0.12568500943500935,
    "kan": 0.2043093573093573,
    "mal": 0.4115878288378289,
    "mar": 0.2509479964479965,
    "ory": 0.2975585248085249,
    "pan": 0.1595590798090798,
    "tam": 0.3289472194472194,
    "tel": 0.3155933788433786
  },
  "wer_by_decision_mean": {},
  "wer_by_duration_bucket_mean": {},
  "cer_by_language_mean": {
    "asm": 0.05827630490634825,
    "ben": 0.02278506866401786,
    "eng": 0.023935276369081528,
    "guj": 0.037709051981863494,
    "hin": 0.03795530823537949,
    "kan": 0.035398504313356643,
    "mal": 0.08774695738791957,
    "mar": 0.0609151583727772,
    "ory": 0.05784873961947083,
    "pan": 0.0471739391518909,
    "tam": 0.05554181038464399,
    "tel": 0.0573425389539809
  },
  "cer_by_decision_mean": {},
  "cer_by_duration_bucket_mean": {},
  "oracle": {
    "enabled": true,
    "oracle_best_wer_mean": 0.22288037163230812,
    "selection_gap_wer_mean": 0.0,
    "selection_gap_wer_p90": 0.0
  }
}


**Logging OmniASR WER**


python3 -m maya_transcribe.cli eval --results outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl --refs data/bench/maya_hf_v2_100/refs.jsonl --out outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/eval.json


Output:
Exit code: 0
Wall time: 0.7 seconds
Output:
{
  "hypothesis": "final",
  "pairs_evaluated": 1200,
  "wer_mean": 0.2645764596786939,
  "cer_mean": 0.09236443706443857,
  "wer_p50": 0.2222222222222222,
  "wer_p90": 0.5555555555555556,
  "wer_p95": 0.6666666666666666,
  "cer_p50": 0.0660377358490566,
  "cer_p90": 0.1956521739130435,
  "cer_p95": 0.25,
  "segment_error_rate": 0.8733333333333333,
  "pct_wer_gt_5pct": 0.8591666666666666,
  "pct_wer_gt_10pct": 0.745,
  "wer_by_language_mean": {
    "asm": 0.2991397891984487,
    "ben": 0.17505294705294702,
    "eng": 0.07674323366138308,
    "guj": 0.19391206016206008,
    "hin": 0.25393481518481503,
    "kan": 0.30480366855366847,
    "mal": 0.4255339660339661,
    "mar": 0.24124875124875117,
    "ory": 0.3149777722277722,
    "pan": 0.17401037851037848,
    "tam": 0.3148700466200464,
    "tel": 0.4006900876900877
  },
  "wer_by_decision_mean": {},
  "wer_by_duration_bucket_mean": {},
  "cer_by_language_mean": {
    "asm": 0.11808997740825097,
    "ben": 0.03865419761269325,
    "eng": 0.054115639159410804,
    "guj": 0.06876451722730918,
    "hin": 0.16490670298710117,
    "kan": 0.10152950800885303,
    "mal": 0.10600384248502571,
    "mar": 0.08267075086855172,
    "ory": 0.10754606751701601,
    "pan": 0.05995725579827222,
    "tam": 0.07634889950078151,
    "tel": 0.12978588619999631
  },
  "cer_by_decision_mean": {},
  "cer_by_duration_bucket_mean": {},
  "oracle": {
    "enabled": true,
    "oracle_best_wer_mean": 0.2645764596786939,
    "selection_gap_wer_mean": 0.0,
    "selection_gap_wer_p90": 0.0
  }
}


**Updating results.md with new columns and WER data**

I'll add columns for OmniASR and Seamless M4T to the results.md table and update the runs list with new entries referencing their JSONL outputs. Then I'll parse eval.json files to extract per-language WER percentages formatted to one decimal point and update the table accordingly.


**Computing per-language WER summaries**

I'll run a Python script to parse eval.json files and print WER percentages by language and overall for OmniASR and M4T, ensuring consistent formatting for table updates.


python3 - <<'PY'
import json
from pathlib import Path

def load(path):
    with Path(path).open() as f:
        return json.load(f)

models = {
    "IndicConformer-600M (HF)": "outputs/bench/maya_hf_v2_100/indicconformer_600m_hf/eval.json",
    "Whisper large-v3": "outputs/bench/maya_hf_v2_100/whisper_large_v3/eval.json",
    "Voxtral-Small": "outputs/bench/maya_hf_v2_100/voxtral_small_vllm/eval.json",
    "Gemma-3n-E2B": "outputs/bench/maya_hf_v2_100/gemma3n_e2b_vllm/eval.json",
    "OmniASR LLM 7B v2": "outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/eval.json",
    "Seamless M4T v2 large": "outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/eval.json",
}

langs = ["asm","ben","eng","guj","hin","kan","mal","mar","ory","pan","tam","tel"]

rows = {lang: {} for lang in langs}
overall = {}

for name, path in models.items():
    if not Path(path).exists():
        continue
    data = load(path)
    by_lang = data.get("wer_by_language_mean", {})
    for lang in langs:
        if lang in by_lang:
            rows[lang][name] = by_lang[lang] * 100.0
    if data.get("wer_mean") is not None:
        overall[name] = data["wer_mean"] * 100.0

print('langs rows')
for lang in langs:
    print(lang, rows[lang])
print('overall', overall)
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:
langs rows
asm {'IndicConformer-600M (HF)': 19.89236773682788, 'Whisper large-v3': 95.87616318269207, 'Voxtral-Small': 107.86945391774869, 'Gemma-3n-E2B': 77.98161553305052, 'OmniASR LLM 7B v2': 21.81537812829902, 'Seamless M4T v2 large': 29.91397891984487}
ben {'IndicConformer-600M (HF)': 11.235003885003877, 'Whisper large-v3': 64.24618714618715, 'Voxtral-Small': 37.38200133200132, 'Gemma-3n-E2B': 34.78818958818958, 'OmniASR LLM 7B v2': 13.896603396603394, 'Seamless M4T v2 large': 17.505294705294702}
eng {'Whisper large-v3': 4.457767366566336, 'Voxtral-Small': 3.8394716278602554, 'Gemma-3n-E2B': 9.221403248815118, 'OmniASR LLM 7B v2': 6.049001563404041, 'Seamless M4T v2 large': 7.674323366138308}
guj {'IndicConformer-600M (HF)': 11.734576534576531, 'Whisper large-v3': 49.33407425907425, 'Voxtral-Small': 49.77294649794649, 'Gemma-3n-E2B': 87.34913974913977, 'OmniASR LLM 7B v2': 16.276623376623373, 'Seamless M4T v2 large': 19.39120601620601}
hin {'IndicConformer-600M (HF)': 9.15341325341325, 'Whisper large-v3': 30.864887889887875, 'Voxtral-Small': 14.871028971028966, 'Gemma-3n-E2B': 18.80531968031968, 'OmniASR LLM 7B v2': 12.568500943500934, 'Seamless M4T v2 large': 25.393481518481504}
kan {'IndicConformer-600M (HF)': 14.34396991896991, 'Whisper large-v3': 71.68407148407148, 'Voxtral-Small': 48.962099012099, 'Gemma-3n-E2B': 45.81712176712177, 'OmniASR LLM 7B v2': 20.43093573093573, 'Seamless M4T v2 large': 30.480366855366846}
mal {'IndicConformer-600M (HF)': 29.854409479409462, 'Whisper large-v3': 122.48120490620494, 'Voxtral-Small': 62.575904650904626, 'Gemma-3n-E2B': 65.06648906648907, 'OmniASR LLM 7B v2': 41.15878288378289, 'Seamless M4T v2 large': 42.55339660339661}
mar {'IndicConformer-600M (HF)': 14.641452991452987, 'Whisper large-v3': 79.71154123654124, 'Voxtral-Small': 39.92208624708625, 'Gemma-3n-E2B': 38.791275391275384, 'OmniASR LLM 7B v2': 25.094799644799647, 'Seamless M4T v2 large': 24.124875124875118}
ory {'IndicConformer-600M (HF)': 16.3345127095127, 'Whisper large-v3': 115.45948773448775, 'Voxtral-Small': 130.2522311022311, 'Gemma-3n-E2B': 120.03219835719835, 'OmniASR LLM 7B v2': 29.75585248085249, 'Seamless M4T v2 large': 31.497777222777216}
pan {'IndicConformer-600M (HF)': 12.556410256410249, 'Whisper large-v3': 64.74317904317901, 'Voxtral-Small': 34.230536130536116, 'Gemma-3n-E2B': 134.96818181818185, 'OmniASR LLM 7B v2': 15.95590798090798, 'Seamless M4T v2 large': 17.40103785103785}
tam {'IndicConformer-600M (HF)': 20.09161671661671, 'Whisper large-v3': 50.88384670884668, 'Voxtral-Small': 52.72821900321898, 'Gemma-3n-E2B': 78.8172993672994, 'OmniASR LLM 7B v2': 32.89472194472194, 'Seamless M4T v2 large': 31.48700466200464}
tel {'IndicConformer-600M (HF)': 24.37044899544898, 'Whisper large-v3': 78.9678682428682, 'Voxtral-Small': 47.53148518148517, 'Gemma-3n-E2B': 51.178996003996005, 'OmniASR LLM 7B v2': 31.55933788433786, 'Seamless M4T v2 large': 40.06900876900877}
overall {'IndicConformer-600M (HF)': 16.746198407058465, 'Whisper large-v3': 69.05918993338405, 'Voxtral-Small': 52.49478863951226, 'Gemma-3n-E2B': 63.568102464256384, 'OmniASR LLM 7B v2': 22.28803716323081, 'Seamless M4T v2 large': 26.457645967869393}


**Planning table and results.md updates**

I'll format percentages to one decimal for consistency and add two new columns with OmniASR and Seamless M4T results in the large table, updating headers and rows accordingly. I'll also revise the "Multilingual 100-sample Runs" section to reflect that eval.json is now generated and add bullets for the new runs.


**Appending new columns with rounded percentages**

We'll add OmniASR and Seamless columns to the table's right side to keep existing order, ensuring IndicConformer’s "eng" row remains n/a. I’m confirming the one-decimal rounding of WER values for all languages and overall before updating the table.


Output:
Exit code: 0
Wall time: 0 seconds
Output:
Omni
asm 21.8
ben 13.9
eng 6.0
guj 16.3
hin 12.6
kan 20.4
mal 41.2
mar 25.1
ory 29.8
pan 16.0
tam 32.9
tel 31.6
overall 22.3
M4T
asm 29.9
ben 17.5
eng 7.7
guj 19.4
hin 25.4
kan 30.5
mal 42.6
mar 24.1
ory 31.5
pan 17.4
tam 31.5
tel 40.1
overall 26.5


**Preparing patch for results.md update**

I'm manually crafting a patch to update the multilingual section of results.md with new run info, added OmniASR and M4T entries, revised text, and expanded table columns while keeping alignment consistent.


**Applying patch to results.md**


Input:
*** Begin Patch
*** Update File: results.md
@@
-## Multilingual 100-sample Runs (Transcription Dumps)
-Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs are for JSON dumps first; eval.json was generated but not analyzed yet.
+## Multilingual 100-sample Runs (Transcription Dumps)
+Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs include JSON dumps + eval.json for per-language WER.
@@
 - IndicConformer 600M multilingual (HF): `outputs/bench/maya_hf_v2_100/indicconformer_600m_hf/results.jsonl`
   - Note: English segments failed with `KeyError:'joint_post_net_en'` (100 error rows).
 - Whisper large-v3: `outputs/bench/maya_hf_v2_100/whisper_large_v3/results.jsonl`
 - Voxtral-Small-24B-2507: `outputs/bench/maya_hf_v2_100/voxtral_small_vllm/results.jsonl`
   - Note: Voxtral only natively supports a small language set (hi/en/...) so non-supported languages likely degrade.
 - Gemma-3n-E2B-it: `outputs/bench/maya_hf_v2_100/gemma3n_e2b_vllm/results.jsonl`
+- OmniASR LLM 7B v2: `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl`
+- Seamless M4T v2 large: `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl`
@@
-| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B |
+| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B | OmniASR LLM 7B v2 | Seamless M4T v2 large |
 | --- | --- | --- | --- | --- |
-| asm | 19.9 | 95.9 | 107.9 | 78.0 |
-| ben | 11.2 | 64.2 | 37.4 | 34.8 |
-| eng | n/a | 4.5 | 3.8 | 9.2 |
-| guj | 11.7 | 49.3 | 49.8 | 87.3 |
-| hin | 9.2 | 30.9 | 14.9 | 18.8 |
-| kan | 14.3 | 71.7 | 49.0 | 45.8 |
-| mal | 29.9 | 122.5 | 62.6 | 65.1 |
-| mar | 14.6 | 79.7 | 39.9 | 38.8 |
-| ory | 16.3 | 115.5 | 130.3 | 120.0 |
-| pan | 12.6 | 64.7 | 34.2 | 135.0 |
-| tam | 20.1 | 50.9 | 52.7 | 78.8 |
-| tel | 24.4 | 79.0 | 47.5 | 51.2 |
-| overall | 16.7 | 69.1 | 52.5 | 63.6 |
+| asm | 19.9 | 95.9 | 107.9 | 78.0 | 21.8 | 29.9 |
+| ben | 11.2 | 64.2 | 37.4 | 34.8 | 13.9 | 17.5 |
+| eng | n/a | 4.5 | 3.8 | 9.2 | 6.0 | 7.7 |
+| guj | 11.7 | 49.3 | 49.8 | 87.3 | 16.3 | 19.4 |
+| hin | 9.2 | 30.9 | 14.9 | 18.8 | 12.6 | 25.4 |
+| kan | 14.3 | 71.7 | 49.0 | 45.8 | 20.4 | 30.5 |
+| mal | 29.9 | 122.5 | 62.6 | 65.1 | 41.2 | 42.6 |
+| mar | 14.6 | 79.7 | 39.9 | 38.8 | 25.1 | 24.1 |
+| ory | 16.3 | 115.5 | 130.3 | 120.0 | 29.8 | 31.5 |
+| pan | 12.6 | 64.7 | 34.2 | 135.0 | 16.0 | 17.4 |
+| tam | 20.1 | 50.9 | 52.7 | 78.8 | 32.9 | 31.5 |
+| tel | 24.4 | 79.0 | 47.5 | 51.2 | 31.6 | 40.1 |
+| overall | 16.7 | 69.1 | 52.5 | 63.6 | 22.3 | 26.5 |
*** End Patch


Output: execution error: Io(Os { code: 2, kind: NotFound, message: "No such file or directory" })


**Diagnosing apply_patch path issues**

The apply_patch tool fails with "No such file or directory," likely because it expects file paths relative to the sandbox root, not the current repo subdirectory; I'll try adjusting the patch paths accordingly.


**Switching from apply_patch to Python script for editing**

Since apply_patch fails, I'll implement a Python script to modify results.md by replacing exact text blocks for the JSON line, adding bullet points, and updating the table with precise string replacements using regex where needed.


python3 - <<'PY'
from pathlib import Path

path = Path('results.md')
text = path.read_text(encoding='utf-8')

text = text.replace(
    'Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs are for JSON dumps first; eval.json was generated but not analyzed yet.\n',
    'Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs include JSON dumps + eval.json for per-language WER.\n',
)

old_bullets = (
    '- Gemma-3n-E2B-it: `outputs/bench/maya_hf_v2_100/gemma3n_e2b_vllm/results.jsonl`\n'
)
new_bullets = (
    '- Gemma-3n-E2B-it: `outputs/bench/maya_hf_v2_100/gemma3n_e2b_vllm/results.jsonl`\n'
    '- OmniASR LLM 7B v2: `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl`\n'
    '- Seamless M4T v2 large: `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl`\n'
)
if old_bullets in text:
    text = text.replace(old_bullets, new_bullets)
else:
    raise SystemExit('Bullet anchor not found for replacement')

old_table = (
    '| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B |\n'
    '| --- | --- | --- | --- | --- |\n'
    '| asm | 19.9 | 95.9 | 107.9 | 78.0 |\n'
    '| ben | 11.2 | 64.2 | 37.4 | 34.8 |\n'
    '| eng | n/a | 4.5 | 3.8 | 9.2 |\n'
    '| guj | 11.7 | 49.3 | 49.8 | 87.3 |\n'
    '| hin | 9.2 | 30.9 | 14.9 | 18.8 |\n'
    '| kan | 14.3 | 71.7 | 49.0 | 45.8 |\n'
    '| mal | 29.9 | 122.5 | 62.6 | 65.1 |\n'
    '| mar | 14.6 | 79.7 | 39.9 | 38.8 |\n'
    '| ory | 16.3 | 115.5 | 130.3 | 120.0 |\n'
    '| pan | 12.6 | 64.7 | 34.2 | 135.0 |\n'
    '| tam | 20.1 | 50.9 | 52.7 | 78.8 |\n'
    '| tel | 24.4 | 79.0 | 47.5 | 51.2 |\n'
    '| overall | 16.7 | 69.1 | 52.5 | 63.6 |\n'
)
new_table = (
    '| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B | OmniASR LLM 7B v2 | Seamless M4T v2 large |\n'
    '| --- | --- | --- | --- | --- | --- | --- |\n'
    '| asm | 19.9 | 95.9 | 107.9 | 78.0 | 21.8 | 29.9 |\n'
    '| ben | 11.2 | 64.2 | 37.4 | 34.8 | 13.9 | 17.5 |\n'
    '| eng | n/a | 4.5 | 3.8 | 9.2 | 6.0 | 7.7 |\n'
    '| guj | 11.7 | 49.3 | 49.8 | 87.3 | 16.3 | 19.4 |\n'
    '| hin | 9.2 | 30.9 | 14.9 | 18.8 | 12.6 | 25.4 |\n'
    '| kan | 14.3 | 71.7 | 49.0 | 45.8 | 20.4 | 30.5 |\n'
    '| mal | 29.9 | 122.5 | 62.6 | 65.1 | 41.2 | 42.6 |\n'
    '| mar | 14.6 | 79.7 | 39.9 | 38.8 | 25.1 | 24.1 |\n'
    '| ory | 16.3 | 115.5 | 130.3 | 120.0 | 29.8 | 31.5 |\n'
    '| pan | 12.6 | 64.7 | 34.2 | 135.0 | 16.0 | 17.4 |\n'
    '| tam | 20.1 | 50.9 | 52.7 | 78.8 | 32.9 | 31.5 |\n'
    '| tel | 24.4 | 79.0 | 47.5 | 51.2 | 31.6 | 40.1 |\n'
    '| overall | 16.7 | 69.1 | 52.5 | 63.6 | 22.3 | 26.5 |\n'
)
if old_table in text:
    text = text.replace(old_table, new_table)
else:
    raise SystemExit('Table anchor not found for replacement')

path.write_text(text, encoding='utf-8')
PY


Output:
Exit code: 1
Wall time: 0 seconds
Output:
Table anchor not found for replacement


Summary: auto


**Inspecting table formatting**

I'm checking the lines around the table in results.md to understand spacing and alignment before updating the snippet accordingly.


python3 - <<'PY'
from pathlib import Path
text = Path('results.md').read_text(encoding='utf-8')
start = text.index('### Per-language WER (mean, %)')
print(text[start:start+1200])
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:
### Per-language WER (mean, %)
Source: `eval.json` from each run. Note: IndicConformer HF failed on English (`n/a` below), so its overall WER is computed on 1100 segments.

| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B |
| --- | --- | --- | --- | --- |
| asm | 19.9 | 95.9 | 107.9 | 78.0 |
| ben | 11.2 | 64.2 | 37.4 | 34.8 |
| eng | n/a | 4.5 | 3.8 | 9.2 |
| guj | 11.7 | 49.3 | 49.8 | 87.3 |
| hin | 9.2 | 30.9 | 14.9 | 18.8 |
| kan | 14.3 | 71.7 | 49.0 | 45.8 |
| mal | 29.9 | 122.5 | 62.6 | 65.1 |
| mar | 14.6 | 79.7 | 39.9 | 38.8 |
| ory | 16.3 | 115.5 | 130.3 | 120.0 |
| pan | 12.6 | 64.7 | 34.2 | 135.0 |
| tam | 20.1 | 50.9 | 52.7 | 78.8 |
| tel | 24.4 | 79.0 | 47.5 | 51.2 |
| overall | 16.7 | 69.1 | 52.5 | 63.6 |


**Refining table replacement strategy**

I'm planning to extract the existing table block precisely from the file using line boundaries to avoid newline or whitespace mismatches, then replace it with the new table string for more reliable updates.


python3 - <<'PY'
from pathlib import Path

path = Path('results.md')
text = path.read_text(encoding='utf-8')

# Update the bench description line
text = text.replace(
    'Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs are for JSON dumps first; eval.json was generated but not analyzed yet.\n',
    'Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs include JSON dumps + eval.json for per-language WER.\n',
)

# Insert new bullets after Gemma line
marker = '- Gemma-3n-E2B-it: `outputs/bench/maya_hf_v2_100/gemma3n_e2b_vllm/results.jsonl`\n'
if marker in text:
    insert = (
        marker
        '- OmniASR LLM 7B v2: `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl`\n'
        '- Seamless M4T v2 large: `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl`\n'
    )
    text = text.replace(marker, insert)
else:
    raise SystemExit('Gemma bullet not found')

# Replace the table block
lines = text.splitlines()
start = None
end = None
for i, line in enumerate(lines):
    if line.startswith('| Lang | IndicConformer-600M (HF)'):
        start = i
        continue
    if start is not None and line.startswith('| overall |'):
        end = i
        break
if start is None or end is None:
    raise SystemExit('Table block not found')

new_table = [
    '| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B | OmniASR LLM 7B v2 | Seamless M4T v2 large |',
    '| --- | --- | --- | --- | --- | --- | --- |',
    '| asm | 19.9 | 95.9 | 107.9 | 78.0 | 21.8 | 29.9 |',
    '| ben | 11.2 | 64.2 | 37.4 | 34.8 | 13.9 | 17.5 |',
    '| eng | n/a | 4.5 | 3.8 | 9.2 | 6.0 | 7.7 |',
    '| guj | 11.7 | 49.3 | 49.8 | 87.3 | 16.3 | 19.4 |',
    '| hin | 9.2 | 30.9 | 14.9 | 18.8 | 12.6 | 25.4 |',
    '| kan | 14.3 | 71.7 | 49.0 | 45.8 | 20.4 | 30.5 |',
    '| mal | 29.9 | 122.5 | 62.6 | 65.1 | 41.2 | 42.6 |',
    '| mar | 14.6 | 79.7 | 39.9 | 38.8 | 25.1 | 24.1 |',
    '| ory | 16.3 | 115.5 | 130.3 | 120.0 | 29.8 | 31.5 |',
    '| pan | 12.6 | 64.7 | 34.2 | 135.0 | 16.0 | 17.4 |',
    '| tam | 20.1 | 50.9 | 52.7 | 78.8 | 32.9 | 31.5 |',
    '| tel | 24.4 | 79.0 | 47.5 | 51.2 | 31.6 | 40.1 |',
    '| overall | 16.7 | 69.1 | 52.5 | 63.6 | 22.3 | 26.5 |',
]

lines = lines[:start] + new_table + lines[end + 1 :]
text = '\n'.join(lines) + '\n'

path.write_text(text, encoding='utf-8')
PY


Output:
Exit code: 1
Wall time: 0.1 seconds
Output:
  File "<stdin>", line 17
    '- OmniASR LLM 7B v2: `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl`\n'
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: invalid syntax


**Fixing string concatenation syntax**

Realized that concatenating a variable with string literals inside parentheses without operators is invalid in Python, so I'll correct it to use explicit '+' operators.


python3 - <<'PY'
from pathlib import Path

path = Path('results.md')
text = path.read_text(encoding='utf-8')

text = text.replace(
    'Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs are for JSON dumps first; eval.json was generated but not analyzed yet.\n',
    'Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs include JSON dumps + eval.json for per-language WER.\n',
)

marker = '- Gemma-3n-E2B-it: `outputs/bench/maya_hf_v2_100/gemma3n_e2b_vllm/results.jsonl`\n'
if marker in text:
    insert = (
        marker
        + '- OmniASR LLM 7B v2: `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl`\n'
        + '- Seamless M4T v2 large: `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl`\n'
    )
    text = text.replace(marker, insert)
else:
    raise SystemExit('Gemma bullet not found')

lines = text.splitlines()
start = None
end = None
for i, line in enumerate(lines):
    if line.startswith('| Lang | IndicConformer-600M (HF)'):
        start = i
        continue
    if start is not None and line.startswith('| overall |'):
        end = i
        break
if start is None or end is None:
    raise SystemExit('Table block not found')

new_table = [
    '| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B | OmniASR LLM 7B v2 | Seamless M4T v2 large |',
    '| --- | --- | --- | --- | --- | --- | --- |',
    '| asm | 19.9 | 95.9 | 107.9 | 78.0 | 21.8 | 29.9 |',
    '| ben | 11.2 | 64.2 | 37.4 | 34.8 | 13.9 | 17.5 |',
    '| eng | n/a | 4.5 | 3.8 | 9.2 | 6.0 | 7.7 |',
    '| guj | 11.7 | 49.3 | 49.8 | 87.3 | 16.3 | 19.4 |',
    '| hin | 9.2 | 30.9 | 14.9 | 18.8 | 12.6 | 25.4 |',
    '| kan | 14.3 | 71.7 | 49.0 | 45.8 | 20.4 | 30.5 |',
    '| mal | 29.9 | 122.5 | 62.6 | 65.1 | 41.2 | 42.6 |',
    '| mar | 14.6 | 79.7 | 39.9 | 38.8 | 25.1 | 24.1 |',
    '| ory | 16.3 | 115.5 | 130.3 | 120.0 | 29.8 | 31.5 |',
    '| pan | 12.6 | 64.7 | 34.2 | 135.0 | 16.0 | 17.4 |',
    '| tam | 20.1 | 50.9 | 52.7 | 78.8 | 32.9 | 31.5 |',
    '| tel | 24.4 | 79.0 | 47.5 | 51.2 | 31.6 | 40.1 |',
    '| overall | 16.7 | 69.1 | 52.5 | 63.6 | 22.3 | 26.5 |',
]

lines = lines[:start] + new_table + lines[end + 1 :]
text = '\n'.join(lines) + '\n'

path.write_text(text, encoding='utf-8')
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:


**Confirming results.md update**


python3 - <<'PY'
from pathlib import Path
text = Path('results.md').read_text(encoding='utf-8')
start = text.index('## Multilingual 100-sample Runs (Transcription Dumps)')
print(text[start:start+1200])
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:
## Multilingual 100-sample Runs (Transcription Dumps)
Bench subset: `data/bench/maya_hf_v2_100` (12 languages x 100 samples). These runs include JSON dumps + eval.json for per-language WER.

- IndicConformer 600M multilingual (HF): `outputs/bench/maya_hf_v2_100/indicconformer_600m_hf/results.jsonl`
  - Note: English segments failed with `KeyError:'joint_post_net_en'` (100 error rows).
- Whisper large-v3: `outputs/bench/maya_hf_v2_100/whisper_large_v3/results.jsonl`
- Voxtral-Small-24B-2507: `outputs/bench/maya_hf_v2_100/voxtral_small_vllm/results.jsonl`
  - Note: Voxtral only natively supports a small language set (hi/en/...) so non-supported languages likely degrade.
- Gemma-3n-E2B-it: `outputs/bench/maya_hf_v2_100/gemma3n_e2b_vllm/results.jsonl`
- OmniASR LLM 7B v2: `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl`
- Seamless M4T v2 large: `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl`

### Per-language WER (mean, %)
Source: `eval.json` from each run. Note: IndicConformer HF failed on English (`n/a` below), so its overall WER is computed on 1100 segments.

| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B | OmniAS


**Noting table truncation**

The table appears truncated but likely accurate; next is to verify with the full table for line break issues.


python3 - <<'PY'
from pathlib import Path
text = Path('results.md').read_text(encoding='utf-8')
start = text.index('| Lang | IndicConformer-600M (HF)')
end = text.index('| overall |')
print(text[start:end+80])
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:
| Lang | IndicConformer-600M (HF) | Whisper large-v3 | Voxtral-Small | Gemma-3n-E2B | OmniASR LLM 7B v2 | Seamless M4T v2 large |
| --- | --- | --- | --- | --- | --- | --- |
| asm | 19.9 | 95.9 | 107.9 | 78.0 | 21.8 | 29.9 |
| ben | 11.2 | 64.2 | 37.4 | 34.8 | 13.9 | 17.5 |
| eng | n/a | 4.5 | 3.8 | 9.2 | 6.0 | 7.7 |
| guj | 11.7 | 49.3 | 49.8 | 87.3 | 16.3 | 19.4 |
| hin | 9.2 | 30.9 | 14.9 | 18.8 | 12.6 | 25.4 |
| kan | 14.3 | 71.7 | 49.0 | 45.8 | 20.4 | 30.5 |
| mal | 29.9 | 122.5 | 62.6 | 65.1 | 41.2 | 42.6 |
| mar | 14.6 | 79.7 | 39.9 | 38.8 | 25.1 | 24.1 |
| ory | 16.3 | 115.5 | 130.3 | 120.0 | 29.8 | 31.5 |
| pan | 12.6 | 64.7 | 34.2 | 135.0 | 16.0 | 17.4 |
| tam | 20.1 | 50.9 | 52.7 | 78.8 | 32.9 | 31.5 |
| tel | 24.4 | 79.0 | 47.5 | 51.2 | 31.6 | 40.1 |
| overall | 16.7 | 69.1 | 52.5 | 63.6 | 22.3 | 26.5 |


**Planning result integration and environment notes**

The new ASR evaluations are run in isolated venvs as requested, with results added to the last table in results.md alongside previous runs for clarity. I'll mention the scripts for reproducibility and note any minor warnings, deciding whether to fix them or keep as is.


**Updating script to replace deprecated argument**

Deciding to update the evaluation script by swapping `torch_dtype` with `dtype` to prevent future warnings, making a small but clean improvement to the Seamless M4T runner.


python3 - <<'PY'
from pathlib import Path
path = Path('scripts/run_seamless_m4t_v2_large.py')
text = path.read_text(encoding='utf-8')
text = text.replace('torch_dtype=torch.float16,\n', 'dtype=torch.float16,\n')
path.write_text(text, encoding='utf-8')
PY


Output:
Exit code: 0
Wall time: 0 seconds
Output:


**Verifying error-free ASR results**

Planning to check the results files for any ASR errors by counting entries with `asr_errors` to confirm no failures occurred during OmniASR and M4T runs in the isolated `.venv_omni` environment.


python3 - <<'PY'
import json
from pathlib import Path

def count_errors(path):
    errors = 0
    with Path(path).open() as f:
        for line in f:
            row = json.loads(line)
            if row.get('asr_errors'):
                if any(row['asr_errors'].values()):
                    errors += 1
    return errors

print('omniasr errors', count_errors('outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl'))
print('m4t errors', count_errors('outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl'))
PY


Output:
Exit code: 0
Wall time: 0.1 seconds
Output:
omniasr errors 0
m4t errors 0


**Summarizing final updates and artifacts**

The scripts for reproducibility and evaluation JSON outputs are noted for mention in the final response, as well as the `results.md` update. Running tests is deemed unnecessary, but next steps like reviewing transcripts or running ensembles are suggested. The repository status will be checked to confirm no unwanted changes outside the virtual environment.


Output:
Exit code: 128
Wall time: 0 seconds
Output:
fatal: not a git repository (or any of the parent directories): .git


Summary: auto


**Summarizing model evaluation results**

I’m providing key WER metrics showing OmniASR’s overall 22.3% WER beating Voxtral and Gemma but behind IndicConformer’s 16.7%, and M4T’s 26.5%. Results were added to the last table in results.md alongside older runs for comparison. I’m highlighting new venv usage for OmniASR and M4T and referencing the created reproducibility scripts in `scripts/` to facilitate reruns.


**Summarizing final OmniASR and M4T evaluation**

Ran OmniASR LLM 7B v2 and Seamless M4T v2 large in the isolated `.venv_omni`, generated transcription dumps and eval results for the 12-language 100-sample benchmark, and updated the multilingual results table in `results.md`. Scripts were updated to use the `dtype` parameter to avoid deprecation warnings.

- OmniASR LLM 7B v2 achieved overall WER 22.3%; results at `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl` and eval at `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/eval.json`.
- Seamless M4T v2 large reached overall WER 26.5%; results at `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl` and eval at `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/eval.json`.
- Updated the multilingual summary table in `results.md` with these new runs alongside prior models.
- Added reproducible run scripts: `scripts/run_omniasr_7b_v2.py` and `scripts/run_seamless_m4t_v2_large.py`.
- Both runs completed without errors and covered all languages in the benchmark.

Next steps suggestions:
1. Run ensemble or ROVER across top models (IndicConformer and OmniASR) to explore further WER reduction.
2. Analyze per-language errors or sample transcripts for detailed insights.

Let me know if you'd like me to run ensemble experiments or perform additional analyses.


Ran OmniASR LLM 7B v2 and Seamless M4T v2 large in the isolated `.venv_omni`, generated multilingual transcription dumps + evals, and updated the WER table to include both models.

- OmniASR LLM 7B v2: overall WER 22.3% on the 12‑language 100‑sample bench; outputs at `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/results.jsonl`, eval at `outputs/bench/maya_hf_v2_100/omniasr_llm_7b_v2/eval.json`.
- Seamless M4T v2 large: overall WER 26.5%; outputs at `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/results.jsonl`, eval at `outputs/bench/maya_hf_v2_100/seamless_m4t_v2_large/eval.json`.
- Updated multilingual run list + per‑language table in `results.md`.
- Added reproducible runners: `scripts/run_omniasr_7b_v2.py` and `scripts/run_seamless_m4t_v2_large.py`.

If you want, I can:
1. Build an ensemble (e.g., IndicConformer + OmniASR) and re‑eval WER.
2. Generate a per‑language “best model” summary to guide routing/ensemble logic.


# Context from my IDE setup:

## Open tabs:
- results.md: results.md
- .env: .env
- eval.json: outputs/bench/maya_hf_hin_v2/gemma3n_e2b_vllm/eval.json
- asr.py: maya_transcribe/asr.py
- Prompt.md: Prompt.md

## My request for Codex:

Temperature=0 is necessary but not sufficient for LLM ASR. The fastest wins come from hard constraints plus post‑checks, not just prompt tuning.

What to change:

Tighten the prompt to “verbatim, same script, no paraphrase” and give a safe failure token. Example:
You are an ASR system. Transcribe the audio verbatim in <LANGUAGE> script.
Rules:
- Do not translate, summarize, or paraphrase.
- Do not add or omit words.
- Preserve numbers and casing as spoken.
- If unsure, output [inaudible] for that word.
Output only the transcript.
Constrain decoding harder: greedy (temperature=0, top_p=1, top_k=1 if supported), small repetition_penalty (1.05–1.15), no_repeat_ngram_size=3, and a tighter length cap (e.g., max_tokens = min(int(duration_sec * 5) + 16, 512) instead of 12 tokens/sec). Avoid min_tokens which can force hallucinations.
Add a post‑generation guard: reject or fall back if the output script is wrong or if length ratio is too large. A simple rule like “expected script >= 60% of alphabetic chars AND 0.7x–1.3x length” filters most creative drift.
Use an anchor transcript: run a stable ASR first, then LLM as a proofreader. Accept LLM output only if edit distance is small (e.g., <= 15–20%) and script matches; otherwise keep the anchor. This avoids the “creative rewrite” failure mode.
If the model doesn’t truly support a language/script, don’t force it. Route to a model that supports the script, or transliterate as a separate, explicit step. Prompting won’t fix missing language support.
If you want, I can implement a guard + fallback in pipeline.py and tighten decode limits for the LLM path. Let me know which models you want gated and what thresholds you prefer.

Next steps:

Pick the target model(s) to constrain and whether to add a script/length guard.
Decide the fallback (best ASR model per language or a single default).
Run a small 50‑sample A/B to validate WER impact before full rerun.

Can you do a re-run on votral and gemma with these fixes and update the results section table if and if only results improve, slightly atleast.


**Locating vLLM integration in ASR pipeline**

I'm inspecting asr.py to find existing vLLM-related logic for implementing prompt tightening, decode constraints, and other fixes in the Voxtral and Gemma re-runs.


Output:
Exit code: 0
Wall time: 0 seconds
Output:
from __future__ import annotations

import gc
from collections import OrderedDict
from dataclasses import dataclass
from pathlib import Path
from typing import Any

from maya_transcribe.language import ISO3_TO_WHISPER_LANG, to_whisper_lang

_WHISPER_TO_ISO3: dict[str, str] = {v: k for k, v in ISO3_TO_WHISPER_LANG.items()}

@dataclass(frozen=True)
class ASRSegment:
    start: float
    end: float
    text: str
    avg_logprob: float | None = None
    no_speech_prob: float | None = None
    compression_ratio: float | None = None

@dataclass(frozen=True)
class ASRResult:
    model: str
    text: str
    language: str | None
    language_probability: float | None
    segments: list[ASRSegment]
    meta: dict[str, Any]

class FasterWhisperASR:
    def __init__(
        self,
        model_size_or_path: str = "large-v3",
        device: str | None = None,
        compute_type: str | None = None,
    ) -> None:
        try:
            from faster_whisper import WhisperModel
        except Exception as e:  # pragma: no cover
            raise RuntimeError(
                "faster-whisper is not installed. Install with: pip install -e '.[asr]'"
            ) from e

        if device is None:
            try:
                import torch

                device = "cuda" if torch.cuda.is_available() else "cpu"
            except Exception:
                device = "cpu"

        if compute_type is None:
            compute_type = "float16" if device == "cuda" else "float32"

        self.model_size_or_path = model_size_or_path
        self.device = device
        self.compute_type = compute_type
        self._model = WhisperModel(model_size_or_path, device=device, compute_type=compute_type)

    @property
    def name(self) -> str:
        return f"faster-whisper:{self.model_size_or_path}"

    def transcribe(
        self,
        audio_path: Path,
        language: str | None = None,
        beam_size: int = 5,
        best_of: int = 5,
        temperature: float = 0.0,
        vad_filter: bool = False,
    ) -> ASRResult:
        lang = to_whisper_lang(language)
        # faster-whisper's Assamese token ("as") tends to produce Devanagari output,
        # while the Bengali token ("bn") yields Bengali/Assamese-script output on FLEURS.
        if lang == "as":
            lang = "bn"
        if lang is not None:
            # faster-whisper supports a subset of Whisper's language tokens.
            # Avoid hard failures (e.g., Odia "or") by falling back to auto-detect.
            try:
                from faster_whisper.tokenizer import _LANGUAGE_CODES  # type: ignore

                if lang not in _LANGUAGE_CODES:
                    lang = None
            except Exception:
                pass

        segments_iter, info = self._model.transcribe(
            str(audio_path),
            language=lang,
            beam_size=beam_size,
            best_of=best_of,
            temperature=temperature,
            vad_filter=vad_filter,
        )

        segments: list[ASRSegment] = []
        texts: list[str] = []
        for s in segments_iter:
            texts.append(s.text)
            segments.append(
                ASRSegment(
                    start=float(s.start),
                    end=float(s.end),
                    text=str(s.text),
                    avg_logprob=getattr(s, "avg_logprob", None),
                    no_speech_prob=getattr(s, "no_speech_prob", None),
                    compression_ratio=getattr(s, "compression_ratio", None),
                )
            )

        return ASRResult(
            model=self.name,
            text="".join(texts).strip(),
            language=getattr(info, "language", None),
            language_probability=getattr(info, "language_probability", None),
            segments=segments,
            meta={
                "device": self.device,
                "compute_type": self.compute_type,
                "beam_size": beam_size,
                "best_of": best_of,
                "temperature": temperature,
                "vad_filter": vad_filter,
            },
        )

class TransformersWhisperASR:
    """
    Whisper-family ASR using HuggingFace Transformers (useful for fine-tuned checkpoints like IndicWhisper).
    """

    def __init__(
        self,
        model_id: str,
        device: str | None = None,
        dtype: str | None = None,
    ) -> None:
        try:
            import torch
            from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor
        except Exception as e:  # pragma: no cover
            raise RuntimeError(
                "TransformersWhisperASR requires the optional dependencies: torch + transformers. "
                "Install with: pip install -e '.[torch]'"
            ) from e

        if device is None:
            device = "cuda" if torch.cuda.is_available() else "cpu"
        if dtype is None:
            dtype = "float16" if (device == "cuda") else "float32"

        torch_dtype = torch.float16 if dtype == "float16" else torch.float32

        self.model_id = model_id
        self.device = device
        self.dtype = dtype
        self._torch = torch
        self._processor = AutoProcessor.from_pretrained(model_id)
        self._model = AutoModelForSpeechSeq2Seq.from_pretrained(model_id, torch_dtype=torch_dtype).to(device)
        self._model.eval()

    @property
    def name(self) -> str:
        return f"transformers:{self.model_id}"

    def close(self) -> None:
        """
        Best-effort release of GPU memory for large checkpoints.
        """
        model = getattr(self, "_model", None)
        if model is not None:
            try:
                del self._model
            except Exception:
                pass
        proc = getattr(self, "_processor", None)
        if proc is not None:
            try:
                del self._processor
            except Exception:
                pass

        try:
            gc.collect()
        except Exception:
            pass

        try:
            if self.device == "cuda" and hasattr(self, "_torch"):
                self._torch.cuda.empty_cache()
        except Exception:
            pass

    def transcribe(
        self,
        audio_path: Path,
        language: str | None = None,
        max_new_tokens: int = 256,
        num_beams: int = 5,
    ) -> ASRResult:
        from maya_transcribe.audio import decode_pcm16

        wav, sr = decode_pcm16(audio_path, sample_rate=16000, mono=True)
        if wav.size == 0:
            return ASRResult(
                model=self.name,
                text="",
                language=language,
                language_probability=None,
                segments=[],
                meta={"max_new_tokens": max_new_tokens, "num_beams": num_beams},
            )

        inputs = self._processor(wav, sampling_rate=sr, return_tensors="pt")
        input_features = inputs.get("input_features")
        if input_features is None:
            raise RuntimeError("Processor did not return input_features")
        input_features = input_features.to(self.device)
        model_dtype = getattr(self._model, "dtype", None)
        if model_dtype is not None:
            input_features = input_features.to(dtype=model_dtype)

        forced_decoder_ids = None
        whisper_lang = to_whisper_lang(language)
        if whisper_lang:
            get_ids = getattr(self._processor, "get_decoder_prompt_ids", None)
            if callable(get_ids):
                try:
                    forced_decoder_ids = get_ids(language=whisper_lang, task="transcribe")
                except (ValueError, KeyError):
                    forced_decoder_ids = None


**Searching for vLLM class**


rg -n "vllm|VLLM" maya_transcribe/asr.py


Output:
Exit code: 127
Wall time: 0 seconds
Output:
/bin/bash: line 1: rg: command not found


grep -n "vllm" -n maya_transcribe/asr.py


Output:
Exit code: 0
Wall time: 0 seconds
Output:
373:            from vllm import LLM, SamplingParams
374:            from vllm.model_executor.model_loader import get_model_cls
377:                "vLLM transcription requires vllm[audio]. Install with: uv pip install -U \"vllm[audio]\" --system"
455:        return f"vllm:{self.model_id}"
466:        from vllm.tokenizers import cached_tokenizer_from_config


sed -n '320,560p' maya_transcribe/asr.py


Output:
Exit code: 0
Wall time: 0 seconds
Output:
        self,
        audio_path: Path,
        *,
        language: str | None = None,
        max_new_tokens: int = 256,
        num_beams: int = 5,
    ) -> ASRResult | None:
        model_id = self._get_model_id(language)
        if not model_id:
            return None

        backend = self._cache.get(model_id)
        if backend is None:
            backend = TransformersWhisperASR(model_id=model_id, device=self.device, dtype=self.dtype)
            self._cache[model_id] = backend
        else:
            # Refresh LRU ordering.
            self._cache.move_to_end(model_id, last=True)

        while len(self._cache) > self.max_loaded_models:
            _, evicted = self._cache.popitem(last=False)
            try:
                evicted.close()
            except Exception:
                pass

        return backend.transcribe(
            audio_path=audio_path,
            language=language,
            max_new_tokens=max_new_tokens,
            num_beams=num_beams,
        )

class VllmTranscriptionASR:
    """
    vLLM-powered speech-to-text backend for multimodal audio models (e.g., Voxtral, Gemma3n).
    """

    def __init__(
        self,
        model_id: str,
        *,
        dtype: str | None = None,
        tensor_parallel_size: int = 1,
        trust_remote_code: bool = True,
        max_tokens: int | None = None,
        gpu_memory_utilization: float | None = None,
        max_model_len: int | None = None,
        limit_mm_per_prompt: dict[str, int | dict[str, int]] | None = None,
    ) -> None:
        try:
            import torch
            from vllm import LLM, SamplingParams
            from vllm.model_executor.model_loader import get_model_cls
        except Exception as e:  # pragma: no cover
            raise RuntimeError(
                "vLLM transcription requires vllm[audio]. Install with: uv pip install -U \"vllm[audio]\" --system"
            ) from e

        self.model_id = model_id
        self.dtype = dtype
        self.tensor_parallel_size = max(1, int(tensor_parallel_size))
        self.trust_remote_code = bool(trust_remote_code)

        try:
            from mistral_common.tokens.tokenizers.audio import AudioEncoder  # type: ignore
            import inspect

            sig = inspect.signature(AudioEncoder.pad)
            needs_default = "is_online_streaming" in sig.parameters and sig.parameters["is_online_streaming"].default is inspect._empty
            if needs_default:
                orig_pad = AudioEncoder.pad

                def _pad(self, audio_array, sampling_rate, is_online_streaming=False):
                    return orig_pad(self, audio_array, sampling_rate, is_online_streaming)

                AudioEncoder.pad = _pad  # type: ignore[assignment]
        except Exception:
            pass

        if limit_mm_per_prompt is None and "gemma-3n" in model_id.lower():
            limit_mm_per_prompt = {"image": 0, "audio": 1}

        self._sampling_params_cls = SamplingParams
        llm_kwargs = {
            "model": model_id,
            "tensor_parallel_size": self.tensor_parallel_size,
            "trust_remote_code": self.trust_remote_code,
        }
        llm_kwargs["dtype"] = dtype if dtype is not None else "auto"
        if gpu_memory_utilization is not None:
            llm_kwargs["gpu_memory_utilization"] = float(gpu_memory_utilization)
        if max_model_len is not None:
            llm_kwargs["max_model_len"] = int(max_model_len)
        if limit_mm_per_prompt is not None:
            llm_kwargs["limit_mm_per_prompt"] = limit_mm_per_prompt
        self._llm = LLM(**llm_kwargs)
        self._model_config = self._llm.model_config
        self._model_cls = get_model_cls(self._model_config)
        self._is_voxtral = "voxtral" in self._model_cls.__name__.lower() or "voxtral" in model_id.lower()
        self._is_gemma3n = "gemma3n" in self._model_cls.__name__.lower() or "gemma-3n" in model_id.lower()
        if not bool(getattr(self._model_cls, "supports_transcription", False)):
            raise RuntimeError(f"Model does not support transcription: {model_id}")

        self._stt_config = self._model_cls.get_speech_to_text_config(self._model_config, "transcribe")

        max_model_len = getattr(self._model_config, "max_model_len", None)
        if max_model_len is None:
            max_model_len = 1024
        self._max_model_len = int(max_model_len)
        self._fixed_max_tokens = int(max_tokens) if max_tokens is not None else None
        if self._fixed_max_tokens is not None:
            self._fixed_max_tokens = min(self._fixed_max_tokens, self._max_model_len)

        self._tokens_per_second = 12
        self._max_tokens_cap = min(1024, self._max_model_len)

        self._stop_token_ids: list[int] | None = None
        if "gemma-3n" in model_id.lower():
            try:
                tok = self._llm.get_tokenizer()
                end_id = tok.convert_tokens_to_ids("<end_of_turn>")
                if isinstance(end_id, int) and end_id >= 0:
                    self._stop_token_ids = [end_id]
            except Exception:
                self._stop_token_ids = None

        try:
            self._torch = torch
        except Exception:
            self._torch = None

    @property
    def name(self) -> str:
        return f"vllm:{self.model_id}"

    @property
    def supports_proofread(self) -> bool:
        return self._is_voxtral

    def _build_voxtral_chat_prompt(self, audio: "np.ndarray", sample_rate: int, prompt_text: str) -> dict[str, Any]:
        from mistral_common.protocol.instruct.chunk import AudioChunk, RawAudio, TextChunk
        from mistral_common.protocol.instruct.messages import UserMessage
        from mistral_common.protocol.instruct.request import ChatCompletionRequest
        from mistral_common.tokens.tokenizers.audio import Audio
        from vllm.tokenizers import cached_tokenizer_from_config

        tokenizer = cached_tokenizer_from_config(self._model_config)
        if tokenizer is None:
            raise RuntimeError("Tokenizer unavailable for Voxtral prompt.")

        audio_item = Audio(audio, sample_rate, format="wav")
        audio_chunk = AudioChunk(input_audio=RawAudio.from_audio(audio_item))
        request = ChatCompletionRequest(messages=[UserMessage(content=[TextChunk(text=prompt_text), audio_chunk])])
        tokenized = tokenizer.mistral.encode_chat_completion(request)
        audio_array = tokenized.audios[0].audio_array if tokenized.audios else audio_item.audio_array

        return {
            "prompt_token_ids": tokenized.tokens,
            "multi_modal_data": {"audio": (audio_array, sample_rate)},
        }

    def _render_prompt(self, template: str, lang: str | None) -> str:
        if not template:
            return template
        lang_name = None
        if lang:
            try:
                lang_name = self._model_cls.supported_languages.get(lang)
            except Exception:
                lang_name = None
        if not lang_name:
            lang_name = lang or "unknown"
        return template.replace("<language>", lang_name)

    def _build_gemma_prompt(self, audio: "np.ndarray", sample_rate: int, prompt_text: str) -> dict[str, Any]:
        prompt = "<start_of_turn>user\n"
        prompt += prompt_text.strip()
        prompt += "\n\n<audio_soft_token><end_of_turn>\n<start_of_turn>model\n"
        return {"multi_modal_data": {"audio": (audio, sample_rate)}, "prompt": prompt}

    def _strip_prompt_output(self, text: str) -> str:
        cleaned = str(text or "").strip()
        if not cleaned:
            return ""
        lines = [ln.strip() for ln in cleaned.splitlines() if ln.strip()]
        if not lines:
            return ""
        for i, line in enumerate(lines):
            low = line.lower()
            if low.startswith("output 1"):
                if ":" in line:
                    after = line.split(":", 1)[1].strip()
                    if after and after.lower() != "transcript":
                        return after
                    if after.lower() == "transcript" and i + 1 < len(lines):
                        return lines[i + 1]
                if i + 1 < len(lines):
                    return lines[i + 1]
        return lines[0]

    def transcribe(
        self,
        audio_path: Path,
        language: str | None = None,
        prompt: str | None = None,
        mode: str = "transcribe",
    ) -> ASRResult:
        from maya_transcribe.audio import decode_pcm16

        sr = int(getattr(self._stt_config, "sample_rate", 16000))
        wav, _ = decode_pcm16(audio_path, sample_rate=sr, mono=True)
        if wav.size == 0:
            return ASRResult(
                model=self.name,
                text="",
                language=language,
                language_probability=None,
                segments=[],
                meta={"dtype": self.dtype, "tensor_parallel_size": self.tensor_parallel_size},
            )

        lang = to_whisper_lang(language)
        if lang:
            try:
                lang = self._model_cls.validate_language(lang)
            except Exception:
                lang = None

        prompt_text = prompt or ""
        if mode == "proofread":
            if not self.supports_proofread:
                raise RuntimeError("Proofread mode requires a Voxtral model.")
            prompt_payload = self._build_voxtral_chat_prompt(wav, sr, prompt_text)
        elif prompt_text and self._is_voxtral:
            prompt_payload = self._build_voxtral_chat_prompt(wav, sr, self._render_prompt(prompt_text, lang))
        elif prompt_text and self._is_gemma3n:
            prompt_payload = self._build_gemma_prompt(wav, sr, self._render_prompt(prompt_text, lang))
        else:
            prompt_payload = self._model_cls.get_generation_prompt(


sed -n '560,920p' maya_transcribe/asr.py