{"id":3096,"date":"2026-09-24T13:09:17","date_gmt":"2026-09-24T04:09:17","guid":{"rendered":"https:\/\/localmodelwatch.tsuchitsuchi.com\/2026\/09\/24\/edge0-audio8-asr-infinite-2\/"},"modified":"2026-11-08T19:08:40","modified_gmt":"2026-11-08T10:08:40","slug":"edge0-audio8-asr-infinite-2","status":"publish","type":"post","link":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/2026\/09\/24\/edge0-audio8-asr-infinite-2\/","title":{"rendered":"Audio8-ASR-Infinite Speech Recognition Model: 12GB+ VRAM, File List"},"content":{"rendered":"<p><em>Sample outputs are available on the <a href=\"https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite\">model card<\/a>.<\/em><\/p>\n<p><!-- lmw:facts --><\/p>\n<h2>At a Glance<\/h2>\n<div class=\"lmw-table-scroll\" tabindex=\"0\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;\">\n<table style=\"width:max-content;min-width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th>Item<\/th>\n<th>Value<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Repository<\/td>\n<td><a href=\"https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite\">Edge0\/Audio8-ASR-Infinite<\/a><\/td>\n<\/tr>\n<tr>\n<td>Published<\/td>\n<td>2026-09-22<\/td>\n<\/tr>\n<tr>\n<td>License<\/td>\n<td>apache-2.0<\/td>\n<\/tr>\n<tr>\n<td>Formats<\/td>\n<td><a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/format-safetensors-en\/\">safetensors<\/a><\/td>\n<\/tr>\n<tr>\n<td>Source type<\/td>\n<td>Primary source (the publisher itself)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><em>Values determined by this site&#8217;s code when the information was collected. Dates are JST.<\/em><\/p>\n<p><!-- \/lmw:facts --><\/p>\n<h2>Overview<\/h2>\n<p>Edge0 has released Audio8-ASR-Infinite, a native streaming speech recognition model designed for maximum responsiveness. This model is an Automatic Speech Recognition (ASR) model that converts audio input into text in real time, supporting bilingual Chinese and English.<\/p>\n<h2>Specifications<\/h2>\n<ul>\n<li>Architecture: Inherits Voxtral realtime audio architecture and DSM-style streaming<\/li>\n<li>Audio tower: 32 layers, hidden 1280, 128 mel bins, sliding window 750 &#8211; Text decoder: 36 layers, hidden 2048, 16 query heads \/ 2 KV heads &#8211; Projector: max frame len 8 \u2192 projection size 10240, gelu<\/li>\n<li>Output specification: Chinese and English text<\/li>\n<li>Streaming settings:<\/li>\n<li>Selectable audio clock: 80ms \/ 120ms \/ 160ms &#8211; Configurable transcription delay (target_delay_ms): 240ms to 560ms (varies by clock setting)<\/li>\n<li>Recommended operating conditions (optimized points):<\/li>\n<li>At 80ms clock: frame_len 4, target_delay_ms 240 \/ 320 \/ 480 \/ 560 &#8211; At 120ms clock: frame_len 6, target_delay_ms 240 \/ 480 &#8211; At 160ms clock: frame_len 8, target_delay_ms 320 \/ 480<\/li>\n<li>License: Apache 2.0<\/li>\n<\/ul>\n<h2>Performance<\/h2>\n<p>Evaluation results at 480 ms Delay, 80ms frame length (Greedy decode, EOS suppressed) are as follows:<\/p>\n<div class=\"lmw-table-scroll\" tabindex=\"0\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;\">\n<p class=\"lmw-table-hint\" style=\"margin:0 0 4px;font-size:0.85em;opacity:0.7;\">\u2192 Scroll horizontally to see all columns<\/p>\n<table style=\"width:max-content;min-width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th>test set<\/th>\n<th>metric<\/th>\n<th>Audio8 ASR Infinite<\/th>\n<th>Voxtral-Mini-4B-Realtime-2602<\/th>\n<th>nemotron-3.5-asr-streaming-0.6b<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>aishell1\/test<\/td>\n<td>CER<\/td>\n<td><strong>1.750<\/strong><\/td>\n<td>16.795<\/td>\n<td>12.927@560ms<\/td>\n<\/tr>\n<tr>\n<td>aishell4\/test<\/td>\n<td>CER<\/td>\n<td><strong>2.893<\/strong><\/td>\n<td>16.456<\/td>\n<td>14.677@560ms<\/td>\n<\/tr>\n<tr>\n<td>librispeech test.clean<\/td>\n<td>WER<\/td>\n<td>3.042<\/td>\n<td><strong>2.210<\/strong><\/td>\n<td>3.353@560ms<\/td>\n<\/tr>\n<tr>\n<td>librispeech test.other<\/td>\n<td>WER<\/td>\n<td>6.808<\/td>\n<td><strong>5.552<\/strong><\/td>\n<td>7.140@560ms<\/td>\n<\/tr>\n<tr>\n<td><strong>average<\/strong><\/td>\n<td><\/td>\n<td><strong>3.623<\/strong><\/td>\n<td>10.253 (2 sets)<\/td>\n<td>9.524<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Audio8 ASR Infinite records significantly lower (better) CER (Character Error Rate) figures on aishell1\/test and aishell4\/test compared to the comparison models. On the other hand, for WER (Word Error Rate) on librispeech test.clean and test.other, it trails Voxtral-Mini-4B-Realtime-2602. In terms of the overall average, Audio8 ASR Infinite shows the best score.<\/p>\n<h2>Strengths and Use Cases<\/h2>\n<p>This model specializes in real-time speech transcription with top priority on responsiveness. It adopts a native streaming architecture, achieving extremely high response by decoding 12.5 times per second. Furthermore, by using Rolling KV Cache, it enables 24\/7 continuous operation (unlimited-length transcription) while keeping memory usage and latency constant.<\/p>\n<p>Main use cases and features include:<\/p>\n<ul>\n<li><strong>Bilingual Support<\/strong>: Supports Chinese and English transcription.<\/li>\n<li><strong>Flexible Streaming Control<\/strong>: Allows selection of audio clock (80\/120\/160 ms) and transcription delay (target_delay_ms), enabling adjustment of the balance between recognition granularity and resource cost.<\/li>\n<li><strong>Semantic VAD<\/strong>: Capable of distinguishing between thinking pauses, stuttering, and actual speech endings, which is difficult with conventional acoustic VAD (Voice Activity Detection).<\/li>\n<li><strong>Use Cases<\/strong>: Real-time subtitle generation, always-on voice interfaces, etc.<\/li>\n<\/ul>\n<p>It is currently a preview release providing base streaming transcription functionality. The roadmap lists implementing frame-level semantic recognition features using the same frame grid and acoustic forward path in the future.<\/p>\n<p><!-- lmw:hardware --><\/p>\n<h2>Hardware Requirements<\/h2>\n<p><strong>Estimated requirements (calculated by Local Model Watch)<\/strong> \u2014 4.1B parameters<\/p>\n<div class=\"lmw-table-scroll\" tabindex=\"0\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;\">\n<table style=\"width:max-content;min-width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th>Your VRAM<\/th>\n<th>Quantization<\/th>\n<th>File size<\/th>\n<th>Est. memory needed<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>12GB (RTX 4070 \/ 3060 12GB, etc.)<\/td>\n<td>BF16<\/td>\n<td>7.6GB<\/td>\n<td>9.1GB<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>Inference engine support<\/strong> (architecture name matched against each project&#8217;s own model registry in its source code, checked 2026-11-08): llama.cpp: not registered, vLLM: not registered, MLX (mlx-lm): not registered. &#8220;Not registered&#8221; means the name is absent from that registry today, not that the model cannot run.<\/p>\n<p><em>Memory estimates add a 20% runtime overhead (KV cache, etc.) to the actual size of the distributed files. Actual usage varies with context length, batch size and inference engine. These figures are computed by this site from file sizes, not published by the model&#8217;s authors. Compare with other models in our <a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/vram-guide-en\/\">VRAM quick reference<\/a>. What the quantization names mean: <a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/glossary-quantization-en\/\">glossary<\/a>.<\/em><\/p>\n<p><!-- \/lmw:hardware --><\/p>\n<p><!-- lmw:runnability --><\/p>\n<h2>Can You Run It Locally?<\/h2>\n<p>The publisher distributes this model as safetensors.<\/p>\n<p><strong>License \u2014 <code>apache-2.0<\/code> (Commercial use allowed):<\/strong> Permits commercial use, modification and redistribution. Redistribution requires including the license and stating changes; includes a patent grant.<\/p>\n<p><em>Compiled by this site&#8217;s code from the published formats and the license field. License summaries are not legal advice \u2014 check the publisher&#8217;s original terms before relying on them.<\/em><\/p>\n<p><!-- \/lmw:runnability --><\/p>\n<p><!-- lmw:lab --><\/p>\n<h2>Our Own Measurements<\/h2>\n<p>Values we measured ourselves \u2014 not figures copied from the model card. We read this model&#8217;s files on our own server (no GPU) and ran the model on a rented cloud GPU (conditions below). How we measure, and the results for every model: <a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/observations-en\/\">Our Measurements<\/a>.<\/p>\n<h3>Transcribing English Audio We Made (Cloud GPU)<\/h3>\n<p>We ran <a href=\"https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite\">Edge0\/Audio8-ASR-Infinite<\/a> in BF16 with the publisher&#8217;s own streaming decoder (<a href=\"https:\/\/github.com\/Edge0-AI\/Audio8-ASR-Infinite\/tree\/c8ba8eea829be0339e8d7757f8ca52dac06e1e32\">Edge0-AI\/Audio8-ASR-Infinite<\/a>, commit <code>c8ba8ee<\/code>) on a rented cloud GPU. That code ran only inside a cloud container with its network cut off. The audio is not a recording from elsewhere: we read three fixed English sentences with a text-to-speech voice (en_US-ljspeech-medium, MIT(\u97f3\u58f0\u30e2\u30c7\u30eb\u306e\u914d\u5e03)\u30fb\u5b66\u7fd2\u30c7\u30fc\u30bf LJ Speech \u306f\u30d1\u30d6\u30ea\u30c3\u30af\u30c9\u30e1\u30a4\u30f3) and let the model transcribe each clip once. Nothing was selected or edited; these are the first outputs, misrecognitions included. This model supports Chinese and English only, so we tested English only and make no claim about Japanese.<\/p>\n<p>Input audio (4.7 s), the sentence we read out:<\/p>\n<blockquote>\n<p>It had been raining since the morning, but it gradually cleared up in the afternoon.<\/p>\n<\/blockquote>\n<p><audio controls preload=\"none\" src=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/wp-content\/uploads\/2026\/10\/lmw-lab-asr-weather-v1.wav\"><\/audio><\/p>\n<p>The model&#8217;s transcript, verbatim (word error rate 0.0%: 0 errors in 15 words; transcribed in 6.49 s):<\/p>\n<pre><code class=\"language-text\">It had been raining since the morning, but it gradually cleared up in the afternoon.\n<\/code><\/pre>\n<p>Input audio (4.7 s), the sentence we read out:<\/p>\n<blockquote>\n<p>The next meeting will be held from 2 p.m. on March 15 in meeting room B.<\/p>\n<\/blockquote>\n<p><audio controls preload=\"none\" src=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/wp-content\/uploads\/2026\/10\/lmw-lab-asr-numbers-v1.wav\"><\/audio><\/p>\n<p>The model&#8217;s transcript, verbatim (word error rate 0.0%: 0 errors in 16 words; transcribed in 6.5 s):<\/p>\n<pre><code class=\"language-text\">The next meeting will be held from 2 p.m. on March 15 in Meeting Room B.\n<\/code><\/pre>\n<p>Input audio (3.61 s), the sentence we read out:<\/p>\n<blockquote>\n<p>Oh, it&#8217;s already finished? That was much quicker than I expected.<\/p>\n<\/blockquote>\n<p><audio controls preload=\"none\" src=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/wp-content\/uploads\/2026\/10\/lmw-lab-asr-surprise-v1.wav\"><\/audio><\/p>\n<p>The model&#8217;s transcript, verbatim (word error rate 0.0%: 0 errors in 11 words; transcribed in 5.36 s):<\/p>\n<pre><code class=\"language-text\">Oh, it's already finished. That was much quicker than I expected.\n<\/code><\/pre>\n<div class=\"lmw-table-scroll\" tabindex=\"0\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;\">\n<table style=\"width:max-content;min-width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th>Item<\/th>\n<th>Result<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Word error rate over all three clips<\/td>\n<td>0.0% (0 errors in 42 words)<\/td>\n<\/tr>\n<tr>\n<td>VRAM right after loading the weights (BF16)<\/td>\n<td>7.7GB<\/td>\n<\/tr>\n<tr>\n<td>Peak VRAM while transcribing<\/td>\n<td>7.8GB<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Conditions: NVIDIA L4 (VRAM 22GB) on Modal, transformers 5.13.0, PyTorch 2.13.0+cu130, weights at revision <code>7476824bc2<\/code>, BF16, greedy decoding with a 80 ms clock and 480 ms delay, measured 2026-10-01 (JST).<\/p>\n<p>The word error rate is counted by our code after lowercasing and removing punctuation; numerals are not converted, so &#8220;2 p.m.&#8221; and &#8220;two p.m.&#8221; count as different words. Three short clips of one synthetic voice say nothing about accuracy on real recordings, accents or noise. The decoder here replays the audio as a stream in one pass and does not measure real-time latency.<\/p>\n<h4>Setup, Download and Run Steps (What We Actually Ran)<\/h4>\n<p>We split the work into two containers on Modal, both built from the Debian (slim) image with Python 3.12. The downloading container fetches the weights from Hugging Face and the publisher&#8217;s decoding code from GitHub (a pinned commit) and never runs either; the container that runs the code has no network access. These are the packages we installed:<\/p>\n<pre><code class=\"language-bash\"># 1. Environment for downloading (no GPU)\npython -m pip install huggingface_hub\n\n# 2. Environment for running (GPU, network blocked)\npython -m pip install 'torch&gt;=2.13,&lt;2.14' 'transformers==5.13.0' 'numpy&gt;=2.1' 'safetensors&gt;=0.8' 'accelerate'\n<\/code><\/pre>\n<p>We then called <code>download(job)<\/code> in the first container and <code>run(job)<\/code> in the second one from the script below (<code>asr_remote.py<\/code>, written by us; full text). Files go under <code>\/models\/&lt;dir&gt;<\/code>:<\/p>\n<pre><code class=\"language-python\">&quot;&quot;&quot;\nModal \u306e\u30b3\u30f3\u30c6\u30ca\u306e\u4e2d\u3067\u52d5\u304f\u3001\u97f3\u58f0\u8a8d\u8b58\u30e2\u30c7\u30eb\u306e\u5b9f\u6e2c(2026-09-30\u3001\u30e6\u30fc\u30b6\u30fc\u306e\u5224\u65ad)\u3002lmw\/lab\/gpu_modal.py \u306e\nasr_download \/ asr_run \u304b\u3089\u547c\u3070\u308c\u308b\u3002**\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u3060\u3051\u3092\u5148\u982d\u3067\u8aad\u307f**\u3001huggingface_hub\u30fbtorch\u30fbtransformers \u306f\n\u5404\u95a2\u6570\u306e\u4e2d\u3067\u8aad\u3080(\u30b3\u30f3\u30c6\u30ca\u3054\u3068\u306b\u5165\u3063\u3066\u3044\u308b\u3082\u306e\u304c\u9055\u3046)\u3002\n\n\u30102\u3064\u306e\u30b3\u30f3\u30c6\u30ca\u306b\u5206\u3051\u308b\u3011(lmw\/lab\/remote_code_remote.py \u3068\u540c\u3058)\n- download: GPU \u306e\u7121\u3044\u30b3\u30f3\u30c6\u30ca\u30fb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3042\u308a\u3002Hugging Face \u304b\u3089\u91cd\u307f\u3068\u8a2d\u5b9a\u3092\u3001GitHub \u304b\u3089\u914d\u5e03\u5143\u306e\n  \u30c7\u30b3\u30fc\u30c9\u51e6\u7406(audio8_asr_infinite \u306e Python \u30d5\u30a1\u30a4\u30eb)\u3092 **\u30b3\u30df\u30c3\u30c8\u3092\u56fa\u5b9a\u3057\u3066** \u843d\u3068\u3059\u3060\u3051\u3067\u3001\u3069\u3061\u3089\u3082\u5b9f\u884c\u3057\u306a\u3044\u3002\n  \u91cd\u307f\u306f safetensors \u3060\u3051\u3002GitHub \u306e\u30d5\u30a1\u30a4\u30eb\u306f\u3001\u6c7a\u307e\u3063\u305f\u30d5\u30a9\u30eb\u30c0\u306e .py \u3060\u3051\u3092\u901a\u5e38\u306e\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u53d6\u308a\u51fa\u3059\u3002\n- run: GPU \u306e\u30b3\u30f3\u30c6\u30ca\u30fb**\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u906e\u65ad**\u30fbModal \u306e\u6a5f\u80fd\u3082\u4f7f\u3048\u306a\u3044\u30fbVolume \u306f\u8aad\u307f\u53d6\u308a\u5c02\u7528\u3002\n  \u3053\u3053\u3067\u3060\u3051\u914d\u5e03\u5143\u306e\u30c7\u30b3\u30fc\u30c9\u51e6\u7406\u3092\u5b9f\u884c\u3059\u308b(Hugging Face \u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u30b3\u30fc\u30c9\u3092\u8aad\u307f\u8fbc\u3080\u8a2d\u5b9a\u306f\u4f7f\u308f\u306a\u3044\u3002\u30e2\u30c7\u30eb\u306e\u5b9a\u7fa9\u3082\u30c7\u30b3\u30fc\u30c9\u306e\u51e6\u7406\u3082\u3001\n  \u843d\u3068\u3057\u3066\u304a\u3044\u305f\u56fa\u5b9a\u30b3\u30df\u30c3\u30c8\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u304b\u3089\u8aad\u3080\u3002Hugging Face \u306e\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u30e2\u30c7\u30eb\u5b9a\u7fa9\u3068\u30d5\u30a1\u30a4\u30eb\u304c\u4e00\u81f4\u3059\u308b\u3053\u3068\u306f\u78ba\u8a8d\u6e08\u307f)\u3002\n\n\u8a18\u4e8b\u57f7\u7b46\u7528\u306e LLM \u306f\u547c\u3070\u306a\u3044\u3002\u6587\u5b57\u8d77\u3053\u3057\u306e\u8aa4\u308a\u306e\u6570\u3048\u65b9\u306f\u30db\u30b9\u30c8\u5074\u306e\u30b3\u30fc\u30c9(lmw\/lab\/asr.py)\u304c\u6c7a\u3081\u308b\u3002\n&quot;&quot;&quot;\nimport base64\nimport hashlib\nimport io\nimport json\nimport os\nimport platform\nimport posixpath\nimport tarfile\nimport time\nimport urllib.request\nimport wave\nfrom dataclasses import dataclass\nfrom datetime import datetime, timezone\n\nMOUNT = &quot;\/models&quot;\nPYTHON_VERSION = &quot;3.12&quot;\nDOWNLOAD_PACKAGES = (&quot;huggingface_hub&quot;,)\n# \u914d\u5e03\u5143\u306e pyproject.toml \u306e\u4f9d\u5b58(torch&gt;=2.13,&lt;2.14\u30fbtransformers==5.13.0\u30fbnumpy&gt;=2.1\u30fbsafetensors&gt;=0.8)\u306b\u5408\u308f\u305b\u308b\nRUN_PACKAGES = (&quot;torch&gt;=2.13,&lt;2.14&quot;, &quot;transformers==5.13.0&quot;, &quot;numpy&gt;=2.1&quot;, &quot;safetensors&gt;=0.8&quot;, &quot;accelerate&quot;)\n# GitHub \u304b\u3089\u53d6\u308a\u51fa\u3059\u306e\u306f\u3001\u3053\u306e\u30d5\u30a9\u30eb\u30c0\u306e .py \u3060\u3051(\u30e2\u30c7\u30eb\u30fb\u30c7\u30b3\u30fc\u30c9\u30fb\u8a2d\u5b9a\u3002vLLM \u7528\u306e\u30b5\u30fc\u30d0\u30fc\u3084\u4f8b\u306f\u53d6\u3089\u306a\u3044)\nCODE_PACKAGE = &quot;audio8_asr_infinite&quot;\nCODE_SKIP_DIRS = (&quot;vllm_serve&quot;, &quot;examples&quot;)\n_MAX_CODE_BYTES = 2 * 1024 * 1024\n_MAX_TARBALL_BYTES = 64 * 1024 * 1024\n\ndef installed_packages() -&gt; list[str]:\n    from importlib import metadata\n    seen = {}\n    for dist in metadata.distributions():\n        name = dist.metadata[&quot;Name&quot;]\n        if name and name.lower() not in seen:\n            seen[name.lower()] = f&quot;{name}=={dist.version}&quot;\n    return sorted(seen.values(), key=str.lower)\n\ndef _log(t0: float, message: str) -&gt; None:\n    print(f&quot;[asr {time.time() - t0:6.0f}s] {message}&quot;, flush=True)\n\ndef extract_code(tar_bytes: bytes, target: str) -&gt; dict[str, str]:\n    &quot;&quot;&quot;\n    GitHub \u306e\u30b3\u30df\u30c3\u30c8\u306e tar.gz \u304b\u3089\u3001CODE_PACKAGE \u306e .py \u3060\u3051\u3092\u901a\u5e38\u306e\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u53d6\u308a\u51fa\u3059(\u30ea\u30f3\u30af\u30fb\u30c7\u30d0\u30a4\u30b9\u306f\n    \u7121\u8996\u3059\u308b\u3002\u30d1\u30b9\u306b .. \u3084\u7d76\u5bfe\u30d1\u30b9\u304c\u3042\u308c\u3070\u65ad\u308b)\u3002\u623b\u308a\u5024: {\u30d1\u30c3\u30b1\u30fc\u30b8\u304b\u3089\u306e\u76f8\u5bfe\u30d1\u30b9: sha256}\u3002\n    &quot;&quot;&quot;\n    written: dict[str, str] = {}\n    with tarfile.open(fileobj=io.BytesIO(tar_bytes), mode=&quot;r:gz&quot;) as tar:\n        for member in tar.getmembers():\n            if not member.isfile():\n                continue\n            parts = member.name.split(&quot;\/&quot;)[1:]  # \u5148\u982d\u306f &lt;\u30ea\u30dd\u30b8\u30c8\u30ea&gt;-&lt;\u30b3\u30df\u30c3\u30c8&gt;\/\n            if not parts or parts[0] != CODE_PACKAGE or not member.name.endswith(&quot;.py&quot;):\n                continue\n            rel = posixpath.join(*parts)\n            if &quot;..&quot; in parts or posixpath.isabs(rel) or any(p in CODE_SKIP_DIRS for p in parts[1:-1]):\n                continue\n            if member.size &gt; _MAX_CODE_BYTES:\n                raise ValueError(f&quot;\u5927\u304d\u3059\u304e\u308b\u30d5\u30a1\u30a4\u30eb\u3067\u3059: {rel}&quot;)\n            raw = tar.extractfile(member).read()\n            dest = os.path.join(target, *parts)\n            os.makedirs(os.path.dirname(dest), exist_ok=True)\n            with open(dest, &quot;wb&quot;) as f:\n                f.write(raw)\n            written[posixpath.join(*parts[1:])] = hashlib.sha256(raw).hexdigest()\n    return written\n\ndef download(job: dict) -&gt; dict:\n    &quot;&quot;&quot;\n    job: {&quot;repo&quot;, &quot;revision&quot;, &quot;files&quot;, &quot;dir&quot;, &quot;code&quot;: {&quot;repo&quot;, &quot;commit&quot;}}\u3002\n    \u623b\u308a\u5024: {&quot;bytes&quot;, &quot;seconds&quot;, &quot;packages&quot;, &quot;code_files&quot;}\u3002\n    &quot;&quot;&quot;\n    from huggingface_hub import hf_hub_download\n    t0 = time.time()\n    base = os.path.join(MOUNT, job[&quot;dir&quot;])\n    model_dir = os.path.join(base, &quot;model&quot;)\n    os.makedirs(model_dir, exist_ok=True)\n    total = 0\n    for name in job[&quot;files&quot;]:\n        path = hf_hub_download(job[&quot;repo&quot;], name, revision=job[&quot;revision&quot;], local_dir=model_dir)\n        total += os.path.getsize(path)\n    code = job[&quot;code&quot;]\n    url = f&quot;https:\/\/codeload.github.com\/{code['repo']}\/tar.gz\/{code['commit']}&quot;\n    with urllib.request.urlopen(url, timeout=300) as r:\n        tar_bytes = r.read(_MAX_TARBALL_BYTES + 1)\n    if len(tar_bytes) &gt; _MAX_TARBALL_BYTES:\n        raise ValueError(&quot;GitHub \u306e\u30a2\u30fc\u30ab\u30a4\u30d6\u304c\u5927\u304d\u3059\u304e\u307e\u3059&quot;)\n    code_files = extract_code(tar_bytes, os.path.join(base, &quot;code&quot;))\n    if not code_files:\n        raise ValueError(&quot;GitHub \u306e\u30a2\u30fc\u30ab\u30a4\u30d6\u304b\u3089\u914d\u5e03\u5143\u306e\u30b3\u30fc\u30c9\u3092\u53d6\u308a\u51fa\u305b\u307e\u305b\u3093\u3067\u3057\u305f&quot;)\n    seconds = round(time.time() - t0)\n    _log(t0, f&quot;\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 {total \/ 1024 ** 3:.1f}GB\u30fb\u914d\u5e03\u5143\u306e\u30b3\u30fc\u30c9 {len(code_files)}\u30d5\u30a1\u30a4\u30eb\u30fb{seconds}\u79d2&quot;)\n    return {&quot;bytes&quot;: int(total), &quot;seconds&quot;: int(seconds), &quot;packages&quot;: installed_packages(),\n            &quot;code_files&quot;: code_files}\n\n@dataclass(frozen=True)\nclass StreamingConfig:\n    &quot;&quot;&quot;\u30c7\u30b3\u30fc\u30c9\u51e6\u7406\u304c\u8aad\u3080\u8a2d\u5b9a(\u914d\u5e03\u5143\u306e examples\/torch_streaming_decode.py \u306e StreamingDecodeConfig \u3068\u540c\u3058\u5f62)\u3002&quot;&quot;&quot;\n    transcription_delay_ms: int = 480\n    token_period_ms: int = 80\n    sampling_rate: int = 16000\n    left_pad_tokens: int = 18\n    right_pad_text_tokens: int = 10\n    max_new_tokens: int = 512\n\n    @property\n    def num_delay_tokens(self) -&gt; int:\n        return self.transcription_delay_ms \/\/ self.token_period_ms\n\n    @property\n    def raw_audio_samples_per_token(self) -&gt; int:\n        return self.sampling_rate * self.token_period_ms \/\/ 1000\n\n    @property\n    def streaming_n_left_pad_tokens(self) -&gt; int:\n        return self.left_pad_tokens\n\ndef merge_vad_heads(src: str, dest: str) -&gt; str:\n    &quot;&quot;&quot;\n    \u91cd\u307f\u304c model.safetensors \u3068 semantic_vad_heads.safetensors \u306b\u5206\u304b\u308c\u3066\u3044\u308b\u3002transformers 5.13.0 \u306f\u3001\u30d5\u30a9\u30eb\u30c0\u306b\n    model.safetensors \u304c\u3042\u308b\u3068\u7d22\u5f15(model.safetensors.index.json)\u3092\u898b\u305a\u3001\u5f8c\u8005\u3092\u8aad\u307e\u305a\u306b\u300c\u91cd\u307f\u304c\u8db3\u308a\u306a\u3044\u300d\u3068\u65ad\u308b\u3002\n    \u305d\u3053\u30672\u3064\u306e\u30c6\u30f3\u30bd\u30eb\u3092\u305d\u306e\u307e\u307e(\u5909\u63db\u305b\u305a)1\u3064\u306e safetensors \u306b\u675f\u306d\u305f\u4f5c\u696d\u7528\u306e\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u308b(2026-09-30)\u3002\n    &quot;&quot;&quot;\n    from safetensors.torch import load_file, save_file\n    os.makedirs(dest, exist_ok=True)\n    for name in os.listdir(src):\n        if name not in (&quot;model.safetensors&quot;, &quot;semantic_vad_heads.safetensors&quot;, &quot;model.safetensors.index.json&quot;):\n            os.symlink(os.path.join(src, name), os.path.join(dest, name))\n    tensors = load_file(os.path.join(src, &quot;model.safetensors&quot;))\n    heads = load_file(os.path.join(src, &quot;semantic_vad_heads.safetensors&quot;))\n    if set(tensors) &amp; set(heads):\n        raise ValueError(&quot;2\u3064\u306e\u91cd\u307f\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u540c\u3058\u540d\u524d\u306e\u30c6\u30f3\u30bd\u30eb\u304c\u3042\u308a\u307e\u3059&quot;)\n    tensors.update(heads)\n    save_file(tensors, os.path.join(dest, &quot;model.safetensors&quot;), metadata={&quot;format&quot;: &quot;pt&quot;})\n    return dest\n\ndef _waveform(b64: str, sampling_rate: int):\n    &quot;&quot;&quot;16bit PCM\u30fb\u30e2\u30ce\u30e9\u30eb\u306e WAV(base64)\u3092\u3001-1\u301c1 \u306e float32 \u306e\u914d\u5217\u306b\u3059\u308b\u3002&quot;&quot;&quot;\n    import numpy as np\n    with wave.open(io.BytesIO(base64.b64decode(b64)), &quot;rb&quot;) as r:\n        if (r.getframerate(), r.getnchannels(), r.getsampwidth()) != (sampling_rate, 1, 2):\n            raise ValueError(&quot;16kHz\u30fb\u30e2\u30ce\u30e9\u30eb\u30fb16bit \u306e WAV \u3067\u306f\u3042\u308a\u307e\u305b\u3093&quot;)\n        pcm = r.readframes(r.getnframes())\n    return np.frombuffer(pcm, dtype=np.int16).astype(np.float32) \/ 32768.0\n\ndef run(job: dict) -&gt; dict:\n    &quot;&quot;&quot;\n    job: {&quot;dir&quot;, &quot;inputs&quot;: [{&quot;id&quot;, &quot;language&quot;, &quot;wav_b64&quot;}], &quot;decoding&quot;: {StreamingConfig \u306e\u5024}}\u3002\n    \u623b\u308a\u5024\u306f\u8a18\u9332\u306e\u4e00\u90e8(\u6587\u5b57\u8d77\u3053\u3057\u306e\u539f\u6587\u30fb\u79d2\u6570\u30fbVRAM)\u3002\u8aa4\u308a\u306e\u6570\u3048\u65b9\u306f\u30db\u30b9\u30c8\u5074\u3002\n    &quot;&quot;&quot;\n    import sys\n\n    import torch\n    import transformers\n    os.environ[&quot;HF_HUB_OFFLINE&quot;] = &quot;1&quot;\n    os.environ[&quot;TRANSFORMERS_OFFLINE&quot;] = &quot;1&quot;\n    t0 = time.time()\n    base = os.path.join(MOUNT, job[&quot;dir&quot;])\n    sys.path.insert(0, os.path.join(base, &quot;code&quot;))\n    from audio8_asr_infinite.modeling.modeling_audio8_asr_infinite import (\n        Audio8ASRInfiniteForConditionalGeneration, resolve_qwen_language_token_id,\n        resolve_qwen_streaming_special_token_ids)\n    from audio8_asr_infinite.streaming_inference import simulated_streaming_greedy_decode_batch\n    from transformers import AutoFeatureExtractor, AutoTokenizer\n\n    gpu = torch.cuda.get_device_name(0)\n    _log(t0, f&quot;GPU: {gpu}\u30fbtransformers {transformers.__version__}\u30fbtorch {torch.__version__}&quot;)\n    record = {&quot;gpu&quot;: gpu, &quot;vram_total&quot;: int(torch.cuda.get_device_properties(0).total_memory),\n              &quot;transformers&quot;: str(transformers.__version__), &quot;torch&quot;: str(torch.__version__), &quot;dtype&quot;: &quot;bfloat16&quot;,\n              &quot;packages&quot;: installed_packages(), &quot;python&quot;: platform.python_version(),\n              &quot;measured_at&quot;: datetime.now(timezone.utc).isoformat()}\n    path = merge_vad_heads(os.path.join(base, &quot;model&quot;), os.path.join(&quot;\/tmp&quot;, &quot;asr-model&quot;))\n    record[&quot;merged_vad_heads&quot;] = True\n    config = StreamingConfig(**job[&quot;decoding&quot;])\n    tokenizer = AutoTokenizer.from_pretrained(path, local_files_only=True)\n    feature_extractor = AutoFeatureExtractor.from_pretrained(path, local_files_only=True)\n    model = Audio8ASRInfiniteForConditionalGeneration.from_pretrained(\n        path, local_files_only=True, use_safetensors=True, dtype=torch.bfloat16)\n    model.to(device=&quot;cuda&quot;)\n    model.eval()\n    model.config.use_cache = True\n    torch.cuda.synchronize()\n    record[&quot;vram_loaded&quot;] = int(torch.cuda.memory_allocated())\n    record[&quot;load_sec&quot;] = round(time.time() - t0)\n    _log(t0, f&quot;\u8aad\u307f\u8fbc\u307f: VRAM {record['vram_loaded'] \/ 1024 ** 3:.1f}GB\u30fb{record['load_sec']}\u79d2&quot;)\n    special_ids = resolve_qwen_streaming_special_token_ids(tokenizer)\n\n    def decode(item: dict) -&gt; tuple[str, float, float]:\n        waveform = _waveform(item[&quot;wav_b64&quot;], config.sampling_rate)\n        started = time.time()\n        result = simulated_streaming_greedy_decode_batch(\n            model=model, tokenizer=tokenizer, feature_extractor=feature_extractor, waveforms=[waveform],\n            language_token_ids=[resolve_qwen_language_token_id(tokenizer, item[&quot;language&quot;])],\n            special_ids=special_ids, audio_config=config, num_delay_tokens=[config.num_delay_tokens],\n            right_pad_text_tokens=config.right_pad_text_tokens, dtype=torch.bfloat16,\n            device=next(model.parameters()).device, max_new_tokens=config.max_new_tokens)\n        torch.cuda.synchronize()\n        return result[0].get(&quot;final_text&quot;, &quot;&quot;), time.time() - started, waveform.size \/ config.sampling_rate\n\n    decode(job[&quot;inputs&quot;][0])  # \u6700\u521d\u306e1\u56de\u306f\u521d\u671f\u5316\u306e\u6642\u9593\u304c\u5165\u308b\u306e\u3067\u3001\u6e2c\u3089\u305a\u306b\u6d41\u3059\n    torch.cuda.reset_peak_memory_stats()\n    outputs = []\n    for item in job[&quot;inputs&quot;]:\n        text, seconds, audio_seconds = decode(item)\n        outputs.append({&quot;id&quot;: item[&quot;id&quot;], &quot;language&quot;: item[&quot;language&quot;], &quot;hypothesis&quot;: text,\n                        &quot;decode_sec&quot;: round(seconds, 2), &quot;audio_sec&quot;: round(audio_seconds, 2)})\n        _log(t0, f&quot;{item['id']}: {audio_seconds:.1f}\u79d2\u306e\u97f3\u58f0\u3092 {seconds:.1f}\u79d2\u3067\u6587\u5b57\u8d77\u3053\u3057&quot;)\n    record[&quot;vram_peak&quot;] = int(torch.cuda.max_memory_allocated())\n    record[&quot;outputs&quot;] = outputs\n    return plain(record)\n\ndef plain(value):\n    &quot;&quot;&quot;JSON \u306b\u901a\u3057\u3066\u3001\u6a19\u6e96\u306e\u578b\u3060\u3051\u306b\u3059\u308b(\u30db\u30b9\u30c8\u306b\u306f torch \u3082 transformers \u3082\u7121\u3044)\u3002&quot;&quot;&quot;\n    return json.loads(json.dumps(value, default=str))\n<\/code><\/pre>\n<p>The <code>job<\/code> passed to <code>download<\/code> (as used):<\/p>\n<pre><code class=\"language-json\">{\n  &quot;repo&quot;: &quot;Edge0\/Audio8-ASR-Infinite&quot;,\n  &quot;revision&quot;: &quot;7476824bc222e4ad509d286e8cae8b8d3f371129&quot;,\n  &quot;files&quot;: [\n    &quot;config.json&quot;,\n    &quot;preprocessor_config.json&quot;,\n    &quot;generation_config.json&quot;,\n    &quot;tokenizer.json&quot;,\n    &quot;tokenizer_config.json&quot;,\n    &quot;chat_template.jinja&quot;,\n    &quot;model.safetensors&quot;,\n    &quot;model.safetensors.index.json&quot;,\n    &quot;semantic_vad_heads.safetensors&quot;\n  ],\n  &quot;dir&quot;: &quot;asr-1790805644&quot;,\n  &quot;code&quot;: {\n    &quot;repo&quot;: &quot;Edge0-AI\/Audio8-ASR-Infinite&quot;,\n    &quot;commit&quot;: &quot;c8ba8eea829be0339e8d7757f8ca52dac06e1e32&quot;\n  }\n}\n<\/code><\/pre>\n<p>The <code>job<\/code> passed to <code>run<\/code> (as used; the audio is passed as base64 and shown here by its SHA-256):<\/p>\n<pre><code class=\"language-json\">{\n  &quot;dir&quot;: &quot;asr-1790805644&quot;,\n  &quot;inputs&quot;: [\n    {\n      &quot;id&quot;: &quot;weather&quot;,\n      &quot;language&quot;: &quot;en&quot;,\n      &quot;wav_sha256&quot;: &quot;1258dcd9f83234db2601a928bd8facddc1c0c2751d7a90765375cc9197dc0651&quot;\n    },\n    {\n      &quot;id&quot;: &quot;numbers&quot;,\n      &quot;language&quot;: &quot;en&quot;,\n      &quot;wav_sha256&quot;: &quot;ce0b8d12768dd1d9f5fdbf5fd0a0a98c35b5f5b7c522b814c5da01579812f430&quot;\n    },\n    {\n      &quot;id&quot;: &quot;surprise&quot;,\n      &quot;language&quot;: &quot;en&quot;,\n      &quot;wav_sha256&quot;: &quot;fcd7c8d3f8cce918a56d959071a298d3a994d29c78586a2868b2a0a0c7c56e40&quot;\n    }\n  ],\n  &quot;decoding&quot;: {\n    &quot;transcription_delay_ms&quot;: 480,\n    &quot;token_period_ms&quot;: 80,\n    &quot;left_pad_tokens&quot;: 18,\n    &quot;right_pad_text_tokens&quot;: 10,\n    &quot;max_new_tokens&quot;: 512\n  }\n}\n<\/code><\/pre>\n<details>\n<summary>The publisher&#x27;s code files we extracted (SHA-256)<\/summary>\n<pre><code>14f8e8ea73d8e441bceb85f0fafa7d443e37178cab135994204117b9bd5d3319  __init__.py e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  modeling\/__init__.py 36cb2c25d456cd4692a01a801cf1608f49377ce78353b48561554e715d9f9012  modeling\/configuration_audio8_asr_infinite.py fed33565b9ed307353aa7cd9565886c592b2ee3969c913cbe0bfa9dda9f7a469  modeling\/modeling_audio8_asr_infinite.py 0aff961fe05f587862079ae01382eaaa57332be5e4fe0f114a8ac99578805c72  simulated_streaming_audio.py 37e7ba1ba9ff26ce1baea8c1af7aac0db017b6e372c236fb23068d66f6f9d38d  streaming_inference.py<\/code><\/pre>\n<\/details>\n<details>\n<summary>Package versions in the running container (full list)<\/summary>\n<pre><code>accelerate==1.15.0 aiohappyeyeballs==2.6.1 aiohttp==3.12.7 aiosignal==1.3.2 annotated-doc==0.0.5 anyio==4.15.1 attrs==25.3.0 cbor2==5.7.0 certifi==2026.7.22 click==8.5.0 cuda-bindings==13.4.3 cuda-pathfinder==1.8.2 cuda-toolkit==13.0.3.0 filelock==4.0.7 frozenlist==1.6.0 fsspec==2026.9.0 grpclib==0.4.8 h11==0.16.0 h2==4.2.0 hf-xet==1.6.0 hpack==4.1.0 httpcore==1.0.9 httpx==0.28.1 huggingface_hub==1.33.0 hyperframe==6.1.0 idna==3.20 Jinja2==3.1.6 markdown-it-py==4.2.0 MarkupSafe==3.0.3 mdurl==0.1.2 mpmath==1.3.0 multidict==6.4.4 networkx==3.7 numpy==2.5.3 nvidia-cublas==13.1.1.3 nvidia-cuda-cupti==13.0.85 nvidia-cuda-nvrtc==13.0.88 nvidia-cuda-runtime==13.0.96 nvidia-cudnn-cu13==9.20.0.48 nvidia-cufft==12.0.0.61 nvidia-cufile==1.15.1.6 nvidia-curand==10.4.0.35 nvidia-cusolver==12.0.4.66 nvidia-cusparse==12.6.3.3 nvidia-cusparselt-cu13==0.8.1 nvidia-nccl-cu13==2.29.7 nvidia-nvjitlink==13.4.92 nvidia-nvshmem-cu13==3.4.5 nvidia-nvtx==13.0.85 packaging==26.3 pip==25.1.1 propcache==0.3.1 protobuf==6.31.1 psutil==7.2.2 Pygments==2.21.0 PyYAML==6.0.3 regex==2026.9.29 rich==15.0.0 safetensors==0.8.0 setuptools==84.0.0 shellingham==1.5.4 sympy==1.14.0 tokenizers==0.22.2 torch==2.13.0 tqdm==4.70.1 transformers==5.13.0 triton==3.7.1 typer==0.27.2 typing_extensions==4.16.0 uv==0.7.19 wheel==0.45.1 yarl==1.20.0<\/code><\/pre>\n<\/details>\n<details>\n<summary>Package versions in the downloading container (full list)<\/summary>\n<pre><code>aiohappyeyeballs==2.6.1 aiohttp==3.12.7 aiosignal==1.3.2 anyio==4.15.1 attrs==25.3.0 cbor2==5.7.0 certifi==2025.4.26 click==8.5.0 filelock==4.0.7 frozenlist==1.6.0 fsspec==2026.9.0 grpclib==0.4.8 h11==0.16.0 h2==4.2.0 hf-xet==1.6.0 hpack==4.1.0 httpcore2==2.13.1 httpx2==2.13.1 huggingface_hub==2.0.0 hyperframe==6.1.0 idna==3.20 multidict==6.4.4 packaging==26.3 pip==25.1.1 propcache==0.3.1 protobuf==6.31.1 PyYAML==6.0.3 tqdm==4.70.1 truststore==0.10.4 typing_extensions==4.16.0 uv==0.7.19 wheel==0.45.1 yarl==1.20.0<\/code><\/pre>\n<\/details>\n<p><!-- \/lmw:lab --><\/p>\n<p><!-- lmw:files --><\/p>\n<h2>Distributed Files<\/h2>\n<p><em>Weight files published in <a href=\"https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite\/tree\/main\">Edge0\/Audio8-ASR-Infinite<\/a>, listed by this site from the Hugging Face API. Sizes are the actual file sizes.<\/em><\/p>\n<div class=\"lmw-table-scroll\" tabindex=\"0\" style=\"overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;\">\n<table style=\"width:max-content;min-width:100%;border-collapse:collapse;\">\n<thead>\n<tr>\n<th>File<\/th>\n<th>Size<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>model.safetensors<\/code><\/td>\n<td>8.17GB<\/td>\n<\/tr>\n<tr>\n<td><code>semantic_vad_heads.safetensors<\/code><\/td>\n<td>0MB<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><!-- \/lmw:files --><\/p>\n<h2>How to Get It<\/h2>\n<ul>\n<li><strong>Distribution format<\/strong>: safetensors<\/li>\n<li><strong>Repository<\/strong>: <a href=\"https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite\">Edge0\/Audio8-ASR-Infinite<\/a><\/li>\n<li><strong>Supported tools<\/strong>: <\/li>\n<li><code>transformers<\/code> library (requires <code>trust_remote_code=True<\/code>) &#8211; 24\/7 inference using <code>vLLM<\/code> (Docker Compose deployment is recommended) &#8211; Simulation streaming decoding via <code>torch<\/code><\/li>\n<\/ul>\n<p>Note that this model does not support adapter formats or partially converted weights; only fully merged weight directories are supported.<\/p>\n<p><!-- lmw:related --><\/p>\n<h2>Related Articles<\/h2>\n<ul>\n<li><a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/2026\/09\/11\/edge0-35b-a3b-preview-sparse-moe\/\">Edge0-35B-A3B-preview 35B MoE Model for Phone-Class Memory: 24GB+ VRAM<\/a><\/li>\n<\/ul>\n<p><!-- \/lmw:related --><\/p>\n<p><!-- lmw:next-steps --><\/p>\n<h2>What to Read Next<\/h2>\n<ul>\n<li><strong>Find models by VRAM<\/strong> (This model runs from the 12GB tier) \u2192 <a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/vram-guide-12gb-en\/\">Other models that run on a 12GB GPU<\/a><\/li>\n<li><strong>Formats this model is available in<\/strong> \u2192 <a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/format-safetensors-en\/\">Safetensors format guide and models<\/a><\/li>\n<li><strong>Other models for the same task<\/strong> \u2192 <a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/models-by-task-en\/#task-audio\">Other audio models<\/a><\/li>\n<li><strong>How to read CER, WER<\/strong> \u2192 <a href=\"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/glossary-benchmarks-en\/\">Benchmark glossary<\/a><\/li>\n<\/ul>\n<p><!-- \/lmw:next-steps --><\/p>\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite\"><a href=\"https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite\">https:\/\/huggingface.co\/Edge0\/Audio8-ASR-Infinite<\/a><\/a><\/li>\n<\/ul>\n<p><!-- lmw:updates --><\/p>\n<h2>Update History<\/h2>\n<ul>\n<li>2026-09-24: Rebuilt the article: Added a &#8220;can you run it locally?&#8221; verdict from the distribution formats, converted builds, engine registries, license terms and measured compression<\/li>\n<li>2026-09-25: Changed the title to show what the article covers (VRAM requirements, file list, etc.).<\/li>\n<li>2026-10-01: Added our own measurements: transcripts of English audio we made.<\/li>\n<\/ul>\n<p><!-- \/lmw:updates --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Edge0 has released Audio8-ASR-Infinite, a native streaming speech recognition model designed for bilingual Chinese-English transcription with high responsi<\/p>\n","protected":false},"author":1,"featured_media":4088,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[203],"tags":[2154,994,759,1547,2156,1017],"class_list":["post-3096","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-image-video-and-audio","tag-audio8-asr-infinite-en","tag-edge0-en","tag-transformers-en","tag-verified","tag--en"],"lang":"en","translations":{"en":3096,"ja":3094},"_links":{"self":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/posts\/3096","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/comments?post=3096"}],"version-history":[{"count":57,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/posts\/3096\/revisions"}],"predecessor-version":[{"id":15539,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/posts\/3096\/revisions\/15539"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/media\/4088"}],"wp:attachment":[{"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/media?parent=3096"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/categories?post=3096"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/localmodelwatch.tsuchitsuchi.com\/en\/wp-json\/wp\/v2\/tags?post=3096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}