| 214 | return embedding; |
| 215 | } |
| 216 | |
| 217 | DecoderConfig load_decoder_config(const Qwen3TTSAssets & assets) { |
| 218 | const auto root = assets.resources.parse_json("speech_tokenizer_config"); |
| 219 | const auto & decoder = root.require("decoder_config"); |
| 220 | DecoderConfig config; |
| 221 | config.codebook_size = json::require_i64(decoder, "codebook_size"); |
| 222 | config.codebook_dim = json::require_i64(decoder, "codebook_dim"); |
| 223 | config.latent_dim = json::require_i64(decoder, "latent_dim"); |
| 224 | config.hidden_size = json::require_i64(decoder, "hidden_size"); |
| 225 | config.intermediate_size = json::require_i64(decoder, "intermediate_size"); |
| 226 | config.decoder_dim = json::require_i64(decoder, "decoder_dim"); |
| 227 | config.num_heads = json::require_i64(decoder, "num_attention_heads"); |
| 228 | config.num_kv_heads = json::require_i64(decoder, "num_key_value_heads"); |
| 229 | config.num_layers = json::require_i64(decoder, "num_hidden_layers"); |
| 230 | config.num_quantizers = json::require_i64(decoder, "num_quantizers"); |
| 231 | config.num_semantic_quantizers = json::require_i64(decoder, "num_semantic_quantizers"); |
| 232 | config.sliding_window = json::require_i64(decoder, "sliding_window"); |
| 233 | config.head_dim = json::require_i64(decoder, "head_dim"); |
| 234 | config.rope_theta = json::optional_f32(decoder, "rope_theta", config.rope_theta); |
| 235 | config.rms_norm_eps = json::optional_f32(decoder, "rms_norm_eps", config.rms_norm_eps); |
| 236 | config.upsample_rates = json::require_i64_array(decoder, "upsample_rates"); |
| 237 | config.upsampling_ratios = json::require_i64_array(decoder, "upsampling_ratios"); |
| 238 | return config; |
| 239 | } |
| 240 | |
| 241 | Conv1dWeights load_conv( |
no test coverage detected