Skip to content

Commit e73c980

Browse files
authored
Promote shared MOSS runtime pieces (#332)
* Promote MOSS codec runtime to framework * Use shared HF sampler for MOSS models * Move MOSS token row builder into codec runtime
1 parent 3339be2 commit e73c980

45 files changed

Lines changed: 2283 additions & 2274 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ add_library(engine_core OBJECT
394394
src/framework/modules/activation_modules.cpp
395395
src/framework/modules/norm_modules.cpp
396396
src/framework/modules/lookup_modules.cpp
397+
src/framework/modules/multi_codebook_embedding.cpp
397398
src/framework/modules/structural_modules.cpp
398399
src/framework/modules/asr_helpers.cpp
399400
src/framework/modules/conv_modules.cpp
@@ -472,6 +473,7 @@ add_library(engine_core OBJECT
472473
src/framework/codecs/fish_dac_codec_runtime.cpp
473474
src/framework/codecs/mel_latent_vae44k_runtime.cpp
474475
src/framework/codecs/mimi_codec_runtime.cpp
476+
src/framework/codecs/moss_audio_tokenizer_codec_runtime.cpp
475477
src/framework/codecs/neural_audio.cpp
476478
src/framework/codecs/redae_codec_runtime.cpp
477479
src/framework/conditioners/clap_audio_conditioner_runtime.cpp
@@ -799,12 +801,6 @@ audiocpp_add_model(moss
799801
src/models/moss/moss_tts_nano/prompt_builder.cpp
800802
src/models/moss/moss_tts_nano/session.cpp
801803
src/models/moss/moss_tts_nano/tokenizer_text.cpp
802-
src/models/moss/shared/audio_tokenizer_decoder.cpp
803-
src/models/moss/shared/audio_tokenizer_encoder.cpp
804-
src/models/moss/shared/audio_tokenizer_config.cpp
805-
src/models/moss/shared/audio_tokenizer_quantizer.cpp
806-
src/models/moss/shared/sampling.cpp
807-
src/models/moss/shared/token_rows.cpp
808804
src/models/moss/moss_tts_local/depth_transformer.cpp
809805
src/models/moss/moss_tts_local/generator.cpp
810806
src/models/moss/moss_tts_local/loader.cpp
@@ -1195,8 +1191,6 @@ audiocpp_add_model(vietneu_tts
11951191
engine/community_models/vietneu_tts/loader.h
11961192
LOADERS
11971193
engine::models::vietneu_tts::make_vietneu_tts_loader
1198-
DEPENDS
1199-
moss
12001194
)
12011195
12021196
audiocpp_add_model(qwen3_asr

include/engine/community_models/moss_voicegen/delay_decoder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "engine/community_models/moss_voicegen/assets.h"
44
#include "engine/community_models/moss_voicegen/heads.h"
5+
#include "engine/framework/sampling/hf_sampler.h"
56

67
#include <cstdint>
78
#include <random>
@@ -68,8 +69,8 @@ class MossVoiceGenDelayDecoder {
6869
MossVoiceGenConfig config_;
6970
MossVoiceGenSamplingOptions sampling_;
7071
MossVoiceGenLengthBounds bounds_;
71-
uint32_t seed_ = 0;
7272
std::mt19937 rng_;
73+
engine::sampling::HfSamplerScratch sampler_scratch_;
7374
uint64_t sample_call_index_ = 0;
7475

7576
int64_t step_index_ = 0;

include/engine/community_models/moss_voicegen/session.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
#include "engine/community_models/moss_voicegen/heads.h"
77
#include "engine/community_models/moss_voicegen/tokenizer_text.h"
88
#include "engine/framework/core/execution_context.h"
9+
#include "engine/framework/codecs/moss_audio_tokenizer_codec_runtime.h"
10+
#include "engine/framework/modules/multi_codebook_embedding.h"
911
#include "engine/framework/runtime/session_base.h"
10-
#include "engine/models/moss/shared/audio_tokenizer_decoder.h"
11-
#include "engine/models/moss/shared/token_rows.h"
1212

1313
#include <cstddef>
1414
#include <memory>
@@ -63,10 +63,10 @@ class MossVoiceGenSession final
6363

6464
// The execution context comes from RuntimeSessionBase; the runtimes below borrow it.
6565
std::unique_ptr<MossVoiceGenTextProcessor> text_processor_;
66-
std::unique_ptr<moss::AudioCodebookEmbeddings> codebooks_;
66+
std::unique_ptr<engine::modules::MultiCodebookEmbedding> codebooks_;
6767
std::unique_ptr<MossVoiceGenBackboneRuntime> backbone_;
6868
std::unique_ptr<MossVoiceGenHeadsRuntime> heads_;
69-
std::unique_ptr<moss::MossAudioTokenizerDecoder> codec_;
69+
std::unique_ptr<engine::codecs::MossAudioTokenizerCodecRuntime> codec_;
7070
};
7171

7272
} // namespace engine::models::moss_voicegen

include/engine/community_models/moss_voicegen/tokenizer_text.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

33
#include "engine/community_models/moss_voicegen/assets.h"
4-
#include "engine/models/moss/shared/token_rows.h"
4+
#include "engine/framework/codecs/moss_audio_tokenizer_codec_runtime.h"
55

66
#include <memory>
77
#include <optional>
@@ -23,7 +23,7 @@ class MossVoiceGenTextProcessor {
2323

2424
// `instruction` describes the speaker to design. `language` must be the full language
2525
// name the model was trained on ("English", not "en"); an empty value renders "None".
26-
moss::TokenRows build_generation_prefix(
26+
engine::codecs::MossTokenRows build_generation_prefix(
2727
const std::string & text,
2828
const std::optional<std::string> & instruction,
2929
const std::optional<std::string> & language) const;

include/engine/community_models/vietneu_tts/session.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#include "engine/community_models/vietneu_tts/tokenizer_speech_encoder.h"
1111
#include "engine/community_models/vietneu_tts/tokenizer_text.h"
1212

13-
#include "engine/models/moss/shared/audio_tokenizer_decoder.h"
13+
#include "engine/framework/codecs/moss_audio_tokenizer_codec_runtime.h"
1414

1515
#include <cstddef>
1616
#include <cstdint>
@@ -80,7 +80,7 @@ class VietneuTTSSession final
8080
std::shared_ptr<const VietneuTalkerWeightsRuntime> talker_weights_;
8181
std::shared_ptr<VietneuTalkerStepRuntime> talker_step_;
8282
core::ExecutionContext voice_prompt_context_;
83-
std::unique_ptr<engine::models::moss::MossAudioTokenizerDecoder> moss_speech_decoder_;
83+
std::unique_ptr<engine::codecs::MossAudioTokenizerCodecRuntime> moss_speech_decoder_;
8484
std::unique_ptr<Qwen3SpeechTokenizerEncoderRuntime> speech_encoder_;
8585
std::unique_ptr<VietneuSpeakerEncoderRuntime> speaker_encoder_;
8686
runtime::CacheSlots<VoicePromptCacheKey, VoicePromptCacheEntry, VoicePromptCacheKeyEqual> voice_prompt_cache_;
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#pragma once
2+
3+
#include "engine/framework/assets/tensor_source.h"
4+
#include "engine/framework/core/execution_context.h"
5+
6+
#include <cstddef>
7+
#include <cstdint>
8+
#include <memory>
9+
#include <vector>
10+
11+
namespace engine::codecs {
12+
13+
struct MossAudioTokenizerTransformerStage {
14+
int64_t input_dimension = 0;
15+
int64_t output_dimension = 0;
16+
int64_t model_dimension = 0;
17+
int64_t num_heads = 0;
18+
int64_t num_layers = 0;
19+
int64_t feedforward_dimension = 0;
20+
int64_t context_window = 0;
21+
int64_t patch_size = 0;
22+
};
23+
24+
struct MossAudioTokenizerQuantizerConfig {
25+
int64_t codebook_size = 1024;
26+
int64_t codebook_dim = 8;
27+
int64_t rvq_dim = 512;
28+
int64_t code_dim = 768;
29+
int64_t num_quantizers = 12;
30+
};
31+
32+
struct MossAudioTokenizerConfig {
33+
int64_t sampling_rate = 48000;
34+
int64_t samples_per_frame = 3840;
35+
int64_t channels = 2;
36+
MossAudioTokenizerQuantizerConfig quantizer;
37+
std::vector<MossAudioTokenizerTransformerStage> encoder_stages;
38+
std::vector<MossAudioTokenizerTransformerStage> decoder_stages;
39+
int64_t encoder_final_patch = 1;
40+
int64_t decoder_initial_patch = 1;
41+
int64_t encoder_module_start = 1;
42+
int64_t encoder_module_stride = 2;
43+
int64_t decoder_module_start = 0;
44+
int64_t decoder_module_stride = 2;
45+
};
46+
47+
MossAudioTokenizerConfig moss_audio_tokenizer_v1_config();
48+
MossAudioTokenizerConfig moss_audio_tokenizer_v2_config();
49+
MossAudioTokenizerConfig moss_audio_tokenizer_nano_config();
50+
51+
struct MossAudioTokenizerAudio {
52+
int64_t sampling_rate = 0;
53+
std::vector<std::vector<float>> channels;
54+
};
55+
56+
struct MossAudioTokenizerCodes {
57+
int64_t frames = 0;
58+
std::vector<std::vector<int32_t>> codebooks;
59+
};
60+
61+
struct MossTokenRows {
62+
std::vector<int32_t> text_tokens;
63+
std::vector<int32_t> audio_codes;
64+
};
65+
66+
class MossTokenRowBuilder {
67+
public:
68+
MossTokenRowBuilder(int64_t num_codebooks, int32_t audio_pad_token_id);
69+
70+
void push_text_token(int32_t token_id);
71+
void push_text_tokens(const std::vector<int32_t> & token_ids);
72+
void push_audio_row(int32_t text_slot_token_id, const int32_t * codes, int64_t num_codebooks);
73+
void push_audio_row(int32_t text_slot_token_id, const std::vector<std::vector<int32_t>> & codes, int64_t frame);
74+
MossTokenRows finish();
75+
76+
private:
77+
int64_t num_codebooks_ = 0;
78+
int32_t audio_pad_token_id_ = 0;
79+
MossTokenRows rows_;
80+
};
81+
82+
struct MossAudioTokenizerCodecRuntimeOptions {
83+
size_t weight_context_bytes = 256ull * 1024ull * 1024ull;
84+
size_t encoder_graph_arena_bytes = 2048ull * 1024ull * 1024ull;
85+
size_t decoder_graph_arena_bytes = 1536ull * 1024ull * 1024ull;
86+
bool separate_encoder_context = false;
87+
};
88+
89+
class MossAudioTokenizerCodecRuntime {
90+
public:
91+
MossAudioTokenizerCodecRuntime(
92+
std::shared_ptr<const assets::TensorSource> source,
93+
core::ExecutionContext & execution_context,
94+
int64_t num_quantizers,
95+
MossAudioTokenizerCodecRuntimeOptions options,
96+
MossAudioTokenizerConfig config = moss_audio_tokenizer_v2_config());
97+
~MossAudioTokenizerCodecRuntime();
98+
99+
MossAudioTokenizerCodecRuntime(const MossAudioTokenizerCodecRuntime &) = delete;
100+
MossAudioTokenizerCodecRuntime & operator=(const MossAudioTokenizerCodecRuntime &) = delete;
101+
102+
int64_t sampling_rate() const noexcept;
103+
void prepare_encoder();
104+
void prepare_decoder();
105+
MossAudioTokenizerCodes encode(const MossAudioTokenizerAudio & audio);
106+
MossAudioTokenizerAudio decode(const MossAudioTokenizerCodes & codes);
107+
void release_runtime_graphs();
108+
109+
private:
110+
struct Impl;
111+
std::unique_ptr<Impl> impl_;
112+
};
113+
114+
} // namespace engine::codecs
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#pragma once
2+
3+
#include "engine/framework/assets/tensor_source.h"
4+
5+
#include <cstddef>
6+
#include <cstdint>
7+
#include <string>
8+
#include <vector>
9+
10+
namespace engine::modules {
11+
12+
struct MultiCodebookEmbeddingSpec {
13+
int64_t hidden_size = 0;
14+
int64_t num_codebooks = 0;
15+
int64_t vocab_size = 0;
16+
int64_t pad_token_id = 0;
17+
std::vector<int64_t> codebook_sizes;
18+
std::string tensor_prefix = "audio_embeddings";
19+
};
20+
21+
class MultiCodebookEmbedding {
22+
public:
23+
MultiCodebookEmbedding(const assets::TensorSource & source, MultiCodebookEmbeddingSpec spec);
24+
25+
int64_t hidden_size() const noexcept { return hidden_size_; }
26+
int64_t num_codebooks() const noexcept { return num_codebooks_; }
27+
int32_t pad_token_id() const noexcept { return pad_token_id_; }
28+
int64_t codebook_size(int64_t codebook) const;
29+
const float * embedding(int64_t codebook, int32_t code) const;
30+
void add_bias(const int32_t * codes, float * bias) const;
31+
std::vector<float> bias_for(const int32_t * codes) const;
32+
33+
private:
34+
int64_t hidden_size_ = 0;
35+
int64_t num_codebooks_ = 0;
36+
int32_t pad_token_id_ = 0;
37+
std::vector<std::vector<float>> embeddings_;
38+
};
39+
40+
} // namespace engine::modules

include/engine/models/moss/moss_tts_local/generator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "engine/models/moss/moss_tts_local/assets.h"
44
#include "engine/models/moss/moss_tts_local/backbone.h"
55
#include "engine/models/moss/moss_tts_local/depth_transformer.h"
6-
#include "engine/models/moss/shared/token_rows.h"
6+
#include "engine/framework/modules/multi_codebook_embedding.h"
77
#include "engine/framework/sampling/torch_random.h"
88

99
#include <cstddef>
@@ -65,7 +65,7 @@ class MossGenerator {
6565
const MossDepthTransformer & depth_;
6666
int64_t hidden_size_ = 0;
6767
int64_t num_codebooks_ = 0;
68-
std::unique_ptr<moss::AudioCodebookEmbeddings> audio_codebooks_;
68+
std::unique_ptr<engine::modules::MultiCodebookEmbedding> audio_codebooks_;
6969
std::vector<float> local_text_head_; // [2 * hidden]
7070
engine::sampling::TorchCudaSamplingPolicy sampling_policy_;
7171
struct ProjectionRuntime;

include/engine/models/moss/moss_tts_local/session.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
#include "engine/framework/runtime/cache_slots.h"
44
#include "engine/framework/runtime/session_base.h"
5-
#include "engine/models/moss/shared/audio_tokenizer_decoder.h"
6-
#include "engine/models/moss/shared/audio_tokenizer_encoder.h"
5+
#include "engine/framework/codecs/moss_audio_tokenizer_codec_runtime.h"
76
#include "engine/models/moss/moss_tts_local/assets.h"
87
#include "engine/models/moss/moss_tts_local/backbone.h"
98
#include "engine/models/moss/moss_tts_local/depth_transformer.h"
@@ -38,8 +37,6 @@ class MossTTSLocalSession final
3837
runtime::TaskResult run(const runtime::TaskRequest & request) override;
3938

4039
private:
41-
moss::MossAudioTokenizerEncoder & encoder();
42-
4340
struct ReferenceAudioCacheKey {
4441
uint64_t hash = 0;
4542
int sample_rate = 0;
@@ -62,11 +59,8 @@ class MossTTSLocalSession final
6259
std::unique_ptr<MossBackboneRuntime> backbone_;
6360
std::unique_ptr<MossDepthTransformer> depth_;
6461
std::unique_ptr<MossTextProcessor> processor_;
65-
std::unique_ptr<moss::MossAudioTokenizerDecoder> codec_;
62+
std::unique_ptr<engine::codecs::MossAudioTokenizerCodecRuntime> codec_;
6663
std::unique_ptr<MossGenerator> generator_;
67-
// Lazily built the first time a speaker reference is provided (voice cloning).
68-
std::unique_ptr<core::ExecutionContext> reference_encoder_execution_context_;
69-
std::unique_ptr<moss::MossAudioTokenizerEncoder> encoder_;
7064
runtime::CacheSlots<ReferenceAudioCacheKey, ReferenceVoiceCacheEntry, ReferenceAudioCacheKeyEqual>
7165
reference_voice_cache_;
7266
};

include/engine/models/moss/moss_tts_local/tokenizer_text.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22

3-
#include "engine/models/moss/shared/token_rows.h"
3+
#include "engine/framework/codecs/moss_audio_tokenizer_codec_runtime.h"
44
#include "engine/models/moss/moss_tts_local/assets.h"
55

66
#include <cstdint>
@@ -14,7 +14,7 @@ namespace engine::models::moss_tts_local {
1414
// Decoder input for a generation request: the text channel (input_ids[..., 0]) plus the
1515
// n_vq audio channels flattened row-major as [seq, n_vq] (input_ids[..., 1:]). Every audio
1616
// slot of the prompt carries audio_pad_token_id, matching MossTTSLocalProcessor._build_text_rows.
17-
using MossGenerationPrefix = moss::TokenRows;
17+
using MossGenerationPrefix = engine::codecs::MossTokenRows;
1818

1919
// Reproduces the direct-generation branch of MossTTSLocalProcessor: it renders the
2020
// <user_inst> template, byte-level BPE encodes each piece with the Qwen tokenizer, and
@@ -35,7 +35,7 @@ class MossTextProcessor {
3535
const std::optional<std::string> & language = std::nullopt) const;
3636

3737
// Builds a voice-clone prompt. reference_codes is [num_codebooks][frames] as produced
38-
// by MossAudioTokenizerEncoder for the reference speaker.
38+
// by the MOSS audio tokenizer codec runtime for the reference speaker.
3939
MossGenerationPrefix build_clone_prefix(
4040
const std::string & text,
4141
const std::vector<std::vector<int32_t>> & reference_codes,

0 commit comments

Comments
 (0)