Coverage for wrapper/vibevoice/configuration_vibevoice.py: 81%

113 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-09 04:47 +0000

1# mypy: ignore-errors 

2# Copy from https://github.com/microsoft/VibeVoice/blob/main/vibevoice/modular/configuration_vibevoice.py 

3 

4""" VibeVoice_AcousticTokenizer model configuration""" 

5 

6from typing import Any 

7from typing import List 

8from typing import Optional 

9 

10from transformers.configuration_utils import PretrainedConfig 

11from transformers.utils import logging 

12 

13from transformers.models.qwen2.configuration_qwen2 import Qwen2Config 

14 

15logger = logging.get_logger(__name__) 

16 

17 

18class VibeVoiceAcousticTokenizerConfig(PretrainedConfig): 

19 model_type = "vibevoice_acoustic_tokenizer" 

20 

21 def __init__( 

22 self, 

23 channels: int = 1, 

24 corpus_normalize: float = 0.0, 

25 causal: bool = True, 

26 vae_dim: int = 64, 

27 fix_std: float = 0.5, 

28 std_dist_type: str = 'gaussian', 

29 # common 

30 mixer_layer: str = 'depthwise_conv', 

31 conv_norm: str = 'none', 

32 pad_mode: str = 'constant', 

33 disable_last_norm: bool = True, 

34 layernorm: str = 'RMSNorm', 

35 layernorm_eps: float = 1e-5, 

36 layernorm_elementwise_affine: bool = True, 

37 conv_bias: bool = True, 

38 layer_scale_init_value: float = 1e-6, 

39 weight_init_value: float = 1e-2, 

40 # encoder specific 

41 encoder_n_filters: int = 32, 

42 encoder_ratios: Optional[List[int]] = [8, 5, 5, 4, 2, 2], 

43 encoder_depths: str = "3-3-3-3-3-3-8", 

44 # decoder specific 

45 decoder_n_filters: int = 32, 

46 decoder_ratios: Optional[List[int]] = None, # if None, same as encoder 

47 decoder_depths: Optional[str] = None, 

48 **kwargs: Any 

49 ) -> None: 

50 super().__init__(**kwargs) 

51 self.channels = channels 

52 self.corpus_normalize = corpus_normalize 

53 self.causal = causal 

54 self.vae_dim = vae_dim 

55 self.fix_std = fix_std 

56 self.std_dist_type = std_dist_type 

57 

58 # common parameters 

59 self.conv_norm = conv_norm 

60 self.pad_mode = pad_mode 

61 self.layernorm_eps = layernorm_eps 

62 self.disable_last_norm = disable_last_norm 

63 self.layernorm = layernorm 

64 self.layernorm_elementwise_affine = layernorm_elementwise_affine 

65 self.conv_bias = conv_bias 

66 self.layer_scale_init_value = layer_scale_init_value 

67 self.weight_init_value = weight_init_value 

68 self.mixer_layer = mixer_layer 

69 

70 # encoder specific parameters 

71 self.encoder_n_filters = encoder_n_filters 

72 self.encoder_ratios = encoder_ratios 

73 self.encoder_depths = encoder_depths 

74 

75 # decoder specific parameters 

76 self.decoder_ratios = decoder_ratios if decoder_ratios is not None else encoder_ratios 

77 self.decoder_n_filters = decoder_n_filters 

78 self.decoder_depths = decoder_depths 

79 

80 

81class VibeVoiceSemanticTokenizerConfig(PretrainedConfig): 

82 model_type = "vibevoice_semantic_tokenizer" 

83 

84 def __init__( 

85 self, 

86 channels: int = 1, 

87 corpus_normalize: float = 0.0, 

88 causal: bool = True, 

89 vae_dim: int = 64, 

90 fix_std: float = 0, 

91 std_dist_type: str = 'none', 

92 # common 

93 mixer_layer: str = 'depthwise_conv', 

94 conv_norm: str = 'none', 

95 pad_mode: str = 'constant', 

96 disable_last_norm: bool = True, 

97 layernorm: str = 'RMSNorm', 

98 layernorm_eps: float = 1e-5, 

99 layernorm_elementwise_affine: bool = True, 

100 conv_bias: bool = True, 

101 layer_scale_init_value: float = 1e-6, 

102 weight_init_value: float = 1e-2, 

103 # encoder specific 

104 encoder_n_filters: int = 32, 

105 encoder_ratios: Optional[List[int]] = [8, 5, 5, 4, 2, 2], 

106 encoder_depths: str = "3-3-3-3-3-3-8", 

107 **kwargs: Any 

108 ) -> None: 

109 super().__init__(**kwargs) 

110 self.channels = channels 

111 self.corpus_normalize = corpus_normalize 

112 self.causal = causal 

113 self.vae_dim = vae_dim 

114 self.fix_std = fix_std 

115 self.std_dist_type = std_dist_type 

116 

117 # common parameters 

118 self.conv_norm = conv_norm 

119 self.pad_mode = pad_mode 

120 self.layernorm_eps = layernorm_eps 

121 self.disable_last_norm = disable_last_norm 

122 self.layernorm = layernorm 

123 self.layernorm_elementwise_affine = layernorm_elementwise_affine 

124 self.conv_bias = conv_bias 

125 self.layer_scale_init_value = layer_scale_init_value 

126 self.weight_init_value = weight_init_value 

127 self.mixer_layer = mixer_layer 

128 

129 # encoder specific parameters 

130 self.encoder_n_filters = encoder_n_filters 

131 self.encoder_ratios = encoder_ratios 

132 self.encoder_depths = encoder_depths 

133 

134 

135class VibeVoiceDiffusionHeadConfig(PretrainedConfig): 

136 model_type = "vibevoice_diffusion_head" 

137 

138 def __init__( 

139 self, 

140 hidden_size: int = 768, 

141 head_layers: int = 4, 

142 head_ffn_ratio: float = 3.0, 

143 rms_norm_eps: float = 1e-5, 

144 latent_size: int = 64, 

145 speech_vae_dim: Optional[int] = None, 

146 prediction_type: str = "v_prediction", 

147 diffusion_type: str = "ddpm", 

148 ddpm_num_steps: int = 1000, 

149 ddpm_num_inference_steps: int = 20, 

150 ddpm_beta_schedule: str = "cosine", 

151 ddpm_batch_mul: int = 4, 

152 **kwargs: Any 

153 ) -> None: 

154 self.hidden_size = hidden_size 

155 self.head_layers = head_layers 

156 self.head_ffn_ratio = head_ffn_ratio 

157 self.rms_norm_eps = rms_norm_eps 

158 self.latent_size = latent_size 

159 self.speech_vae_dim = speech_vae_dim 

160 self.prediction_type = prediction_type 

161 self.diffusion_type = diffusion_type 

162 self.ddpm_num_steps = ddpm_num_steps 

163 self.ddpm_num_inference_steps = ddpm_num_inference_steps 

164 self.ddpm_beta_schedule = ddpm_beta_schedule 

165 self.ddpm_batch_mul = ddpm_batch_mul 

166 

167 super().__init__(**kwargs) 

168 

169 

170class VibeVoiceConfig(PretrainedConfig): 

171 model_type = "vibevoice" 

172 is_composition = True 

173 sub_configs = { 

174 "acoustic_tokenizer_config": VibeVoiceAcousticTokenizerConfig, 

175 "semantic_tokenizer_config": VibeVoiceSemanticTokenizerConfig, 

176 "decoder_config": Qwen2Config, 

177 "diffusion_head_config": VibeVoiceDiffusionHeadConfig, 

178 } 

179 # keys_to_ignore_at_inference = ["past_key_values"] 

180 # Default tensor parallel plan for base model `Qwen2` 

181 base_model_tp_plan = { 

182 "layers.*.self_attn.q_proj": "colwise", 

183 "layers.*.self_attn.k_proj": "colwise", 

184 "layers.*.self_attn.v_proj": "colwise", 

185 "layers.*.self_attn.o_proj": "rowwise", 

186 "layers.*.mlp.gate_proj": "colwise", 

187 "layers.*.mlp.up_proj": "colwise", 

188 "layers.*.mlp.down_proj": "rowwise", 

189 } 

190 

191 def __init__( 

192 self, 

193 acoustic_tokenizer_config: Optional[Any] = None, 

194 semantic_tokenizer_config: Optional[Any] = None, 

195 decoder_config: Optional[Any] = None, 

196 diffusion_head_config: Optional[Any] = None, 

197 **kwargs: Any 

198 ) -> None: 

199 # kwargs["_attn_implementation"] = "flash_attention_2" 

200 kwargs["_attn_implementation_autoset"] = False 

201 

202 if acoustic_tokenizer_config is None: 

203 self.acoustic_tokenizer_config = self.sub_configs["acoustic_tokenizer_config"]() 

204 elif isinstance(acoustic_tokenizer_config, dict): 

205 acoustic_tokenizer_config["model_type"] = "vibevoice_acoustic_tokenizer" 

206 self.acoustic_tokenizer_config = self.sub_configs["acoustic_tokenizer_config"](**acoustic_tokenizer_config) 

207 elif isinstance(acoustic_tokenizer_config, VibeVoiceAcousticTokenizerConfig): 

208 # If an instance of the config class is provided 

209 self.acoustic_tokenizer_config = acoustic_tokenizer_config 

210 

211 if semantic_tokenizer_config is None: 

212 self.semantic_tokenizer_config = self.sub_configs["semantic_tokenizer_config"]() 

213 elif isinstance(semantic_tokenizer_config, dict): 

214 semantic_tokenizer_config["model_type"] = "vibevoice_semantic_tokenizer" 

215 self.semantic_tokenizer_config = self.sub_configs["semantic_tokenizer_config"](**semantic_tokenizer_config) 

216 elif isinstance(semantic_tokenizer_config, VibeVoiceSemanticTokenizerConfig): 

217 # If an instance of the config class is provided 

218 self.semantic_tokenizer_config = semantic_tokenizer_config 

219 

220 if decoder_config is None: 

221 self.decoder_config = self.sub_configs["decoder_config"]() 

222 elif isinstance(decoder_config, dict): 

223 # If a dictionary is provided, instantiate the config class with it 

224 # self.decoder_config = self.sub_configs["decoder_config"](**decoder_config) 

225 if decoder_config.get("model_type", '') == "qwen2": 

226 self.decoder_config = Qwen2Config(**decoder_config) 

227 else: 

228 raise ValueError(f"Unsupported decoder model type: {decoder_config.get('model_type', '')}") 

229 elif isinstance(decoder_config, (Qwen2Config,)): 

230 # If an instance of the config class is provided 

231 self.decoder_config = decoder_config 

232 

233 if diffusion_head_config is None: 

234 self.diffusion_head_config = self.sub_configs["diffusion_head_config"]() 

235 elif isinstance(diffusion_head_config, dict): 

236 diffusion_head_config["model_type"] = "vibevoice_diffusion_head" 

237 self.diffusion_head_config = self.sub_configs["diffusion_head_config"](**diffusion_head_config) 

238 elif isinstance(diffusion_head_config, VibeVoiceDiffusionHeadConfig): 

239 # If an instance of the config class is provided 

240 self.diffusion_head_config = diffusion_head_config 

241 

242 # other parameters 

243 self.acoustic_vae_dim = getattr(self.acoustic_tokenizer_config, 'vae_dim', 64) 

244 self.semantic_vae_dim = getattr(self.semantic_tokenizer_config, 'vae_dim', 128) 

245 self.num_hidden_layers = self.decoder_config.num_hidden_layers 

246 

247 super().__init__(**kwargs) 

248 

249 

250__all__ = [ 

251 "VibeVoiceAcousticTokenizerConfig", 

252 "VibeVoiceSemanticTokenizerConfig", 

253 "VibeVoiceDiffusionHeadConfig", 

254 "VibeVoiceConfig" 

255]