From fb46aad9a511473510e4193cd8b741ae79bf3329 Mon Sep 17 00:00:00 2001 From: sharziki Date: Sat, 11 Apr 2026 00:01:14 -0400 Subject: [PATCH] fix: close file handles in from_local() config loading Use context managers when reading config.json in VoxCPMModel.from_local() and VoxCPM2Model.from_local() to prevent file descriptor leaks. Also add explicit encoding="utf-8" to avoid locale-dependent decode errors. Closes #235 Co-Authored-By: Claude Opus 4.6 --- src/voxcpm/model/voxcpm.py | 3 ++- src/voxcpm/model/voxcpm2.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/voxcpm/model/voxcpm.py b/src/voxcpm/model/voxcpm.py index 662a118..55c96e9 100644 --- a/src/voxcpm/model/voxcpm.py +++ b/src/voxcpm/model/voxcpm.py @@ -852,7 +852,8 @@ class VoxCPMModel(nn.Module): device: str | None = None, lora_config: LoRAConfig = None, ): - config = VoxCPMConfig.model_validate_json(open(os.path.join(path, "config.json")).read()) + with open(os.path.join(path, "config.json"), "r", encoding="utf-8") as _cfg_f: + config = VoxCPMConfig.model_validate_json(_cfg_f.read()) tokenizer = LlamaTokenizerFast.from_pretrained(path) audio_vae_config = getattr(config, "audio_vae_config", None) audio_vae = AudioVAE(config=audio_vae_config) if audio_vae_config else AudioVAE() diff --git a/src/voxcpm/model/voxcpm2.py b/src/voxcpm/model/voxcpm2.py index 268583b..3ef5592 100644 --- a/src/voxcpm/model/voxcpm2.py +++ b/src/voxcpm/model/voxcpm2.py @@ -1103,7 +1103,8 @@ class VoxCPM2Model(nn.Module): device: str | None = None, lora_config: LoRAConfig = None, ): - config = VoxCPMConfig.model_validate_json(open(os.path.join(path, "config.json")).read()) + with open(os.path.join(path, "config.json"), "r", encoding="utf-8") as _cfg_f: + config = VoxCPMConfig.model_validate_json(_cfg_f.read()) tokenizer = LlamaTokenizerFast.from_pretrained(path) audio_vae_config = getattr(config, "audio_vae_config", None) audio_vae = AudioVAEV2(config=audio_vae_config) if audio_vae_config else AudioVAEV2()