mlboydaisuke commited on
Commit
87fdb3c
·
verified ·
1 Parent(s): 560d44e

Audio8-TTS-Preview-0.6b → Core AI: dualar int8 + codec decoder fp16 + codec encoder fp16w32, tokenizer, card

Browse files
.gitattributes CHANGED
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ audio8_codec_decoder_fp16_t160.aimodel/main.mlirb filter=lfs diff=lfs merge=lfs -text
37
+ audio8_codec_encoder_fp16_t216.aimodel/main.mlirb filter=lfs diff=lfs merge=lfs -text
38
+ audio8_dualar_int8_cl2048_w32.aimodel/main.mlirb filter=lfs diff=lfs merge=lfs -text
39
+ tokenizer/tokenizer.json filter=lfs diff=lfs merge=lfs -text
LICENSE ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
NOTICE ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ audio8_tts
2
+
3
+ The model architecture is inspired by the DualAR design used in Fish Audio
4
+ S2 Pro.
README.md ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ library_name: coreai
4
+ pipeline_tag: text-to-speech
5
+ base_model: Edge0/Audio8-TTS-Preview-0.6b
6
+ language:
7
+ - yue
8
+ - zh
9
+ - nl
10
+ - en
11
+ - fr
12
+ - de
13
+ - it
14
+ - ja
15
+ - ko
16
+ - pl
17
+ - es
18
+ tags: [core-ai, coreaikit, audio8, dualar, text-to-speech, tts, voice-cloning, zero-shot, multilingual, on-device, apple]
19
+ base_model_relation: quantized
20
+ ---
21
+
22
+ Core AI is Apple's on-device ML runtime in iOS 27 / macOS 27 and the successor to Core ML: PyTorch models are exported with Apple's `coreai-torch` (LLMs: `coreai.llm.export`) into `.aimodel` bundles that run on the GPU or the Neural Engine, e.g. Qwen3-8B 4-bit decodes at 94 tok/s on an M4 Max GPU, MLX 90 under the same protocol ([apple-silicon-llm-bench](https://github.com/john-rocky/apple-silicon-llm-bench), macOS 27 beta, 2026-06).
23
+
24
+ # Audio8-TTS-Preview-0.6b — Core AI
25
+
26
+ [🤗 mlboydaisuke/Audio8-TTS-Preview-0.6b-CoreAI](https://huggingface.co/mlboydaisuke/Audio8-TTS-Preview-0.6b-CoreAI) · Apache-2.0 · base [Edge0/Audio8-TTS-Preview-0.6b](https://huggingface.co/Edge0/Audio8-TTS-Preview-0.6b)
27
+
28
+ [`Edge0/Audio8-TTS-Preview-0.6b`](https://huggingface.co/Edge0/Audio8-TTS-Preview-0.6b) (Edge0, Apache-2.0, 601M + a
29
+ 337M codec) is a **DualAR text-to-speech** model of the Fish Audio S2 Pro design: a Qwen2.5-shaped **slow AR** (24
30
+ layers, 896 wide) predicts one *semantic* token per 46 ms frame, a 4-layer **fast AR** predicts the frame's nine other
31
+ codec codebooks one after another, and a 44.1 kHz **DAC-style codec** turns the ten codebooks into audio. **Eleven
32
+ languages** (Cantonese, Chinese, Dutch, English, French, German, Italian, Japanese, Korean, Polish, Spanish) and
33
+ **zero-shot voice cloning** from a 0.5–30 s reference recording and its transcript. This is the zoo's first DualAR /
34
+ semantic-token TTS and the first port with the sampler inside the graph. On 2026-09-28 the Hub had MLX builds
35
+ (`mlx-community/Audio8-TTS-Preview-0.6b-bf16`, 8-bit and 4-bit conversions), the publisher's ONNX INT4 build for CPUs
36
+ and a GGUF, and no Core AI or Core ML port of the TTS (a Core ML port exists of the publisher's ASR sibling); this port
37
+ runs the model on iPhone and Mac through Apple's runtime.
38
+
39
+ ## Pipeline
40
+
41
+ ```
42
+ text (+ reference transcript + reference codes) ──(host: the publisher's prompt segments, encoded one at a time)──▶ prompt [11, P]
43
+ 1. dualar.aimodel prefill(codes [1,11,32], pos) in windows ─▶ logits [32,4097] · hidden [32,896]
44
+ frame(codes [1,11,1], pos, noise_slow [2,4097], window [10], noise_fast [9,4096], forced, use_forced)
45
+ = the slow step + the semantic draw (top-k 50 / top-p 0.9 / T 0.7, Gumbel-max, RAS) + the fast AR's
46
+ ten rows with nine codebook draws — ONE call per frame ─▶ semantic · codes [10]
47
+ first_frame(logits, hidden, …) for the frame right after the prefill
48
+ host: the 10-token RAS window, the uniform draws (a seeded stream), stop at eos 151645 or 512 frames
49
+ 2. codec.aimodel codes [1,10,160] ─▶ wav [1, 327680] at 44.1 kHz (every op causal: 160-frame windows, keep the last 32)
50
+ voice registration: wav 44.1 kHz [1,1,442368] ─▶ encoder.aimodel ─▶ codes [1,10,216] (0.5–10 s reference; the codes + transcript are the voice)
51
+ ```
52
+
53
+ A frame is 2,048 samples (21.5 frames/s). The prompt is the publisher's: `<|im_start|>system\n` · "convert the provided
54
+ text to speech" (or, with a voice, "… reference to the following:\n\nText:\n" · `<|speaker:0|>` + transcript ·
55
+ "\n\nSpeech:\n" · the reference's codebook-0 codes as semantic ids) · `<|im_end|>\n<|im_start|>user\n` · text ·
56
+ `<|im_end|>\n<|im_start|>assistant\n<|voice|>` — segments encoded separately, asserted id for id against the publisher's
57
+ processor on all 18 fixtures, in Python and in the Swift host.
58
+
59
+ ### Graph contracts
60
+
61
+ ```
62
+ dualar prefill in codes[1,11,32] i32 (row 0 ids, rows 1-10 codebooks; pad 151643 / 0) · pos[1] i32 out logits[32,4097] f16 · hidden[32,896] f16
63
+ frame in codes[1,11,1] i32 (the previous frame) · pos[1] · noise_slow[2,4097] f32 · window[10] i32 (-1 = none)
64
+ noise_fast[9,4096] f32 · forced[11] i32 · use_forced[1] f32 out semantic[1] i32 · codes[10] i32 · logits · hidden · fast_logits[9,4096] · sampled_*
65
+ first_frame in logits[4097] f16 · hidden[896] f16 · the same noise / window / forced out as frame
66
+ state k_cache / v_cache [24,1,2,2048,64] f16 (prefill and frame)
67
+ precision slow AR linears int8 (weight-only, per-block-32, symmetric with clipping); embeddings, the 4,097-row head, norms, the fast AR fp16
68
+ codec main in codes[1,10,160] i32 (right-pad 0; codebook 0 < 4096, codebooks 1-9 < 1024, clamped in-graph) out wav[1,327680] f16
69
+ encoder main in audio[1,1,442368] f32 mono 44.1 kHz (right-pad 0) out codes[1,10,216] i32 (keep ceil(samples/2048) frames)
70
+ ```
71
+
72
+ The head is the embedding table's 4,097 rows (the semantic ids and eos) instead of 155,776: the publisher's sampler sets
73
+ every other logit to -inf before drawing, so nothing is lost (7 MB instead of 279 MB).
74
+
75
+ ## What made it work
76
+
77
+ 1. **One graph call per frame, the sampler inside.** The publisher's ONNX runtime — and this port's first export —
78
+ runs a frame as a slow-AR call plus nine fast-AR calls with sampling on the host; on the raw Core AI runtime path
79
+ that is ~48 ms of engine time per 46 ms frame on an M4 Max, a call costing milliseconds before any arithmetic. The
80
+ shipped `frame` function does the slow step, the semantic draw and the fast AR's ten rows in one call, with the
81
+ publisher's top-k / top-p / temperature / Gumbel-max / RAS sampler written without a sort (`topk(50)` +
82
+ `logsumexp` + a cumulative sum); the uniform draws are inputs, so a recorded draw replays the oracle's choice exactly.
83
+ Details: [`knowledge/audio8-tts-port.md`](https://github.com/john-rocky/coreai-model-zoo/blob/main/knowledge/audio8-tts-port.md).
84
+ 2. **int8 on the slow AR, fp16 on the fast AR.** On 15,093 teacher-forced codebook draws the fp16 fast AR reproduces the
85
+ oracle's draw 99.5 % of the time; int8 drops to 95.8 % for 53 MB. The slow AR takes int8 well (1,671 / 1,695 semantic
86
+ draws, 21 of the 24 misses at a Gumbel margin under 0.13; fp16: 1,688).
87
+ 3. **The codec encoder needs fp32 arithmetic.** Its vector quantizers pick nearest codebook entries; the whole-fp16
88
+ export flips those choices and the nine residual books cascade (44–121 of ~200 frames exact). fp16 weights with fp32
89
+ arithmetic (the Fun-ASR encoder recipe) gives 691 / 712 frames exact and codebook 0 exact on every frame.
90
+ 4. **Kept from the publisher's code:** bfloat16-rounded RoPE tables (interleaved pairs), RMSNorm eps 1e-6 in fp32, the
91
+ RAS window that skips the first frame's token, the clamp of codebooks 1–9 to 1,023. The slow AR's residual peaks at
92
+ 12,827 — a fifth of float16's range — so no rescale was needed.
93
+
94
+ ## Numerics gate (18 fixtures: 6 ja + 6 en + 2 zh sentences of our own, 4 voice-clone fixtures on FLEURS test clips)
95
+
96
+ Oracle = the publisher's `modeling_arktts.py` in fp32 on the CPU, seeded (`generate` reproduced call for call, every
97
+ uniform draw recorded). Teacher-forced = the oracle's tokens fed to the graphs; a *draw* comparison asks whether the
98
+ in-graph sampler, given the port's logits and the oracle's noise, makes the oracle's choice.
99
+
100
+ | stage (Mac GPU) | result |
101
+ | --- | --- |
102
+ | tokenizer-only prompt vs the publisher's processor | 18 / 18 prompts identical (Python and Swift) |
103
+ | plain-torch re-author, eager fp32, teacher-forced | every argmax and every replayed draw equal to the oracle; codec wav cos 1.000000 |
104
+ | **dualar int8 (ship)**, teacher-forced, 1,695 slow steps | logits cos min 0.99985, argmax 1,668, **draw 1,671 / 1,695** |
105
+ | same, 15,093 fast-AR codebook draws | logits cos min 0.99805, argmax 14,705, **draw 14,711 / 15,093** |
106
+ | codec decoder on the oracle's codes, 18 utterances | wav cos min 0.99978, log-mel cos min 0.99876 |
107
+ | codec encoder (fp16w32) on the 4 reference clips, 712 frames | 691 frames exact; codebook 0 exact on every frame, every codebook ≥ 97.7 % |
108
+ | free run (the port's own loop, the oracle's draws) | reached eos 18 / 18; Swift host == Python engine on 1,637 / 1,688 frames (10 / 18 utterances identical end to end) |
109
+ | ASR round trip vs the fixture text (Fun-ASR fp32): ja CER / en WER / zh CER | port **2.3 % / 0.9 % / 0.0 %** · the oracle's own audio 6.5 / 0.0 / 0.0 |
110
+ | speaker cosine to the reference clip (WavLM-Base-Plus-SV), 4 clone fixtures | port mean 0.855 / min 0.561 · oracle 0.854 / 0.582 |
111
+
112
+ A miss is fp16 GPU or int8 arithmetic moving a draw that sat within a hair of the runner-up; under sampling, one flip
113
+ changes every later frame, so end-to-end identity is not the bar — the ASR and speaker rows are. They are eight to
114
+ fourteen sentences per language, our own measurement with one normalizer: the port's speech is as intelligible and as
115
+ speaker-faithful as the publisher's fp32 output on these fixtures, not more.
116
+
117
+ ## Speed
118
+
119
+ Measured with [`apps/Audio8Gate`](https://github.com/john-rocky/coreai-model-zoo/tree/main/apps/Audio8Gate) (the kit's `Audio8TTS` in a Release build, the 18 fixtures,
120
+ 78 s of audio; medians; 2026-09-28) **while another model conversion ran on the same Mac (load average 5–7)**. Both
121
+ assets are JIT: the first load specializes them, later loads read the cache.
122
+
123
+ | | frame (slow step + sampling + fast AR) | codec (160-frame window) | time to first audio (32-frame chunk) | RTF median / p90 | first load (cold) → later loads | footprint |
124
+ |---|---|---|---|---|---|---|
125
+ | M4 Max (GPU, macOS 27 26A428, GPU lock held) | 36–40 ms | ~0.7 s per utterance | 1.5 s | **1.05** / 1.09 (bench on one 5 s sentence: 0.99) | 5.4 s (cache 0 → 1.27 GB) → 0.8 s | 0.85–0.95 GB |
126
+ | iPhone 18 Pro | not yet measured (the device was held by another lane on 2026-09-28) | | | | | |
127
+
128
+ A 46 ms frame costs ~36 ms of engine time, so the Mac synthesizes at about real time and streams the first 1.5 s of
129
+ audio after 1.5 s. The per-frame cost is the raw runtime path's per-layer dispatch (a 512-slot cache, AOT compilation
130
+ and Apple's composite RMSNorm/RoPE change it by 0–10 %); Apple's pipelined engine drives a same-sized Qwen3-0.6B at
131
+ 2.8 ms per token, and moving the slow step onto it is the lever for a several-times faster frame — a separate round.
132
+
133
+ ## Use it
134
+
135
+ CoreAIKit `Audio8TTS` (catalog enrollment pending):
136
+
137
+ ```swift
138
+ import CoreAIKit
139
+
140
+ let tts = try await Audio8TTS(paths: .standard(root: modelDir)) // dualar + codec .aimodel, tokenizer/
141
+ let audio = try await tts.synthesize("明日の午後、駅前の喫茶店で待ち合わせましょう。") // 44.1 kHz mono [Float]
142
+ // streaming: tts.synthesizeStreaming(text) { chunk in play(chunk) } ~1.5 s chunks
143
+ // voice cloning: Audio8Voice(referenceText:codes:) from register_voice.py / the encoder graph
144
+ let cloned = try await tts.synthesize("Turn left at the second traffic light.", voice: voice)
145
+ ```
146
+
147
+ ## ⬇️ Bundle
148
+
149
+ **[mlboydaisuke/Audio8-TTS-Preview-0.6b-CoreAI](https://huggingface.co/mlboydaisuke/Audio8-TTS-Preview-0.6b-CoreAI)** —
150
+ `audio8_dualar_int8_cl2048_w32.aimodel/` (876 MB) + `audio8_codec_decoder_fp16_t160.aimodel/` (261 MB) +
151
+ `audio8_codec_encoder_fp16w32_t216.aimodel/` (416 MB, voice registration only) + `tokenizer/`; one subtree for macOS and
152
+ iOS (JIT `.aimodel`s). Apache-2.0: LICENSE + NOTICE from the publisher's repository. Mirror:
153
+ `coreai-community/Audio8-TTS-Preview-0.6b-CoreAI`.
154
+
155
+ Convert yourself — [`conversion/audio8_tts/`](https://github.com/john-rocky/coreai-model-zoo/tree/main/conversion/audio8_tts): `oracle_audio8.py` → `parity_audio8.py` →
156
+ `export_audio8_frame.py --mode int8`, `export_audio8.py --part codec`, `audio8_encoder.py --frames 216 --dtype fp16w32`,
157
+ gated by `gate_audio8_frame.py` (recipe: [`recipe.toml`](https://github.com/john-rocky/coreai-model-zoo/blob/main/models/audio8-tts/recipe.toml)). Generated speech can be misused for
158
+ impersonation; the publisher asks for consent before cloning a voice and disclosure of synthetic audio, and so does
159
+ this port.
audio8_codec_decoder_fp16_t160.aimodel/main.hash ADDED
@@ -0,0 +1 @@
 
 
1
+ �#���1U��8�l~wz�ާ:ҼG���zӱi
audio8_codec_decoder_fp16_t160.aimodel/main.mlirb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9d23fad5cf3155adfd38d76c7e777a8012dea73ad2bc47ef069f1dc67ad3b169
3
+ size 261101172
audio8_codec_decoder_fp16_t160.aimodel/metadata.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "producer" : "coreai-core 1.0.0b2",
3
+ "license" : "apache-2.0",
4
+ "creationDate" : "20260927T212440Z",
5
+ "assetVersion" : "2.0"
6
+ }
audio8_codec_encoder_fp16_t216.aimodel/main.hash ADDED
Binary file (32 Bytes). View file
 
audio8_codec_encoder_fp16_t216.aimodel/main.mlirb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9c77708867a6ac00aec8ab5b8ed5999f926f4f081b2a5413d29fce81cda97b48
3
+ size 416030239
audio8_codec_encoder_fp16_t216.aimodel/metadata.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "creationDate" : "20260927T222131Z",
3
+ "assetVersion" : "2.0",
4
+ "license" : "apache-2.0",
5
+ "producer" : "coreai-core 1.0.0b2"
6
+ }
audio8_dualar_int8_cl2048_w32.aimodel/main.hash ADDED
@@ -0,0 +1 @@
 
 
1
+ k0+�i��=���a�k�_�oҤO�KY(�6
audio8_dualar_int8_cl2048_w32.aimodel/main.mlirb ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6b302bf769aaee3dbe8ae78f61a36bd95fee9183dd6fd2a44fb04b5928993620
3
+ size 876260029
audio8_dualar_int8_cl2048_w32.aimodel/metadata.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "creationDate" : "20260927T220903Z",
3
+ "producer" : "coreai-core 1.0.0b2",
4
+ "license" : "apache-2.0",
5
+ "assetVersion" : "2.0"
6
+ }
config.json ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "ArkttsModel"
4
+ ],
5
+ "attention_o_bias": false,
6
+ "attention_qk_norm": false,
7
+ "attention_qkv_bias": true,
8
+ "auto_map": {
9
+ "AutoConfig": "configuration_arktts.ArkttsConfig",
10
+ "AutoModel": "modeling_arktts.ArkttsModel",
11
+ "AutoModelForCausalLM": "modeling_arktts.ArkttsModel"
12
+ },
13
+ "codebook_size": 4096,
14
+ "codec_filename": "codec.pth",
15
+ "codec_frame_size": 2048,
16
+ "codec_post_intermediate_size": 1216,
17
+ "codec_post_n_head": 16,
18
+ "codec_post_n_layer": 8,
19
+ "codec_post_n_local_heads": 8,
20
+ "codec_sample_rate": 44100,
21
+ "dim": 896,
22
+ "dropout": 0.0,
23
+ "dtype": "bfloat16",
24
+ "eos_token_id": 151645,
25
+ "fast_attention_o_bias": false,
26
+ "fast_attention_qk_norm": false,
27
+ "fast_attention_qkv_bias": false,
28
+ "fast_dim": 896,
29
+ "fast_head_dim": 64,
30
+ "fast_intermediate_size": 4864,
31
+ "fast_n_head": 14,
32
+ "fast_n_local_heads": 2,
33
+ "head_dim": 64,
34
+ "initializer_range": 0.02,
35
+ "intermediate_size": 4864,
36
+ "max_seq_len": 2048,
37
+ "model_type": "arktts",
38
+ "n_fast_layer": 4,
39
+ "n_head": 14,
40
+ "n_layer": 24,
41
+ "n_local_heads": 2,
42
+ "norm_eps": 1e-06,
43
+ "norm_fastlayer_input": true,
44
+ "num_codebooks": 10,
45
+ "pad_token_id": 151643,
46
+ "ras_temperature": 1.0,
47
+ "ras_top_p": 0.9,
48
+ "ras_window_size": 10,
49
+ "rope_base": 1000000,
50
+ "semantic_begin_id": 151678,
51
+ "semantic_end_id": 155773,
52
+ "tie_word_embeddings": true,
53
+ "transformers_version": "4.57.5",
54
+ "use_gradient_checkpointing": false,
55
+ "vocab_size": 155776
56
+ }
metadata.json ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "metadata_version": "0.2",
3
+ "kind": "tts",
4
+ "name": "Audio8-TTS-Preview-0.6b-CoreAI",
5
+ "source": {
6
+ "model_definition": "torch",
7
+ "hf_model_id": "Edge0/Audio8-TTS-Preview-0.6b",
8
+ "hf_revision": "f07040f3d151f1ba0253bfb92cb2f5dd38b44594",
9
+ "model_safetensors_sha256": "62dcff0adf6c2535b3260467a7c1d482b556da57266c96a444518b76e140d2c3",
10
+ "codec_pth_sha256": "c310505aa11fe2f6cc63b8d3130dc7e77e73227774f5c62575769b1f47a8d048",
11
+ "license": "apache-2.0"
12
+ },
13
+ "audio": {
14
+ "sample_rate": 44100,
15
+ "frame_samples": 2048,
16
+ "frames_per_second": 21.533203125
17
+ },
18
+ "graphs": {
19
+ "dualar": {
20
+ "asset": "audio8_dualar_int8_cl2048_w32.aimodel",
21
+ "functions": {
22
+ "prefill": {
23
+ "inputs": {
24
+ "codes": "[1, 11, 32] int32 (row 0 ids, rows 1-10 codebooks; pad rows: 151643 / 0)",
25
+ "pos": "[1] int32 first position"
26
+ },
27
+ "outputs": {
28
+ "logits": "[32, 4097] float16 (semantic 0..4095 then eos)",
29
+ "hidden": "[32, 896] float16"
30
+ }
31
+ },
32
+ "frame": {
33
+ "inputs": {
34
+ "codes": "[1, 11, 1] int32 (the previous frame: semantic id, 10 codebooks)",
35
+ "pos": "[1] int32 (its position)",
36
+ "noise_slow": "[2, 4097] float32 uniform draws (normal branch, RAS-high branch)",
37
+ "window": "[10] int32 RAS window (-1 = none)",
38
+ "noise_fast": "[9, 4096] float32 uniform draws",
39
+ "forced": "[11] int32 (teacher forcing)",
40
+ "use_forced": "[1] float32 0/1"
41
+ },
42
+ "outputs": {
43
+ "semantic": "[1] int32 token id (151645 = eos)",
44
+ "codes": "[10] int32 codebooks 0..9",
45
+ "logits": "[4097] float16",
46
+ "hidden": "[896] float16",
47
+ "fast_logits": "[9, 4096] float16",
48
+ "sampled_semantic": "[1] int32",
49
+ "sampled_codes": "[10] int32"
50
+ }
51
+ },
52
+ "first_frame": {
53
+ "inputs": {
54
+ "logits": "[4097] float16 (the prefill's last row)",
55
+ "hidden": "[896] float16",
56
+ "noise_slow": "…",
57
+ "window": "…",
58
+ "noise_fast": "…",
59
+ "forced": "…",
60
+ "use_forced": "…"
61
+ },
62
+ "outputs": "as frame"
63
+ }
64
+ },
65
+ "state": {
66
+ "k_cache": "[24, 1, 2, 2048, 64] float16",
67
+ "v_cache": "[24, 1, 2, 2048, 64] float16 (prefill and frame)"
68
+ },
69
+ "compression": "slow AR: int8 weight-only, symmetric with clipping, per-block-32 (input axis) on the 24 layers' linears; embeddings, codebook embeddings, the 4,097-row head, norms, the fast AR (4 layers) float16"
70
+ },
71
+ "codec_decoder": {
72
+ "asset": "audio8_codec_decoder_fp16_t160.aimodel",
73
+ "functions": {
74
+ "main": {
75
+ "inputs": {
76
+ "codes": "[1, 10, 160] int32 (right-pad with 0; codebook 0 < 4096, codebooks 1-9 < 1024, clamped in-graph)"
77
+ },
78
+ "outputs": {
79
+ "wav": "[1, 327680] float16, 44.1 kHz"
80
+ }
81
+ }
82
+ },
83
+ "note": "every op is causal: a frame's samples depend on at most the 127 frames before it (the codec transformer's window) — decode a stream in 160-frame windows and keep the last 32",
84
+ "compression": null
85
+ },
86
+ "codec_encoder": {
87
+ "asset": "audio8_codec_encoder_fp16_t216.aimodel",
88
+ "functions": {
89
+ "main": {
90
+ "inputs": {
91
+ "audio": "[1, 1, 442368] float32 mono 44.1 kHz, right-pad with 0 (216 frames = 10.03 s)"
92
+ },
93
+ "outputs": {
94
+ "codes": "[1, 10, 216] int32; keep the first ceil(samples / 2048) frames"
95
+ }
96
+ }
97
+ },
98
+ "note": "voice registration (zero-shot cloning): codes + the exact transcript make an Audio8Voice",
99
+ "compression": null
100
+ }
101
+ },
102
+ "sampling": {
103
+ "top_k": 50,
104
+ "top_p": 0.9,
105
+ "temperature": 0.7,
106
+ "max_new_tokens": 512,
107
+ "ras": {
108
+ "window": 10,
109
+ "top_p": 0.9,
110
+ "temperature": 1.0
111
+ },
112
+ "rule": "argmax(softmax(processed) / -log(u)) with u ~ U(0,1); processed = top-k/top-p mask then / temperature; a semantic id repeated within the 10-frame window is replaced by the (0.9, 1.0) draw",
113
+ "eos": 151645,
114
+ "semantic_begin": 151678,
115
+ "semantic_end": 155773,
116
+ "pad": 151643
117
+ },
118
+ "prompt": {
119
+ "spec": "conversion/audio8_tts/prompt.py (segments encoded one at a time with the tokenizer, no special tokens added)",
120
+ "tokenizer": {
121
+ "files": "tokenizer/",
122
+ "class_retag": "PreTrainedTokenizerFast -> Qwen2Tokenizer for swift-transformers"
123
+ }
124
+ },
125
+ "languages": [
126
+ "yue",
127
+ "zh",
128
+ "nl",
129
+ "en",
130
+ "fr",
131
+ "de",
132
+ "it",
133
+ "ja",
134
+ "ko",
135
+ "pl",
136
+ "es"
137
+ ],
138
+ "host": {
139
+ "swift": "CoreAIKit Audio8TTS (Sources/CoreAIKit/Audio8TTS)",
140
+ "python_gate": "conversion/audio8_tts/gate_audio8.py"
141
+ },
142
+ "files": {
143
+ "audio8_dualar_int8_cl2048_w32.aimodel/main.hash": {
144
+ "sha256": "73ba75f6998692b3c361a27939f2a2db36c3735236eed96f9ea955be6c70c42a",
145
+ "bytes": 32
146
+ },
147
+ "audio8_dualar_int8_cl2048_w32.aimodel/main.mlirb": {
148
+ "sha256": "6b302bf769aaee3dbe8ae78f61a36bd95fee9183dd6fd2a44fb04b5928993620",
149
+ "bytes": 876260029
150
+ },
151
+ "audio8_dualar_int8_cl2048_w32.aimodel/metadata.json": {
152
+ "sha256": "11dd0938dfd88fea0a7f862f27297a43f31d7886ce1754c3d57b552ee8100387",
153
+ "bytes": 133
154
+ },
155
+ "audio8_codec_decoder_fp16_t160.aimodel/main.hash": {
156
+ "sha256": "41cd54a438da85d253f6a733fbb806605a38d54558c8d51ada7babe251a6dccd",
157
+ "bytes": 32
158
+ },
159
+ "audio8_codec_decoder_fp16_t160.aimodel/main.mlirb": {
160
+ "sha256": "9d23fad5cf3155adfd38d76c7e777a8012dea73ad2bc47ef069f1dc67ad3b169",
161
+ "bytes": 261101172
162
+ },
163
+ "audio8_codec_decoder_fp16_t160.aimodel/metadata.json": {
164
+ "sha256": "0221caad005eed1da346fda823fe97cfbce4cbcd8a262b3dc982279d15505f4a",
165
+ "bytes": 133
166
+ },
167
+ "audio8_codec_encoder_fp16_t216.aimodel/main.hash": {
168
+ "sha256": "c24c6679b723b2eaccede267c5bbb88a77cf6b53230321339364a0d1db9c3241",
169
+ "bytes": 32
170
+ },
171
+ "audio8_codec_encoder_fp16_t216.aimodel/main.mlirb": {
172
+ "sha256": "9c77708867a6ac00aec8ab5b8ed5999f926f4f081b2a5413d29fce81cda97b48",
173
+ "bytes": 416030239
174
+ },
175
+ "audio8_codec_encoder_fp16_t216.aimodel/metadata.json": {
176
+ "sha256": "393db855a49f603faf5e09edd9334b47ddc621a8b1a78464a966d07e1714f681",
177
+ "bytes": 133
178
+ }
179
+ },
180
+ "compilation": {
181
+ "date": "2026-09-27T23:09:59.812117+00:00",
182
+ "targets": [
183
+ "macos",
184
+ "ios (jit)"
185
+ ]
186
+ }
187
+ }
tokenizer/special_tokens_map.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer/tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f24e08099d45a8adf3f52f5f0b03276e433bb9d689bb15fcbcc48ce58744588b
3
+ size 12217872
tokenizer/tokenizer_config.json ADDED
The diff for this file is too large to render. See raw diff