From d30c1ed90279aafc654aa04103a95c869dda43ba Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:37:31 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .github/workflows/publish-to-pypi.yml | 54 + .gitignore | 7 + LICENSE | 201 + README.md | 692 +++ README.wehub.md | 7 + README_zh.md | 685 +++ app.py | 606 ++ app_old.py | 292 + assets/discord-logo.png | Bin 0 -> 9476 bytes assets/feishu-group.png | Bin 0 -> 215113 bytes assets/feishu-logo.png | Bin 0 -> 512 bytes assets/modelbest_logo.png | Bin 0 -> 55126 bytes assets/thuhcsi_logo.png | Bin 0 -> 10187 bytes assets/voxcpm2_model.png | Bin 0 -> 1164797 bytes assets/voxcpm_logo.png | Bin 0 -> 24487 bytes assets/voxcpm_model.png | Bin 0 -> 144982 bytes conf/voxcpm_v1.5/voxcpm_finetune_all.yaml | 21 + conf/voxcpm_v1.5/voxcpm_finetune_lora.yaml | 36 + conf/voxcpm_v1/voxcpm_finetune_all.yaml | 21 + conf/voxcpm_v1/voxcpm_finetune_lora.yaml | 36 + conf/voxcpm_v2/voxcpm_finetune_all.yaml | 23 + conf/voxcpm_v2/voxcpm_finetune_lora.yaml | 38 + examples/example.wav | Bin 0 -> 1439096 bytes examples/reference_speaker.wav | Bin 0 -> 1228844 bytes examples/train_data_example.jsonl | 6 + lora_ft_webui.py | 1327 +++++ pyproject.toml | 100 + scripts/test_pick_runtime_dtype.py | 109 + scripts/test_voxcpm_ft_infer.py | 146 + scripts/test_voxcpm_lora_infer.py | 276 + scripts/train_voxcpm_finetune.py | 841 +++ src/voxcpm/__init__.py | 5 + src/voxcpm/cli.py | 692 +++ src/voxcpm/core.py | 366 ++ src/voxcpm/model/__init__.py | 4 + src/voxcpm/model/utils.py | 242 + src/voxcpm/model/voxcpm.py | 1026 ++++ src/voxcpm/model/voxcpm2.py | 1279 ++++ src/voxcpm/modules/__init__.py | 0 src/voxcpm/modules/audiovae/__init__.py | 2 + src/voxcpm/modules/audiovae/audio_vae.py | 377 ++ src/voxcpm/modules/audiovae/audio_vae_v2.py | 579 ++ src/voxcpm/modules/layers/__init__.py | 1 + src/voxcpm/modules/layers/lora.py | 130 + .../layers/scalar_quantization_layer.py | 26 + src/voxcpm/modules/locdit/__init__.py | 3 + src/voxcpm/modules/locdit/local_dit.py | 114 + src/voxcpm/modules/locdit/local_dit_v2.py | 116 + src/voxcpm/modules/locdit/unified_cfm.py | 232 + src/voxcpm/modules/locenc/__init__.py | 1 + src/voxcpm/modules/locenc/local_encoder.py | 30 + src/voxcpm/modules/minicpm4/__init__.py | 3 + src/voxcpm/modules/minicpm4/cache.py | 47 + src/voxcpm/modules/minicpm4/config.py | 30 + src/voxcpm/modules/minicpm4/model.py | 431 ++ src/voxcpm/timestamps/__init__.py | 8 + src/voxcpm/timestamps/base.py | 33 + src/voxcpm/timestamps/postprocess.py | 33 + src/voxcpm/timestamps/stable_ts.py | 105 + src/voxcpm/training/__init__.py | 30 + src/voxcpm/training/accelerator.py | 163 + src/voxcpm/training/config.py | 38 + src/voxcpm/training/data.py | 256 + src/voxcpm/training/packers.py | 441 ++ src/voxcpm/training/state.py | 20 + src/voxcpm/training/tracker.py | 78 + src/voxcpm/training/validate.py | 296 + src/voxcpm/utils/text_normalize.py | 188 + src/voxcpm/zipenhancer.py | 72 + tests/test_cli.py | 736 +++ tests/test_lora_checkpoint_loading.py | 150 + tests/test_model_utils.py | 71 + tests/test_timestamps.py | 34 + tests/test_torch_load_safety.py | 85 + tests/test_validate.py | 254 + uv.lock | 5263 +++++++++++++++++ 76 files changed, 19614 insertions(+) create mode 100644 .github/workflows/publish-to-pypi.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 README_zh.md create mode 100644 app.py create mode 100644 app_old.py create mode 100644 assets/discord-logo.png create mode 100644 assets/feishu-group.png create mode 100644 assets/feishu-logo.png create mode 100644 assets/modelbest_logo.png create mode 100644 assets/thuhcsi_logo.png create mode 100644 assets/voxcpm2_model.png create mode 100644 assets/voxcpm_logo.png create mode 100644 assets/voxcpm_model.png create mode 100644 conf/voxcpm_v1.5/voxcpm_finetune_all.yaml create mode 100644 conf/voxcpm_v1.5/voxcpm_finetune_lora.yaml create mode 100644 conf/voxcpm_v1/voxcpm_finetune_all.yaml create mode 100644 conf/voxcpm_v1/voxcpm_finetune_lora.yaml create mode 100644 conf/voxcpm_v2/voxcpm_finetune_all.yaml create mode 100644 conf/voxcpm_v2/voxcpm_finetune_lora.yaml create mode 100644 examples/example.wav create mode 100644 examples/reference_speaker.wav create mode 100644 examples/train_data_example.jsonl create mode 100644 lora_ft_webui.py create mode 100644 pyproject.toml create mode 100644 scripts/test_pick_runtime_dtype.py create mode 100644 scripts/test_voxcpm_ft_infer.py create mode 100644 scripts/test_voxcpm_lora_infer.py create mode 100644 scripts/train_voxcpm_finetune.py create mode 100644 src/voxcpm/__init__.py create mode 100644 src/voxcpm/cli.py create mode 100644 src/voxcpm/core.py create mode 100644 src/voxcpm/model/__init__.py create mode 100644 src/voxcpm/model/utils.py create mode 100644 src/voxcpm/model/voxcpm.py create mode 100644 src/voxcpm/model/voxcpm2.py create mode 100644 src/voxcpm/modules/__init__.py create mode 100644 src/voxcpm/modules/audiovae/__init__.py create mode 100644 src/voxcpm/modules/audiovae/audio_vae.py create mode 100644 src/voxcpm/modules/audiovae/audio_vae_v2.py create mode 100644 src/voxcpm/modules/layers/__init__.py create mode 100644 src/voxcpm/modules/layers/lora.py create mode 100644 src/voxcpm/modules/layers/scalar_quantization_layer.py create mode 100644 src/voxcpm/modules/locdit/__init__.py create mode 100644 src/voxcpm/modules/locdit/local_dit.py create mode 100644 src/voxcpm/modules/locdit/local_dit_v2.py create mode 100644 src/voxcpm/modules/locdit/unified_cfm.py create mode 100644 src/voxcpm/modules/locenc/__init__.py create mode 100644 src/voxcpm/modules/locenc/local_encoder.py create mode 100644 src/voxcpm/modules/minicpm4/__init__.py create mode 100644 src/voxcpm/modules/minicpm4/cache.py create mode 100644 src/voxcpm/modules/minicpm4/config.py create mode 100644 src/voxcpm/modules/minicpm4/model.py create mode 100644 src/voxcpm/timestamps/__init__.py create mode 100644 src/voxcpm/timestamps/base.py create mode 100644 src/voxcpm/timestamps/postprocess.py create mode 100644 src/voxcpm/timestamps/stable_ts.py create mode 100644 src/voxcpm/training/__init__.py create mode 100644 src/voxcpm/training/accelerator.py create mode 100644 src/voxcpm/training/config.py create mode 100644 src/voxcpm/training/data.py create mode 100644 src/voxcpm/training/packers.py create mode 100644 src/voxcpm/training/state.py create mode 100644 src/voxcpm/training/tracker.py create mode 100644 src/voxcpm/training/validate.py create mode 100644 src/voxcpm/utils/text_normalize.py create mode 100644 src/voxcpm/zipenhancer.py create mode 100644 tests/test_cli.py create mode 100644 tests/test_lora_checkpoint_loading.py create mode 100644 tests/test_model_utils.py create mode 100644 tests/test_timestamps.py create mode 100644 tests/test_torch_load_safety.py create mode 100644 tests/test_validate.py create mode 100644 uv.lock diff --git a/.github/workflows/publish-to-pypi.yml b/.github/workflows/publish-to-pypi.yml new file mode 100644 index 0000000..fd658ce --- /dev/null +++ b/.github/workflows/publish-to-pypi.yml @@ -0,0 +1,54 @@ +name: Publish Python ๐Ÿ distribution ๐Ÿ“ฆ to PyPI + +on: + release: + types: [created] + +jobs: + build: + name: Build distribution ๐Ÿ“ฆ + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Install pypa/build + run: >- + python3 -m + pip install + build + --user + - name: Build a binary wheel and a source tarball + run: python3 -m build + - name: Store the distribution packages + uses: actions/upload-artifact@v4 + with: + name: python-package-distributions + path: dist/ + + publish-to-pypi: + name: >- + Publish Python ๐Ÿ distribution ๐Ÿ“ฆ to PyPI + if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes + needs: + - build + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/p/voxcpm + permissions: + id-token: write + + steps: + - name: Download all the dists + uses: actions/download-artifact@v4 + with: + name: python-package-distributions + path: dist/ + - name: Publish distribution ๐Ÿ“ฆ to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7fa981 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +launch.json +.venv/ +__pycache__ +voxcpm.egg-info +.DS_Store +./pretrained_models/ +app_local.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..abd7fd6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright OpenBMB + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b20199 --- /dev/null +++ b/README.md @@ -0,0 +1,692 @@ +

VoxCPM2: Tokenizer-Free TTS for Multilingual Speech Generation, Creative Voice Design, and True-to-Life Cloning

+ +

+ English | ไธญๆ–‡ +

+ +

+ Project Page + Live Playground + Documentation + Hugging Face + ModelScope + DemoPage + VoxCPM2 Technical Report +

+ +
+ VoxCPM Logo +

+ OpenBMB%2FVoxCPM | Trendshift +
+ +
+ +

+ ๐Ÿ‘‹ Join our community for discussion and support! +
+ + Feishu + +  |  + + Discord + +

+ +VoxCPM is a **tokenizer-free** Text-to-Speech system that directly generates continuous speech representations via an end-to-end **diffusion autoregressive architecture**, bypassing discrete tokenization to achieve highly natural and expressive synthesis. + +**VoxCPM2** is the latest major release โ€” a **2B** parameter model trained on **over 2 million hours** of multilingual speech data, now supporting **30 languages**, **Voice Design**, **Controllable Voice Cloning**, and **48kHz** studio-quality audio output. Built on a [MiniCPM-4](https://github.com/OpenBMB/MiniCPM) backbone. + +### โœจ Highlights + +- ๐ŸŒ **30-Language Multilingual** โ€” Input text in any of the 30 supported languages and synthesize directly, no language tag needed +- ๐ŸŽจ **Voice Design** โ€” Create a brand-new voice from a natural-language description alone (gender, age, tone, emotion, pace โ€ฆ), no reference audio required +- ๐ŸŽ›๏ธ **Controllable Cloning** โ€” Clone any voice from a short reference clip, with optional style guidance to steer emotion, pace, and expression while preserving the original timbre +- ๐ŸŽ™๏ธ **Ultimate Cloning** โ€” Reproduce every vocal nuance: provide both reference audio and its transcript, and the model continues seamlessly from the reference, faithfully preserving every vocal detail โ€” timbre, rhythm, emotion, and style (same as VoxCPM1.5) +- ๐Ÿ”Š **48kHz High-Quality Audio** โ€” Accepts 16kHz reference audio and directly outputs 48kHz studio-quality audio via AudioVAE V2's asymmetric encode/decode design, with built-in super-resolution โ€” no external upsampler needed +- ๐Ÿง  **Context-Aware Synthesis** โ€” Automatically infers appropriate prosody and expressiveness from text content +- โšก **Real-Time Streaming** โ€” RTF as low as ~0.3 on NVIDIA RTX 4090, and ~0.13 accelerated by [Nano-vLLM](https://github.com/a710128/nanovllm-voxcpm) or [vLLM-Omni](https://github.com/vllm-project/vllm-omni) โ€” official vLLM omni-modal serving for VoxCPM2 with PagedAttention and an OpenAI-compatible API +- ๐Ÿ“œ **Fully Open-Source & Commercial-Ready** โ€” Weights and code released under the [Apache-2.0](LICENSE) license, free for commercial use + +**๐ŸŒ Supported Languages (30)** +Arabic, Burmese, Chinese, Danish, Dutch, English, Finnish, French, German, Greek, Hebrew, Hindi, Indonesian, Italian, Japanese, Khmer, Korean, Lao, Malay, Norwegian, Polish, Portuguese, Russian, Spanish, Swahili, Swedish, Tagalog, Thai, Turkish, Vietnamese + +Chinese Dialect: ๅ››ๅท่ฏ, ็ฒค่ฏญ, ๅด่ฏญ, ไธœๅŒ—่ฏ, ๆฒณๅ—่ฏ, ้™•่ฅฟ่ฏ, ๅฑฑไธœ่ฏ, ๅคฉๆดฅ่ฏ, ้—ฝๅ—่ฏ + +### News + +- **[2026.04]** ๐Ÿ”ฅ We release **VoxCPM2** โ€” 2B, 30 languages, Voice Design & Controllable Voice Cloning, 48kHz audio output! [Weights](https://huggingface.co/openbmb/VoxCPM2) | [Docs](https://voxcpm.readthedocs.io/en/latest/) | [Playground](https://huggingface.co/spaces/OpenBMB/VoxCPM-Demo) | [Technical Report](https://arxiv.org/abs/2606.06928) +- **[2025.12]** ๐ŸŽ‰ Open-source **VoxCPM1.5** [weights](https://huggingface.co/openbmb/VoxCPM1.5) with SFT & LoRA fine-tuning. (**๐Ÿ† #1 GitHub Trending**) +- **[2025.09]** ๐Ÿ”ฅ Release VoxCPM [Technical Report](https://arxiv.org/abs/2509.24650). +- **[2025.09]** ๐ŸŽ‰ Open-source **VoxCPM-0.5B** [weights](https://huggingface.co/openbmb/VoxCPM-0.5B) (**๐Ÿ† #1 HuggingFace Trending**) + +--- + +## Contents + +- [Quick Start](#-quick-start) + - [Installation](#installation) + - [Python API](#python-api) + - [CLI Usage](#cli-usage) + - [Web Demo](#web-demo) + - [Production Deployment](#-production-deployment-nano-vllm) + - [On-Device Inference (llama.cpp-omni)](#-on-device-inference-llamacpp-omni) +- [Models & Versions](#-models--versions) +- [Performance](#-performance) +- [Fine-tuning](#%EF%B8%8F-fine-tuning) +- [Documentation](#-documentation) +- [Ecosystem & Community](#-ecosystem--community) +- [Risks and Limitations](#%EF%B8%8F-risks-and-limitations) +- [Citation](#-citation) + +--- + +## ๐Ÿš€ Quick Start + +### Installation + +```sh +pip install voxcpm +``` + +> **Requirements:** Python โ‰ฅ 3.10 (<3.13), PyTorch โ‰ฅ 2.5.0, CUDA โ‰ฅ 12.0. See [Quick Start Docs](https://voxcpm.readthedocs.io/en/latest/quickstart.html) for details. + +### Python API + +#### ๐Ÿ—ฃ๏ธ Text-to-Speech + +```python +from voxcpm import VoxCPM +import soundfile as sf + +model = VoxCPM.from_pretrained( + "openbmb/VoxCPM2", + load_denoiser=False, +) + +wav = model.generate( + text="VoxCPM2 is the current recommended release for realistic multilingual speech synthesis.", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("demo.wav", wav, model.tts_model.sample_rate) +print("saved: demo.wav") +``` + +If you prefer downloading from ModelScope first, you can use: + +```bash +pip install modelscope +``` + +```python +from modelscope import snapshot_download +snapshot_download("OpenBMB/VoxCPM2", local_dir='./pretrained_models/VoxCPM2') # specify the local directory to save the model + +from voxcpm import VoxCPM +import soundfile as sf +model = VoxCPM.from_pretrained("./pretrained_models/VoxCPM2", load_denoiser=False) + +wav = model.generate( + text="VoxCPM2 is the current recommended release for realistic multilingual speech synthesis.", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("demo.wav", wav, model.tts_model.sample_rate) +``` + +#### ๐ŸŽจ Voice Design + +Create a voice from a natural-language description โ€” no reference audio needed. **Format:** put the description in parentheses at the start of `text`(e.g. `"(your voice description)The text to synthesize."`): + +```python +wav = model.generate( + text="(A young woman, gentle and sweet voice)Hello, welcome to VoxCPM2!", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("voice_design.wav", wav, model.tts_model.sample_rate) +``` + +#### ๐ŸŽ›๏ธ Controllable Voice Cloning + +Upload a reference audio. The model clones the timbre, and you can still use control instructions to adjust speed, emotion, or style. + +```python +wav = model.generate( + text="This is a cloned voice generated by VoxCPM2.", + reference_wav_path="path/to/voice.wav", +) +sf.write("clone.wav", wav, model.tts_model.sample_rate) + +wav = model.generate( + text="(slightly faster, cheerful tone)This is a cloned voice with style control.", + reference_wav_path="path/to/voice.wav", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("controllable_clone.wav", wav, model.tts_model.sample_rate) +``` + +#### ๐ŸŽ™๏ธ Ultimate Cloning + +Provide both the reference audio and its exact transcript for audio-continuation-based cloning with every vocal nuance reproduced. For maximum cloning similarity, pass the same reference clip to both `reference_wav_path` and `prompt_wav_path` as shown below: + +```python +wav = model.generate( + text="This is an ultimate cloning demonstration using VoxCPM2.", + prompt_wav_path="path/to/voice.wav", + prompt_text="The transcript of the reference audio.", + reference_wav_path="path/to/voice.wav", # optional, for better simliarity +) +sf.write("hifi_clone.wav", wav, model.tts_model.sample_rate) +``` + +**๐Ÿ”„ Streaming API** + +```python +import numpy as np + +chunks = [] +for chunk in model.generate_streaming( + text="Streaming text to speech is easy with VoxCPM!", +): + chunks.append(chunk) +wav = np.concatenate(chunks) +sf.write("streaming.wav", wav, model.tts_model.sample_rate) +``` + + + +### CLI Usage + +```bash +# Voice design (no reference audio needed) +voxcpm design \ + --text "VoxCPM2 brings studio-quality multilingual speech synthesis." \ + --output out.wav + +# Controllable voice cloning with style control +voxcpm design \ + --text "VoxCPM2 brings studio-quality multilingual speech synthesis." \ + --control "Young female voice, warm and gentle, slightly smiling" \ + --seed 42 \ + --output out.wav + +# Voice cloning (reference audio) +voxcpm clone \ + --text "This is a voice cloning demo." \ + --reference-audio path/to/voice.wav \ + --output out.wav + +# Ultimate cloning (prompt audio + transcript) +voxcpm clone \ + --text "This is a voice cloning demo." \ + --prompt-audio path/to/voice.wav \ + --prompt-text "reference transcript" \ + --reference-audio path/to/voice.wav \ # optional, for better simliarity + --output out.wav + +# Batch processing +voxcpm batch --input examples/input.txt --output-dir outs + +# Optional post-generation timestamps with stable-ts +pip install "voxcpm[timestamps]" +voxcpm design \ + --text "VoxCPM2 brings studio-quality multilingual speech synthesis." \ + --output out.wav \ + --timestamps \ + --timestamp-level word \ + --timestamp-language en + +# Character timestamps are best-effort and are derived from word alignment +voxcpm design \ + --text "ๆฌข่ฟŽไฝฟ็”จ VoxCPM2ใ€‚" \ + --output out.wav \ + --timestamps \ + --timestamp-level char \ + --timestamp-language zh + +# Help +voxcpm --help +``` + +### Web Demo + +```bash +python app.py --port 8808 # then open in browser: http://localhost:8808 +``` + +Use `--device` to choose the runtime device: + +```bash +python app.py --device auto +``` + +Supported values are `auto`, `cpu`, `mps`, `cuda`, and `cuda:N`. On Apple Silicon Macs, `auto` uses MPS when available. + +### ๐Ÿšข Production Deployment (Nano-vLLM) + +For high-throughput serving, use **[Nano-vLLM-VoxCPM](https://github.com/a710128/nanovllm-voxcpm)** โ€” a dedicated inference engine built on Nano-vLLM with concurrent request support and an async API. + +```bash +pip install nano-vllm-voxcpm +``` + +```python +from nanovllm_voxcpm import VoxCPM +import numpy as np, soundfile as sf + +server = VoxCPM.from_pretrained(model="/path/to/VoxCPM", devices=[0]) +chunks = list(server.generate(target_text="Hello from VoxCPM!")) +sf.write("out.wav", np.concatenate(chunks), 48000) +server.stop() +``` + +> **RTF as low as ~0.13 on NVIDIA RTX 4090** (vs ~0.3 with the standard PyTorch implementation), with support for batched concurrent requests and a FastAPI HTTP server. See the [Nano-vLLM-VoxCPM repo](https://github.com/a710128/nanovllm-voxcpm) for deployment details. + +### ๐Ÿญ Production Serving (vLLM-Omni) + +For production multi-tenant deployments, use **[vLLM-Omni](https://github.com/vllm-project/vllm-omni)** โ€” the official vLLM project's omni-modal extension with native **VoxCPM2** support. PagedAttention KV cache, continuous batching, and a drop-in **OpenAI-compatible** `/v1/audio/speech` endpoint. + +```bash +# Install from source (latest main โ€” vllm-omni is rapidly evolving) +uv pip install vllm==0.19.0 --torch-backend=auto +git clone https://github.com/vllm-project/vllm-omni.git && cd vllm-omni +uv pip install -e . +``` + +See the [vLLM-Omni installation guide](https://vllm-omni.readthedocs.io/en/latest/getting_started/installation/) for other platforms (ROCm, XPU, MUSA, NPU) and Docker images. + +```bash +# Launch an OpenAI-compatible TTS server (--omni enables omni-modal serving) +vllm serve openbmb/VoxCPM2 --omni --port 8000 + +# Call it from any OpenAI client +curl http://localhost:8000/v1/audio/speech \ + -H "Content-Type: application/json" \ + -d '{"model":"openbmb/VoxCPM2","input":"Hello from VoxCPM2 on vLLM-Omni!","voice":"default"}' \ + --output out.wav +``` + +> Built on the upstream vLLM scheduler, with batched concurrent requests, streaming chunk delivery, and multi-GPU deployment out of the box. See the [VoxCPM2 example](https://github.com/vllm-project/vllm-omni/tree/main/examples/online_serving/voxcpm2) for full deployment recipes. + +### ๐Ÿ“ฑ On-Device Inference (llama.cpp-omni) + +For on-device / edge deployment without Python, use **[llama.cpp-omni](https://github.com/tc-mb/llama.cpp-omni)** โ€” a high-performance C++ inference engine built on llama.cpp, with native VoxCPM2 GGUF support on **CPU / Metal / CUDA / Vulkan**. + +**1. Download GGUF weights** from [HuggingFace](https://huggingface.co/DennisHuang648/VoxCPM2-GGUF) | [ModelScope](https://modelscope.cn/models/DennisHuang/VoxCPM2-GGUF) โ€” you need one **BaseLM** (F16 or Q8_0) + the **Acoustic** file. Q8_0 halves the download with negligible quality loss. + +**2. Build** + +```bash +git clone https://github.com/tc-mb/llama.cpp-omni.git && cd llama.cpp-omni +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build --target voxcpm2-cli -j +``` + +> CMake auto-detects Metal (macOS) or CUDA (Linux with NVIDIA GPU). + +**3. Run** + +```bash +# Basic TTS +./build/bin/voxcpm2-cli \ + -t "Hello, this is VoxCPM2 running through llama.cpp-omni." \ + -o output.wav VoxCPM2-BaseLM-Q8_0.gguf VoxCPM2-Acoustic-F16.gguf + +# Voice cloning (reference audio) +./build/bin/voxcpm2-cli \ + -t "Cloned voice." -r speaker.wav -o clone.wav \ + VoxCPM2-BaseLM-Q8_0.gguf VoxCPM2-Acoustic-F16.gguf + +# Ultimate cloning (reference audio + transcript) +./build/bin/voxcpm2-cli \ + -t "Target text." --prompt-wav speaker.wav --prompt-text "transcript of speaker.wav" \ + -o clone.wav VoxCPM2-BaseLM-Q8_0.gguf VoxCPM2-Acoustic-F16.gguf +``` + +> **RTF ~1.76 (Q8_0) on Apple M4 Pro / Metal.** Key flags: `--cfg` (guidance scale), `--timesteps` (CFM steps), `--seed`, `--temperature`, `--stream`. See the [llama.cpp-omni repo](https://github.com/tc-mb/llama.cpp-omni) and [GGUF weights page](https://huggingface.co/DennisHuang648/VoxCPM2-GGUF) for full details. + +> **Full parameter reference, multi-scenario examples, and voice cloning tips โ†’** [Quick Start Guide](https://voxcpm.readthedocs.io/en/latest/quickstart.html) | [Usage Guide](https://voxcpm.readthedocs.io/en/latest/usage_guide.html) | [Cookbook](https://voxcpm.readthedocs.io/en/latest/cookbook.html) + +--- + +## ๐Ÿ“ฆ Models & Versions + + +| | **VoxCPM2** | **VoxCPM1.5** | **VoxCPM-0.5B** | +| ------------------------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| **Status** | ๐ŸŸข Latest | Stable | Legacy | +| **Backbone Parameters** | 2B | 0.6B | 0.5B | +| **Audio Sample Rate** | 48kHz | 44.1kHz | 16kHz | +| **LM Token Rate** | 6.25Hz | 6.25Hz | 12.5Hz | +| **Languages** | 30 | 2 (zh, en) | 2 (zh, en) | +| **Cloning Mode** | Isolated Reference & Continuation | Continuation only | Continuation only | +| **Voice Design** | โœ… | โ€” | โ€” | +| **Controllable Voice Cloning** | โœ… | โ€” | โ€” | +| **SFT / LoRA** | โœ… | โœ… | โœ… | +| **RTF (RTX 4090)** | ~0.30 | ~0.15 | ~0.17 | +| **RTF in Nano-VLLM (RTX 4090)** | ~0.13 | ~0.08 | ~0.10 | +| **VRAM** | ~8 GB | ~6 GB | ~5 GB | +| **Weights** | [๐Ÿค— HF](https://huggingface.co/openbmb/VoxCPM2) / [MS](https://modelscope.cn/models/OpenBMB/VoxCPM2) | [๐Ÿค— HF](https://huggingface.co/openbmb/VoxCPM1.5) / [MS](https://modelscope.cn/models/OpenBMB/VoxCPM1.5) | [๐Ÿค— HF](https://huggingface.co/openbmb/VoxCPM-0.5B) / [MS](https://modelscope.cn/models/OpenBMB/VoxCPM-0.5B) | +| **Technical Report** | [arXiv](https://arxiv.org/abs/2606.06928) | โ€” | [arXiv](https://arxiv.org/abs/2509.24650) [ICLR 2026](https://openreview.net/forum?id=h5KLpGoqzC) | +| **Demo Page** | [Audio Samples](https://openbmb.github.io/voxcpm2-demopage) | โ€” | [Audio Samples](https://openbmb.github.io/VoxCPM-demopage) | + + +VoxCPM2 is built on a **tokenizer-free, diffusion autoregressive** paradigm. The model operates entirely in the latent space of **AudioVAE V2**, following a four-stage pipeline: **LocEnc โ†’ TSLM โ†’ RALM โ†’ LocDiT**, enabling rich expressiveness and 48kHz native audio output. + +
+ VoxCPM2 Model Architecture +
+ +> For full architectural details, VoxCPM2-specific upgrades, and a model comparison table, see the [Architecture Design](https://voxcpm.readthedocs.io/en/latest/models/architecture.html). + +--- + +## ๐Ÿ“Š Performance + +VoxCPM2 achieves state-of-the-art or comparable results on public zero-shot and controllable TTS benchmarks. + +### Seed-TTS-eval + +**Seed-TTS-eval WER(โฌ‡)&SIM(โฌ†) Results (click to expand)** + + +| Model | Parameters | Open-Source | test-EN | | test-ZH | | test-Hard | | +| ----------------- | ---------- | ----------- | ------- | ------ | ------- | ------ | --------- | ------ | +| | | | WER/%โฌ‡ | SIM/%โฌ† | CER/%โฌ‡ | SIM/%โฌ† | CER/%โฌ‡ | SIM/%โฌ† | +| MegaTTS3 | 0.5B | โŒ | 2.79 | 77.1 | 1.52 | 79.0 | - | - | +| DiTAR | 0.6B | โŒ | 1.69 | 73.5 | 1.02 | 75.3 | - | - | +| CosyVoice3 | 0.5B | โŒ | 2.02 | 71.8 | 1.16 | 78.0 | 6.08 | 75.8 | +| CosyVoice3 | 1.5B | โŒ | 2.22 | 72.0 | 1.12 | 78.1 | 5.83 | 75.8 | +| Seed-TTS | - | โŒ | 2.25 | 76.2 | 1.12 | 79.6 | 7.59 | 77.6 | +| MiniMax-Speech | - | โŒ | 1.65 | 69.2 | 0.83 | 78.3 | - | - | +| F5-TTS | 0.3B | โœ… | 2.00 | 67.0 | 1.53 | 76.0 | 8.67 | 71.3 | +| MaskGCT | 1B | โœ… | 2.62 | 71.7 | 2.27 | 77.4 | - | - | +| CosyVoice | 0.3B | โœ… | 4.29 | 60.9 | 3.63 | 72.3 | 11.75 | 70.9 | +| CosyVoice2 | 0.5B | โœ… | 3.09 | 65.9 | 1.38 | 75.7 | 6.83 | 72.4 | +| SparkTTS | 0.5B | โœ… | 3.14 | 57.3 | 1.54 | 66.0 | - | - | +| FireRedTTS | 0.5B | โœ… | 3.82 | 46.0 | 1.51 | 63.5 | 17.45 | 62.1 | +| FireRedTTS-2 | 1.5B | โœ… | 1.95 | 66.5 | 1.14 | 73.6 | - | - | +| Qwen2.5-Omni | 7B | โœ… | 2.72 | 63.2 | 1.70 | 75.2 | 7.97 | 74.7 | +| Qwen3-Omni | 30B-A3B | โœ… | 1.39 | - | 1.07 | - | - | - | +| OpenAudio-s1-mini | 0.5B | โœ… | 1.94 | 55.0 | 1.18 | 68.5 | 23.37 | 64.3 | +| IndexTTS2 | 1.5B | โœ… | 2.23 | 70.6 | 1.03 | 76.5 | 7.12 | 75.5 | +| VibeVoice | 1.5B | โœ… | 3.04 | 68.9 | 1.16 | 74.4 | - | - | +| HiggsAudio-v2 | 3B | โœ… | 2.44 | 67.7 | 1.50 | 74.0 | 55.07 | 65.6 | +| VoxCPM-0.5B | 0.6B | โœ… | 1.85 | 72.9 | 0.93 | 77.2 | 8.87 | 73.0 | +| VoxCPM1.5 | 0.8B | โœ… | 2.12 | 71.4 | 1.18 | 77.0 | 7.74 | 73.1 | +| MOSS-TTS | | โœ… | 1.85 | 73.4 | 1.20 | 78.8 | - | - | +| Qwen3-TTS | 1.7B | โœ… | 1.23 | 71.7 | 1.22 | 77.0 | 6.76 | 74.8 | +| FishAudio S2 | 4B | โœ… | 0.99 | - | 0.54 | - | 5.99 | - | +| LongCat-Audio-DiT | 3.5B | โœ… | 1.50 | 78.6 | 1.09 | 81.8 | 6.04 | 79.7 | +| **VoxCPM2** | 2B | โœ… | 1.84 | 75.3 | 0.97 | 79.5 | 8.13 | 75.3 | + + + + +### CV3-eval + +**CV3-eval Multilingual WER/CER(โฌ‡) Results (click to expand)** + + +| Model | zh | en | hard-zh | hard-en | ja | ko | de | es | fr | it | ru | +| --------------- | ---- | ---- | ------- | ------- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | +| CosyVoice2 | 4.08 | 6.32 | 12.58 | 11.96 | 9.13 | 19.7 | - | - | - | - | - | +| CosyVoice3-1.5B | 3.91 | 4.99 | 9.77 | 10.55 | 7.57 | 5.69 | 6.43 | 4.47 | 11.8 | 10.5 | 6.64 | +| Fish Audio S2 | 2.65 | 2.43 | 9.10 | 4.40 | 3.96 | 2.76 | 2.22 | 2.00 | 6.26 | 2.04 | 2.78 | +| **VoxCPM2** | 3.65 | 5.00 | 8.55 | 8.48 | 5.96 | 5.69 | 4.77 | 3.80 | 9.85 | 4.25 | 5.21 | + + + + +### MiniMax-Multilingual-Test + +**Minimax-MLS-test WER(โฌ‡) Results (click to expand)** + + +| Language | Minimax | ElevenLabs | Qwen3-TTS | FishAudio S2 | **VoxCPM2** | +| ---------- | --------- | ---------- | --------- | ------------ | ----------- | +| Arabic | **1.665** | 1.666 | โ€“ | 3.500 | 13.046 | +| Cantonese | 34.111 | 51.513 | โ€“ | **30.670** | 38.584 | +| Chinese | 2.252 | 16.026 | 0.928 | **0.730** | 1.136 | +| Czech | 3.875 | **2.108** | โ€“ | 2.840 | 24.132 | +| Dutch | 1.143 | **0.803** | โ€“ | 0.990 | 0.913 | +| English | 2.164 | 2.339 | **0.934** | 1.620 | 2.289 | +| Finnish | 4.666 | 2.964 | โ€“ | 3.330 | **2.632** | +| French | 4.099 | 5.216 | **2.858** | 3.050 | 4.534 | +| German | 1.906 | 0.572 | 1.235 | **0.550** | 0.679 | +| Greek | 2.016 | **0.991** | โ€“ | 5.740 | 2.844 | +| Hindi | 6.962 | **5.827** | โ€“ | 14.640 | 19.699 | +| Indonesian | 1.237 | **1.059** | โ€“ | 1.460 | 1.084 | +| Italian | 1.543 | 1.743 | **0.948** | 1.270 | 1.563 | +| Japanese | 3.519 | 10.646 | 3.823 | **2.760** | 4.628 | +| Korean | 1.747 | 1.865 | 1.755 | **1.180** | 1.962 | +| Polish | 1.415 | **0.766** | โ€“ | 1.260 | 1.141 | +| Portuguese | 1.877 | 1.331 | 1.526 | **1.140** | 1.938 | +| Romanian | 2.878 | **1.347** | โ€“ | 10.740 | 21.577 | +| Russian | 4.281 | 3.878 | 3.212 | **2.400** | 3.634 | +| Spanish | 1.029 | 1.084 | 1.126 | **0.910** | 1.438 | +| Thai | 2.701 | 73.936 | โ€“ | 4.230 | 2.961 | +| Turkish | 1.52 | 0.699 | โ€“ | 0.870 | 0.817 | +| Ukrainian | 1.082 | **0.997** | โ€“ | 2.300 | 6.316 | +| Vietnamese | **0.88** | 73.415 | โ€“ | 7.410 | 3.307 | + + + + +**Minimax-MLS-test SIM(โฌ†) Results (click to expand)** + + +| Language | Minimax | ElevenLabs | Qwen3-TTS | FishAudio S2 | **VoxCPM2** | +| ---------- | -------- | ---------- | --------- | ------------ | ----------- | +| Arabic | 73.6 | 70.6 | โ€“ | 75.0 | **79.1** | +| Cantonese | 77.8 | 67.0 | โ€“ | 80.5 | **83.5** | +| Chinese | 78.0 | 67.7 | 79.9 | 81.6 | **82.5** | +| Czech | 79.6 | 68.5 | โ€“ | **79.8** | 78.3 | +| Dutch | 73.8 | 68.0 | โ€“ | 73.0 | **80.8** | +| English | 75.6 | 61.3 | 77.5 | 79.7 | **85.4** | +| Finnish | 83.5 | 75.9 | โ€“ | 81.9 | **89.0** | +| French | 62.8 | 53.5 | 62.8 | 69.8 | **73.5** | +| German | 73.3 | 61.4 | 77.5 | 76.7 | **80.3** | +| Greek | 82.6 | 73.3 | โ€“ | 79.5 | **86.0** | +| Hindi | 81.8 | 73.0 | โ€“ | 82.1 | **85.6** | +| Indonesian | 72.9 | 66.0 | โ€“ | 76.3 | **80.0** | +| Italian | 69.9 | 57.9 | 81.7 | 74.7 | **78.0** | +| Japanese | 77.6 | 73.8 | 78.8 | 79.6 | **82.8** | +| Korean | 77.6 | 70.0 | 79.9 | 81.7 | **83.3** | +| Polish | 80.2 | 72.9 | โ€“ | 81.9 | **88.4** | +| Portuguese | 80.5 | 71.1 | 81.7 | 78.1 | **83.7** | +| Romanian | **80.9** | 69.9 | โ€“ | 73.3 | 79.7 | +| Russian | 76.1 | 67.6 | 79.2 | 79.0 | **81.1** | +| Spanish | 76.2 | 61.5 | 81.4 | 77.6 | **83.1** | +| Thai | 80.0 | 58.8 | โ€“ | 78.6 | **84.0** | +| Turkish | 77.9 | 59.6 | โ€“ | 83.5 | **87.1** | +| Ukrainian | 73.0 | 64.7 | โ€“ | 74.7 | **79.8** | +| Vietnamese | 74.3 | 36.9 | โ€“ | 74.0 | **80.6** | + + + + +### Internal 30-Language ASR Benchmark + +We additionally run an internal multilingual intelligibility benchmark with **30 languages ร— 500 samples**. ASR transcription is evaluated via **Gemini 3.1 Flash Lite API**. + +**Internal 30-Language ASR Benchmark (click to expand)** + + +| Language | Metric | VoxCPM2 | Fish S2-Pro | +| ---------------------- | ------ | --------- | ----------- | +| ar (Arabic) | CER | 1.23% | 0.30% | +| da (Danish) | WER | 2.70% | 3.52% | +| de (German) | WER | 0.96% | 0.64% | +| el (Greek) | WER | 3.17% | 4.61% | +| en (English) | WER | 0.42% | 1.03% | +| es (Spanish) | WER | 1.33% | 0.64% | +| fi (Finnish) | WER | 2.24% | 2.80% | +| fr (French) | WER | 2.16% | 2.34% | +| he (Hebrew) | CER | 2.98% | 15.27% | +| hi (Hindi) | CER | 0.79% | 0.91% | +| id (Indonesian) | WER | 1.36% | 1.68% | +| it (Italian) | WER | 1.65% | 1.08% | +| ja (Japanese) | CER | 2.40% | 1.82% | +| km (Khmer) | CER | 2.05% | 75.15% | +| ko (Korean) | CER | 0.95% | 0.29% | +| lo (Lao) | CER | 1.90% | 87.40% | +| ms (Malay) | WER | 1.75% | 1.41% | +| my (Burmese) | CER | 1.42% | 85.27% | +| nl (Dutch) | WER | 1.25% | 1.68% | +| no (Norwegian) | WER | 2.49% | 3.76% | +| pl (Polish) | WER | 1.90% | 1.65% | +| pt (Portuguese) | WER | 1.48% | 1.49% | +| ru (Russian) | WER | 0.90% | 0.86% | +| sv (Swedish) | WER | 2.22% | 2.63% | +| sw (Swahili) | CER | 1.07% | 2.02% | +| th (Thai) | CER | 0.94% | 1.92% | +| tl (Tagalog) | WER | 2.63% | 4.00% | +| tr (Turkish) | WER | 1.65% | 1.65% | +| vi (Vietnamese) | WER | 1.56% | 5.56% | +| zh (Chinese) | CER | 0.92% | 1.02% | +| Average (30 languages) | | **1.68%** | - | + + + + +### InstructTTSEval + +**Instruction-Guided Voice Design Results (click to expand)** + + +| Model | InstructTTSEval-ZH | | | InstructTTSEval-EN | | | +| ---------------------- | ------------------ | -------- | -------- | ------------------ | -------- | -------- | +| | APSโฌ† | DSDโฌ† | RPโฌ† | APSโฌ† | DSDโฌ† | RPโฌ† | +| Hume | โ€“ | โ€“ | โ€“ | 83.0 | 75.3 | 54.3 | +| VoxInstruct | 47.5 | 52.3 | 42.6 | 54.9 | 57.0 | 39.3 | +| Parler-tts-mini | โ€“ | โ€“ | โ€“ | 63.4 | 48.7 | 28.6 | +| Parler-tts-large | โ€“ | โ€“ | โ€“ | 60.0 | 45.9 | 31.2 | +| PromptTTS | โ€“ | โ€“ | โ€“ | 64.3 | 47.2 | 31.4 | +| PromptStyle | โ€“ | โ€“ | โ€“ | 57.4 | 46.4 | 30.9 | +| VoiceSculptor | 75.7 | 64.7 | 61.5 | โ€“ | โ€“ | โ€“ | +| Mimo-Audio-7B-Instruct | 75.7 | 74.3 | 61.5 | 80.6 | 77.6 | 59.5 | +| Qwen3TTS-12Hz-1.7B-VD | **85.2** | **81.1** | **65.1** | 82.9 | 82.4 | 68.4 | +| **VoxCPM2** | **85.2** | 71.5 | 60.8 | **84.2** | **83.2** | **71.4** | + + + + +--- + +## โš™๏ธ Fine-tuning + +VoxCPM supports both **full fine-tuning (SFT)** and **LoRA fine-tuning**. With as little as **5โ€“10 minutes** of audio, you can adapt to a specific speaker, language, or domain. + +```bash +# LoRA fine-tuning (parameter-efficient, recommended) +python scripts/train_voxcpm_finetune.py \ + --config_path conf/voxcpm_v2/voxcpm_finetune_lora.yaml + +# Full fine-tuning +python scripts/train_voxcpm_finetune.py \ + --config_path conf/voxcpm_v2/voxcpm_finetune_all.yaml + +# WebUI for training & inference +python lora_ft_webui.py # then open http://localhost:7860 +``` + +> **Full guide โ†’** [Fine-tuning Guide](https://voxcpm.readthedocs.io/en/latest/finetuning/finetune.html) (data preparation, configuration, training, LoRA hot-swapping, FAQ) + +--- + +## ๐Ÿ“š Documentation + +Full documentation: **[voxcpm.readthedocs.io](https://voxcpm.readthedocs.io/en/latest/)** + + +| Topic | Link | +| -------------------------- | ------------------------------------------------------------------------------------- | +| Quick Start & Installation | [Quick Start](https://voxcpm.readthedocs.io/en/latest/quickstart.html) | +| Usage Guide & Cookbook | [User Guide](https://voxcpm.readthedocs.io/en/latest/usage_guide.html) | +| VoxCPM Series | [Models](https://voxcpm.readthedocs.io/en/latest/models/version_history.html) | +| Fine-tuning (SFT & LoRA) | [Fine-tuning Guide](https://voxcpm.readthedocs.io/en/latest/finetuning/finetune.html) | +| FAQ & Troubleshooting | [FAQ](https://voxcpm.readthedocs.io/en/latest/faq.html) | + + +--- + +## ๐ŸŒŸ Ecosystem & Community + + +| Project | Description | +| --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| **[Nano-vLLM](https://github.com/a710128/nanovllm-voxcpm)** | High-throughput and Fast GPU serving | +| **[vLLM-Omni](https://github.com/vllm-project/vllm-omni)** | Official vLLM omni-modal serving for VoxCPM2 โ€” PagedAttention, OpenAI-compatible API | +| **[llama.cpp-omni](https://github.com/tc-mb/llama.cpp-omni)** | Full-duplex omni inference engine โ€” VoxCPM2 GGUF on CPU / Metal / CUDA / Vulkan | +| **[VoxCPM.cpp](https://github.com/bluryar/VoxCPM.cpp)** | GGML/GGUF: CPU, CUDA, Vulkan inference | +| **[audio.cpp](https://github.com/0xShug0/audio.cpp)** | ggml-based unified C++ inference framework โ€” CPU/CUDA/Vulkan/Metal, CLI & server, no Python | +| **[VoxCPM-ONNX](https://github.com/bluryar/VoxCPM-ONNX)** | ONNX export for CPU inference | +| **[VoxCPMANE](https://github.com/0seba/VoxCPMANE)** | Apple Neural Engine backend | +| **[voxcpm_rs](https://github.com/madushan1000/voxcpm_rs)** | Rust re-implementation | +| **[ComfyUI-VoxCPM](https://github.com/wildminder/ComfyUI-VoxCPM)** | ComfyUI node-based workflows | +| **[ComfyUI_RH_VoxCPM](https://github.com/HM-RunningHub/ComfyUI_RH_VoxCPM)** | Feature-complete ComfyUI workflow for VoxCPM 2 with multi-speaker generation, LoRA, and auto-ASR | +| **[ComfyUI-VoxCPMTTS](https://github.com/1038lab/ComfyUI-VoxCPMTTS)** | ComfyUI TTS extension | +| **[TTS WebUI](https://github.com/rsxdalv/tts_webui_extension.vox_cpm)** | Browser-based TTS extension | + + +> See the full [Ecosystem](https://voxcpm.readthedocs.io/en/latest/) in the docs. Community projects are not officially maintained by OpenBMB. Built something cool? [Open an issue or PR](https://github.com/OpenBMB/VoxCPM/issues) to add it! + +--- + +## โš ๏ธ Risks and Limitations + +- **Potential for Misuse:** VoxCPM's voice cloning can generate highly realistic synthetic speech. It is **strictly forbidden** to use VoxCPM for impersonation, fraud, or disinformation. We strongly recommend clearly marking any AI-generated content. +- **Controllable Generation Stability:** Voice Design and Controllable Voice Cloning results can vary between runs โ€” you may try to generate 1~3 times to obtain the desired voice or style. We are actively working on improving controllability consistency. +- **Language Coverage:** VoxCPM2 officially supports 30 languages. For languages not on the list, you are welcome to test directly or try fine-tuning on your own data. We plan to expand language coverage in future releases. +- **Usage:** This model is released under the Apache-2.0 license. For production deployments, we recommend conducting thorough testing and safety evaluation tailored to your use case. + +--- + +## ๐Ÿ“– Citation + +If you find VoxCPM helpful, please consider citing our work and starring โญ the repository! + +```bib +@article{zhou2026voxcpm2, + title = {VoxCPM2 Technical Report}, + author = {Zhou, Yixuan and Zeng, Guoyang and Liu, Xin and Li, Xiang and Yu, Renjie and Gui, Jiancheng and Wu, Jiaheng and Wang, Ziyang and Shen, Xudong and Ye, Runchuan and Zhang, Zhisheng and Zhou, Jiuyang and Bai, Bingsong and Sun, Weiyue and Deng, Mengyuan and Shi, Qundong and Wu, Zhiyong and Liu, Zhiyuan}, + journal = {arXiv preprint arXiv:2606.06928}, + year = {2026}, +} + +@article{zhou2025voxcpm, + title = {Voxcpm: Tokenizer-free TTS for context-aware speech generation and true-to-life voice cloning}, + author = {Zhou, Yixuan and Zeng, Guoyang and Liu, Xin and Li, Xiang and Yu, Renjie and Wang, Ziyang and Ye, Runchuan and Sun, Weiyue and Gui, Jiancheng and Li, Kehan and Wu, Zhiyong and Liu, Zhiyuan}, + journal = {arXiv preprint arXiv:2509.24650}, + year = {2025} +} +``` + +## ๐Ÿ“„ License + +VoxCPM model weights and code are open-sourced under the [Apache-2.0](LICENSE) license. + +## ๐Ÿ™ Acknowledgments + +- [DiTAR](https://arxiv.org/abs/2502.03930) for the diffusion autoregressive backbone +- [MiniCPM-4](https://github.com/OpenBMB/MiniCPM) for the language model foundation +- [CosyVoice](https://github.com/FunAudioLLM/CosyVoice) for the Flow Matching-based LocDiT implementation +- [DAC](https://github.com/descriptinc/descript-audio-codec) for the Audio VAE backbone +- Our community users for trying VoxCPM, reporting issues, sharing ideas, and contributingโ€”your support helps the project keep getting better + +## Institutions + +[ModelBest](https://modelbest.cn/) ย ย ย  [THUHCSI](https://github.com/thuhcsi) + +## โญ Star History + +[Star History Chart](https://star-history.com/#OpenBMB/VoxCPM&Date) \ No newline at end of file diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..f08d5ec --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub ๆฅๆบ่ฏดๆ˜Ž + +- ๅŽŸๅง‹้กน็›ฎ๏ผš`OpenBMB/VoxCPM` +- ๅŽŸๅง‹ไป“ๅบ“๏ผšhttps://github.com/OpenBMB/VoxCPM +- ๅฏผๅ…ฅๆ–นๅผ๏ผšไธŠๆธธ้ป˜่ฎคๅˆ†ๆ”ฏ็š„ๆœ€ๆ–ฐๅฟซ็…ง +- ๅŽŸไฝœ่€…ใ€็‰ˆๆƒๅ’Œ่ฎธๅฏ่ฏไฟกๆฏไปฅๅŽŸๅง‹ไป“ๅบ“ๅŠๆœฌไป“ๅบ“ LICENSE ไธบๅ‡† +- ๆœฌๆ–‡ไปถไป…็”จไบŽ่ฎฐๅฝ•ๆฅๆบ๏ผŒไธไปฃ่กจ WeHub ๆ˜ฏๅŽŸ้กน็›ฎไฝœ่€… diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..1d100c0 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,685 @@ +

VoxCPM2๏ผšๅŸบไบŽ่ฟž็ปญ่กจๅพ็š„ๅคš่ฏญ่จ€่ฏญ้Ÿณๅˆๆˆใ€ๅˆ›ๆ„้Ÿณ่‰ฒ่ฎพ่ฎกไธŽ้ซ˜ไฟ็œŸๅฃฐ้Ÿณๅ…‹้š†

+ +

+ English | ไธญๆ–‡ +

+ +

+ Project Page + Live Playground + Documentation + Hugging Face + ModelScope + DemoPage + +

+ +
+ VoxCPM Logo +

+ OpenBMB%2FVoxCPM | Trendshift +
+ +
+ +

+ ๐Ÿ‘‹ ๆฌข่ฟŽๅŠ ๅ…ฅ็คพๅŒบ๏ผŒๅ‚ไธŽ่ฎจ่ฎบไธŽไบคๆต๏ผ +
+ + ้ฃžไนฆ็พค + +  |  + + Discord + +

+ +VoxCPM ๆ˜ฏไธ€ไธช**ๆ— ็ฆปๆ•ฃ้Ÿณ้ข‘ๅˆ†่ฏๅ™จ**๏ผˆTokenizer-Free๏ผ‰็š„่ฏญ้Ÿณๅˆๆˆ็ณป็ปŸ๏ผŒ้€š่ฟ‡็ซฏๅˆฐ็ซฏ็š„**ๆ‰ฉๆ•ฃ่‡ชๅ›žๅฝ’ๆžถๆž„**็›ดๆŽฅ็”Ÿๆˆ่ฟž็ปญ่ฏญ้Ÿณ่กจๅพ๏ผŒ็ป•่ฟ‡ๅฏน้Ÿณ้ข‘็š„็ฆปๆ•ฃ็ผ–็ ๆญฅ้ชค๏ผŒๅฎž็Žฐ้ซ˜ๅบฆ่‡ช็„ถไธ”ๅฏŒๆœ‰่กจ็ŽฐๅŠ›็š„่ฏญ้Ÿณๅˆๆˆใ€‚ + +**VoxCPM2** ๆ˜ฏๆœ€ๆ–ฐ็š„็‰ˆๆœฌ โ€” ๅŸบไบŽ [MiniCPM-4](https://github.com/OpenBMB/MiniCPM) ๅŸบๅบงๆž„ๅปบ๏ผŒๆ€ป่ฎก **20ไบฟ** ๅ‚ๆ•ฐ๏ผŒๅœจ่ถ…่ฟ‡ **200ไธ‡ๅฐๆ—ถ** ็š„ๅคš่ฏญ็ง้Ÿณ้ข‘ๆ•ฐๆฎไธŠ่ฎญ็ปƒ๏ผŒๆ”ฏๆŒ **30็งๅ…จ็ƒ่ฏญ่จ€+9็งไธญๆ–‡ๆ–น่จ€**ใ€**้Ÿณ่‰ฒ่ฎพ่ฎก**ใ€**ๅฏๆŽงๅฃฐ้Ÿณๅ…‹้š†**๏ผŒๅŽŸ็”Ÿ่พ“ๅ‡บ **48kHz** ้ซ˜่ดจ้‡้Ÿณ้ข‘ใ€‚ + +### โœจ ๆ ธๅฟƒ็‰นๆ€ง + +- ๐ŸŒ **30็ง่ฏญ่จ€่ฏญ้Ÿณๅˆๆˆ** โ€” ็›ดๆŽฅ่พ“ๅ…ฅๅŽŸๅง‹ๆ–‡ๆœฌๅณๅฏๅˆๆˆ๏ผˆๆ”ฏๆŒ่ฏญ่จ€่ฏฆ่งไธ‹ๆ–‡๏ผ‰๏ผŒๆ— ้œ€้ขๅค–่ฏญ่จ€ๆ ‡็ญพ +- ๐ŸŽจ **้Ÿณ่‰ฒ่ฎพ่ฎก** โ€” ็”จ่‡ช็„ถ่ฏญ่จ€ๆ่ฟฐ๏ผˆๆ€งๅˆซใ€ๅนด้พ„ใ€้Ÿณ่‰ฒใ€ๆƒ…็ปชใ€่ฏญ้€Ÿโ€ฆโ€ฆ๏ผ‰ๅ‡ญ็ฉบๅˆ›ๅปบๅ…จๆ–ฐ้Ÿณ่‰ฒ๏ผŒๆ— ้œ€ๅ‚่€ƒ้Ÿณ้ข‘ +- ๐ŸŽ›๏ธ **ๅฏๆŽงๅฃฐ้Ÿณๅ…‹้š†** โ€” ไปŽๅ‚่€ƒ้Ÿณ้ข‘็‰‡ๆฎตๅ…‹้š†ไปปๆ„ๅฃฐ้Ÿณ๏ผŒๅฏๅ ๅŠ ้ฃŽๆ ผๆŒ‡ไปคๆŽงๅˆถๆƒ…็ปชใ€่ฏญ้€Ÿๅ’Œ่กจ็ŽฐๅŠ›๏ผŒๅŒๆ—ถไฟๆŒๅŽŸๅง‹้Ÿณ่‰ฒ +- ๐ŸŽ™๏ธ **ๆž่‡ดๅ…‹้š†** โ€” ๆไพ›ๅ‚่€ƒ้Ÿณ้ข‘ๅŠๅ…ถๆ–‡ๆœฌๅ†…ๅฎน๏ผŒๆจกๅž‹ๆŽฅ็€ๅ‚่€ƒ้Ÿณ้ข‘่ฟ›่กŒๆ— ็ผ็ปญๅ†™๏ผŒไปŽ่€Œ็ฒพๅ‡†่ฟ˜ๅŽŸๅฃฐ้Ÿณ็ป†่Š‚็‰นๅพ๏ผˆไธŽ VoxCPM1.5 ไธ€่‡ด๏ผ‰ +- ๐Ÿ”Š **48kHz ้ซ˜่ดจ้‡้Ÿณ้ข‘** โ€” ่พ“ๅ…ฅ 16kHz ๅ‚่€ƒ้Ÿณ้ข‘๏ผŒ้€š่ฟ‡ AudioVAE V2 ็š„้žๅฏน็งฐ็ผ–่งฃ็ ่ฎพ่ฎก็›ดๆŽฅ่พ“ๅ‡บ 48kHz ้ซ˜่ดจ้‡้Ÿณ้ข‘๏ผŒๅ†…็ฝฎ่ถ…ๅˆ†่ƒฝๅŠ› +- ๐Ÿง  **่ฏญๅขƒๆ„Ÿ็Ÿฅๅˆๆˆ** โ€” ๆ นๆฎๆ–‡ๆœฌๅ†…ๅฎน่‡ชๅŠจๆŽจๆ–ญๅˆ้€‚็š„้Ÿตๅพ‹ๅ’Œ่กจ็ŽฐๅŠ› +- โšก **ๅฎžๆ—ถๆตๅผๅˆๆˆ** โ€” ๅœจ NVIDIA RTX 4090 ไธŠ RTF ไฝŽ่‡ณ ~0.3๏ผŒ้€š่ฟ‡ [Nano-vLLM](https://github.com/a710128/nanovllm-voxcpm) ๆˆ– [vLLM-Omni](https://github.com/vllm-project/vllm-omni)๏ผˆๅฎ˜ๆ–น vLLM ๅ…จๆจกๆ€ๆœๅŠก๏ผŒๅŽŸ็”Ÿๆ”ฏๆŒ VoxCPM2๏ผŒๆไพ› PagedAttention ไธŽ OpenAI ๅ…ผๅฎน API๏ผ‰ๅŠ ้€ŸๅŽๅฏ่พพ ~0.13 +- ๐Ÿ“œ **ๅฎŒๅ…จๅผ€ๆบ๏ผŒๅ•†็”จๅฐฑ็ปช** โ€” ๆƒ้‡ๅ’Œไปฃ็ ๅŸบไบŽ [Apache-2.0](LICENSE) ๅ่ฎฎๅ‘ๅธƒ๏ผŒๅ…่ดนๅ•†็”จ + +๐ŸŒ ๆ”ฏๆŒ็š„่ฏญ่จ€๏ผˆ30็ง๏ผ‰ +
+้˜ฟๆ‹‰ไผฏ่ฏญใ€็ผ…็”ธ่ฏญใ€ไธญๆ–‡ใ€ไธน้บฆ่ฏญใ€่ทๅ…ฐ่ฏญใ€่‹ฑ่ฏญใ€่Šฌๅ…ฐ่ฏญใ€ๆณ•่ฏญใ€ๅพท่ฏญใ€ๅธŒ่…Š่ฏญใ€ๅธŒไผฏๆฅ่ฏญใ€ๅฐๅœฐ่ฏญใ€ๅฐๅฐผ่ฏญใ€ๆ„ๅคงๅˆฉ่ฏญใ€ๆ—ฅ่ฏญใ€้ซ˜ๆฃ‰่ฏญใ€้Ÿฉ่ฏญใ€่€ๆŒ่ฏญใ€้ฉฌๆฅ่ฏญใ€ๆŒชๅจ่ฏญใ€ๆณขๅ…ฐ่ฏญใ€่‘ก่„็‰™่ฏญใ€ไฟ„่ฏญใ€่ฅฟ็ญ็‰™่ฏญใ€ๆ–ฏ็“ฆๅธŒ้‡Œ่ฏญใ€็‘žๅ…ธ่ฏญใ€่ฒๅพ‹ๅฎพ่ฏญใ€ๆณฐ่ฏญใ€ๅœŸ่€ณๅ…ถ่ฏญใ€่ถŠๅ—่ฏญ + +ไธญๅ›ฝๆ–น่จ€๏ผšๅ››ๅท่ฏใ€็ฒค่ฏญใ€ๅด่ฏญใ€ไธœๅŒ—่ฏใ€ๆฒณๅ—่ฏใ€้™•่ฅฟ่ฏใ€ๅฑฑไธœ่ฏใ€ๅคฉๆดฅ่ฏใ€้—ฝๅ—่ฏ + + +### ๆœ€ๆ–ฐๅŠจๆ€ + +* **[2026.04]** ๐Ÿ”ฅ ๅ‘ๅธƒ **VoxCPM2** โ€” 20ไบฟๅ‚ๆ•ฐ๏ผŒ30็ง่ฏญ่จ€๏ผŒ้Ÿณ่‰ฒ่ฎพ่ฎกไธŽๅฏๆŽงๅฃฐ้Ÿณๅ…‹้š†๏ผŒ48kHz ้Ÿณ้ข‘่พ“ๅ‡บ๏ผ[ๆจกๅž‹ๆƒ้‡](https://huggingface.co/openbmb/VoxCPM2) | [ไฝฟ็”จๆ–‡ๆกฃ](https://voxcpm.readthedocs.io/zh-cn/latest/) | [ๅœจ็บฟไฝ“้ชŒ](https://huggingface.co/spaces/OpenBMB/VoxCPM-Demo) | [ๅฎ˜็ฝ‘ไฝ“้ชŒ](https://voxcpm.modelbest.cn/) (้€‚็”จๅ›ฝๅ†…่ฎฟ้—ฎ) | [ๆŠ€ๆœฏๆŠฅๅ‘Š](https://arxiv.org/abs/2606.06928) +* **[2025.12]** ๐ŸŽ‰ ๅผ€ๆบ **VoxCPM1.5** [ๆจกๅž‹ๆƒ้‡](https://huggingface.co/openbmb/VoxCPM1.5)๏ผŒๆ”ฏๆŒ SFT ๅ’Œ LoRA ๅพฎ่ฐƒใ€‚(**๐Ÿ† GitHub Trending #1**) +* **[2025.09]** ๐Ÿ”ฅ ๅ‘ๅธƒ VoxCPM [ๆŠ€ๆœฏๆŠฅๅ‘Š](https://arxiv.org/abs/2509.24650)ใ€‚ +* **[2025.09]** ๐ŸŽ‰ ๅผ€ๆบ **VoxCPM-0.5B** [ๆจกๅž‹ๆƒ้‡](https://huggingface.co/openbmb/VoxCPM-0.5B) (**๐Ÿ† HuggingFace Trending #1**) + +--- + +## ็›ฎๅฝ• + +- [ๅฟซ้€Ÿๅผ€ๅง‹](#-ๅฟซ้€Ÿๅผ€ๅง‹) + - [ๅฎ‰่ฃ…](#ๅฎ‰่ฃ…) + - [Python API](#python-api) + - [ๅ‘ฝไปค่กŒไฝฟ็”จ](#ๅ‘ฝไปค่กŒไฝฟ็”จ) + - [Web Demo](#web-demo) + - [็”Ÿไบง้ƒจ็ฝฒ](#-็”Ÿไบง้ƒจ็ฝฒnano-vllm) + - [็ซฏไพงๆŽจ็†๏ผˆllama.cpp-omni๏ผ‰](#-็ซฏไพงๆŽจ็†llamacpp-omni) +- [ๆจกๅž‹ไธŽ็‰ˆๆœฌ](#-ๆจกๅž‹ไธŽ็‰ˆๆœฌ) +- [ๆ€ง่ƒฝ่ฏ„ๆต‹](#-ๆ€ง่ƒฝ่ฏ„ๆต‹) +- [ๅพฎ่ฐƒ](#%EF%B8%8F-ๅพฎ่ฐƒ) +- [ๆ–‡ๆกฃ](#-ๆ–‡ๆกฃ) +- [็”Ÿๆ€ไธŽ็คพๅŒบ](#-็”Ÿๆ€ไธŽ็คพๅŒบ) +- [้ฃŽ้™ฉไธŽๅฑ€้™ๆ€ง](#%EF%B8%8F-้ฃŽ้™ฉไธŽๅฑ€้™ๆ€ง) +- [ๅผ•็”จ](#-ๅผ•็”จ) + +--- + +## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ + +### ๅฎ‰่ฃ… + +```sh +pip install voxcpm +``` + +> **็Žฏๅขƒ่ฆๆฑ‚๏ผš** Python โ‰ฅ 3.10 (<3.13)๏ผŒPyTorch โ‰ฅ 2.5.0๏ผŒCUDA โ‰ฅ 12.0ใ€‚่ฏฆ่ง [ๅฟซ้€Ÿๅผ€ๅง‹ๆ–‡ๆกฃ](https://voxcpm.readthedocs.io/zh-cn/latest/quickstart.html)ใ€‚ + +### Python API + +#### ๐Ÿ—ฃ๏ธ ๆ–‡ๆœฌ่ฝฌ่ฏญ้Ÿณ + +```python +from voxcpm import VoxCPM +import soundfile as sf + +model = VoxCPM.from_pretrained( + "openbmb/VoxCPM2", + load_denoiser=False, +) + +wav = model.generate( + text="VoxCPM2 ๆ˜ฏ็›ฎๅ‰ๆŽจ่ไฝฟ็”จ็š„ๅคš่ฏญ่จ€่ฏญ้Ÿณๅˆๆˆ็‰ˆๆœฌใ€‚", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("demo.wav", wav, model.tts_model.sample_rate) +print("ๅทฒไฟๅญ˜: demo.wav") +``` + +ๅฆ‚ๆžœไฝ ๅธŒๆœ›ๅ…ˆไปŽ ModelScope ไธ‹่ฝฝๆจกๅž‹ๅˆฐๆœฌๅœฐ๏ผˆ้€‚็”จไบŽๅ›ฝๅ†…็ฝ‘็ปœ่ฎฟ้—ฎ๏ผ‰๏ผŒๅฏไปฅไฝฟ็”จ๏ผš + +```bash +pip install modelscope +``` + +```python +from modelscope import snapshot_download +snapshot_download("OpenBMB/VoxCPM2", local_dir='./pretrained_models/VoxCPM2') # ๆŒ‡ๅฎšๆจกๅž‹ไฟๅญ˜็š„ๆœฌๅœฐ่ทฏๅพ„ + +from voxcpm import VoxCPM +import soundfile as sf +model = VoxCPM.from_pretrained('./pretrained_models/VoxCPM2', load_denoiser=False) + +wav = model.generate( + text="VoxCPM2 ๆ˜ฏ็›ฎๅ‰ๆŽจ่ไฝฟ็”จ็š„ๅคš่ฏญ่จ€่ฏญ้Ÿณๅˆๆˆ็‰ˆๆœฌใ€‚", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("demo.wav", wav, model.tts_model.sample_rate) +``` + +#### ๐ŸŽจ ้Ÿณ่‰ฒ่ฎพ่ฎก + +็”จ่‡ช็„ถ่ฏญ่จ€ๆ่ฟฐๅˆ›ๅปบๅ…จๆ–ฐ้Ÿณ่‰ฒ๏ผŒๆ— ้œ€ๅ‚่€ƒ้Ÿณ้ข‘ใ€‚**ๆ ผๅผ๏ผš** ๅœจ `text` ๅผ€ๅคด็”จๆ‹ฌๅทๅ†™ๅ…ฅ้Ÿณ่‰ฒๆ่ฟฐ๏ผˆๅฆ‚ `"(้Ÿณ่‰ฒๆ่ฟฐ)่ฆๅˆๆˆ็š„ๆ–‡ๆœฌใ€‚"`๏ผ‰๏ผš + +```python +wav = model.generate( + text="(ๅนด่ฝปๅฅณๆ€ง๏ผŒๅฃฐ้ŸณๆธฉๆŸ”็”œ็พŽ)ไฝ ๅฅฝ๏ผŒๆฌข่ฟŽไฝฟ็”จVoxCPM2๏ผ", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("voice_design.wav", wav, model.tts_model.sample_rate) +``` + +#### ๐ŸŽ›๏ธ ๅฏๆŽงๅฃฐ้Ÿณๅ…‹้š† + +ไธŠไผ ไธ€ๆฎตๅ‚่€ƒ้Ÿณ้ข‘๏ผŒๆจกๅž‹ๅ…‹้š†ๅ…ถ้Ÿณ่‰ฒ๏ผŒๅŒๆ—ถๅฏไปฅไฝฟ็”จๆŽงๅˆถๆŒ‡ไปค่ฐƒ่Š‚่ฏญ้€Ÿใ€ๆƒ…็ปชๆˆ–้ฃŽๆ ผใ€‚ + +```python +wav = model.generate( + text="่ฟ™ๆ˜ฏVoxCPM2็”Ÿๆˆ็š„ๅ…‹้š†่ฏญ้Ÿณใ€‚", + reference_wav_path="path/to/voice.wav", +) +sf.write("clone.wav", wav, model.tts_model.sample_rate) + +wav = model.generate( + text="(็จๅฟซไธ€็‚น๏ผŒๆฌขๅฟซ็š„่ฏญๆฐ”)่ฟ™ๆ˜ฏๅธฆ้ฃŽๆ ผๆŽงๅˆถ็š„ๅ…‹้š†่ฏญ้Ÿณใ€‚", + reference_wav_path="path/to/voice.wav", + cfg_value=2.0, + inference_timesteps=10, + seed=42, +) +sf.write("controllable_clone.wav", wav, model.tts_model.sample_rate) +``` + +#### ๐ŸŽ™๏ธ ๆž่‡ดๅ…‹้š† + +ๆไพ›ๅ‚่€ƒ้Ÿณ้ข‘ๅŠๅ…ถ็ฒพ็กฎๆ–‡ๆœฌ่ฝฌๅฝ•๏ผŒๅฎž็ŽฐๅŸบไบŽ้Ÿณ้ข‘็ปญๅ†™็š„้ซ˜ไฟ็œŸๅ…‹้š†ใ€‚ไธบ่Žทๅพ—ๆœ€้ซ˜ๅ…‹้š†็›ธไผผๅบฆ๏ผŒๅฏๅฐ†ๅŒไธ€้Ÿณ้ข‘ๅŒๆ—ถไผ ็ป™ `reference_wav_path` ๅ’Œ `prompt_wav_path`๏ผš + +```python +wav = model.generate( + text="่ฟ™ๆ˜ฏไฝฟ็”จVoxCPM2็š„ๆž่‡ดๅ…‹้š†ๆผ”็คบใ€‚", + prompt_wav_path="path/to/voice.wav", + prompt_text="ๅ‚่€ƒ้Ÿณ้ข‘็š„ๆ–‡ๆœฌ่ฝฌๅฝ•ใ€‚", + reference_wav_path="path/to/voice.wav", # ๅฏ้€‰๏ผŒๆๅ‡็›ธไผผๅบฆ +) +sf.write("hifi_clone.wav", wav, model.tts_model.sample_rate) +``` + +
+๐Ÿ”„ ๆตๅผ API + +```python +import numpy as np + +chunks = [] +for chunk in model.generate_streaming( + text="ไฝฟ็”จVoxCPM่ฟ›่กŒๆตๅผ่ฏญ้Ÿณๅˆๆˆ้žๅธธ็ฎ€ๅ•๏ผ", +): + chunks.append(chunk) +wav = np.concatenate(chunks) +sf.write("streaming.wav", wav, model.tts_model.sample_rate) +``` +
+ +### ๅ‘ฝไปค่กŒไฝฟ็”จ + +```bash +# ้Ÿณ่‰ฒ่ฎพ่ฎก๏ผˆๆ— ้œ€ๅ‚่€ƒ้Ÿณ้ข‘๏ผ‰ +voxcpm design \ + --text "VoxCPM2ๅธฆๆฅๅ…จๆ–ฐ่ฏญ้Ÿณๅˆๆˆไฝ“้ชŒใ€‚" \ + --output out.wav + +# ๅฏๆŽงๅฃฐ้Ÿณๅ…‹้š†๏ผˆๅธฆ้ฃŽๆ ผๆŽงๅˆถ๏ผ‰ +voxcpm design \ + --text "VoxCPM2ๅธฆๆฅๅ…จๆ–ฐ่ฏญ้Ÿณๅˆๆˆไฝ“้ชŒใ€‚" \ + --control "ๅนด่ฝปๅฅณๅฃฐ๏ผŒๆธฉๆš–ๆธฉๆŸ”๏ผŒ็•ฅๅธฆๅพฎ็ฌ‘" \ + --seed 42 \ + --output out.wav + +# ๅฃฐ้Ÿณๅ…‹้š†๏ผˆๅ‚่€ƒ้Ÿณ้ข‘๏ผ‰ +voxcpm clone \ + --text "่ฟ™ๆ˜ฏไธ€ไธชๅฃฐ้Ÿณๅ…‹้š†็š„ๆผ”็คบใ€‚" \ + --reference-audio path/to/voice.wav \ + --output out.wav + +# ๆž่‡ดๅ…‹้š†๏ผˆๆ็คบ้Ÿณ้ข‘ + ่ฝฌๅฝ•ๆ–‡ๆœฌ๏ผ‰ +voxcpm clone \ + --text "่ฟ™ๆ˜ฏไธ€ไธชๅฃฐ้Ÿณๅ…‹้š†็š„ๆผ”็คบใ€‚" \ + --prompt-audio path/to/voice.wav \ + --prompt-text "ๅ‚่€ƒ้Ÿณ้ข‘่ฝฌๅฝ•ๆ–‡ๆœฌ" \ + --reference-audio path/to/voice.wav \ + --output out.wav + +# ๆ‰น้‡ๅค„็† +voxcpm batch --input examples/input.txt --output-dir outs + +# ๅฏ้€‰็š„็”ŸๆˆๅŽๆ—ถ้—ดๆˆณๅฏน้ฝ๏ผˆๅŸบไบŽ stable-ts๏ผ‰ +pip install "voxcpm[timestamps]" +voxcpm design \ + --text "VoxCPM2ๅธฆๆฅๅ…จๆ–ฐ่ฏญ้Ÿณๅˆๆˆไฝ“้ชŒใ€‚" \ + --output out.wav \ + --timestamps \ + --timestamp-level word \ + --timestamp-language zh + +# ๅญ—็บงๆ—ถ้—ดๆˆณๆ˜ฏ best-effort๏ผŒไผšๅŸบไบŽ่ฏ็บงๅฏน้ฝ็ป“ๆžœๆ‹†ๅˆ† +voxcpm design \ + --text "ๆฌข่ฟŽไฝฟ็”จ VoxCPM2ใ€‚" \ + --output out.wav \ + --timestamps \ + --timestamp-level char \ + --timestamp-language zh + +# ๅธฎๅŠฉ +voxcpm --help +``` + +### Web Demo + +```bash +python app.py --port 8808 # ็„ถๅŽๅœจๆต่งˆๅ™จๆ‰“ๅผ€ http://localhost:8808 +``` + +ไฝฟ็”จ `--device` ้€‰ๆ‹ฉ่ฟ่กŒ่ฎพๅค‡๏ผš + +```bash +python app.py --device auto +``` + +ๆ”ฏๆŒ็š„ๅ–ๅ€ผๅŒ…ๆ‹ฌ `auto`ใ€`cpu`ใ€`mps`ใ€`cuda` ๅ’Œ `cuda:N`ใ€‚ๅœจ Apple Silicon Mac ไธŠ๏ผŒ`auto` ไผšๅœจๅฏ็”จๆ—ถไฝฟ็”จ MPSใ€‚ + +### ๐Ÿšข ็”Ÿไบง้ƒจ็ฝฒ๏ผˆNano-vLLM๏ผ‰ + +ๅฆ‚้œ€้ซ˜ๅžๅ้‡้ƒจ็ฝฒ๏ผŒไฝฟ็”จ [**Nano-vLLM-VoxCPM**](https://github.com/a710128/nanovllm-voxcpm) โ€” ๅŸบไบŽ Nano-vLLM ๆž„ๅปบ็š„ไธ“็”จๆŽจ็†ๅผ•ๆ“Ž๏ผŒๆ”ฏๆŒๅนถๅ‘่ฏทๆฑ‚ๅ’Œๅผ‚ๆญฅ APIใ€‚ + +```bash +pip install nano-vllm-voxcpm +``` + +```python +from nanovllm_voxcpm import VoxCPM +import numpy as np, soundfile as sf + +server = VoxCPM.from_pretrained(model="/path/to/VoxCPM", devices=[0]) +chunks = list(server.generate(target_text="ไฝ ๅฅฝ๏ผŒๆˆ‘ๆฅ่‡ชVoxCPM๏ผ")) +sf.write("out.wav", np.concatenate(chunks), 48000) +server.stop() +``` + +> **ๅœจ NVIDIA RTX 4090 ไธŠ RTF ไฝŽ่‡ณ ~0.13**๏ผˆๆ ‡ๅ‡† PyTorch ๅฎž็Žฐ็บฆ ~0.3๏ผ‰๏ผŒๆ”ฏๆŒๆ‰น้‡ๅนถๅ‘่ฏทๆฑ‚ๅ’Œ FastAPI HTTP ๆœๅŠกใ€‚่ฏฆ่ง [Nano-vLLM-VoxCPM ไป“ๅบ“](https://github.com/a710128/nanovllm-voxcpm)ใ€‚ + +### ๐Ÿญ ็”Ÿไบง็Žฏๅขƒ้ƒจ็ฝฒ๏ผˆvLLM-Omni๏ผ‰ + +ๅฆ‚้œ€็”Ÿไบง็บงๅคš็งŸๆˆท้ƒจ็ฝฒ๏ผŒไฝฟ็”จ [**vLLM-Omni**](https://github.com/vllm-project/vllm-omni) โ€” ๅฎ˜ๆ–น vLLM ้กน็›ฎ็š„ๅ…จๆจกๆ€ๆ‰ฉๅฑ•๏ผŒๅŽŸ็”Ÿๆ”ฏๆŒ **VoxCPM2**ใ€‚ๅ…ทๅค‡ PagedAttention KV ็ผ“ๅญ˜ใ€่ฟž็ปญๆ‰นๅค„็†๏ผŒไปฅๅŠไธŽ OpenAI ๅฎŒๅ…จๅ…ผๅฎน็š„ `/v1/audio/speech` ๆŽฅๅฃใ€‚ + +```bash +# ไปŽๆบ็ ๅฎ‰่ฃ…๏ผˆๆœ€ๆ–ฐ main ๅˆ†ๆ”ฏ โ€”โ€” vllm-omni ๆญฃๅœจๅฟซ้€Ÿ่ฟญไปฃ๏ผ‰ +uv pip install vllm==0.19.0 --torch-backend=auto +git clone https://github.com/vllm-project/vllm-omni.git && cd vllm-omni +uv pip install -e . +``` + +ๅ…ถไป–ๅนณๅฐ๏ผˆROCmใ€XPUใ€MUSAใ€NPU๏ผ‰ไธŽ Docker ้•œๅƒ่ฏทๅ‚่€ƒ [vLLM-Omni ๅฎ‰่ฃ…ๆ–‡ๆกฃ](https://vllm-omni.readthedocs.io/en/latest/getting_started/installation/)ใ€‚ + +```bash +# ๅฏๅŠจ OpenAI ๅ…ผๅฎน็š„ TTS ๆœๅŠก๏ผˆ--omni ๅฏ็”จๅ…จๆจกๆ€ๆœๅŠก๏ผ‰ +vllm serve openbmb/VoxCPM2 --omni --port 8000 + +# ไปปๆ„ OpenAI ๅฎขๆˆท็ซฏๅ‡ๅฏ่ฐƒ็”จ +curl http://localhost:8000/v1/audio/speech \ + -H "Content-Type: application/json" \ + -d '{"model":"openbmb/VoxCPM2","input":"ไฝ ๅฅฝ๏ผŒๆฌข่ฟŽไฝฟ็”จ VoxCPM2 on vLLM-Omni๏ผ","voice":"default"}' \ + --output out.wav +``` + +> ๅŸบไบŽไธŠๆธธ vLLM ่ฐƒๅบฆๅ™จๆž„ๅปบ๏ผŒๅผ€็ฎฑๅณ็”จๆ”ฏๆŒๆ‰น้‡ๅนถๅ‘ใ€ๆตๅผๅˆ†ๅ—่พ“ๅ‡บๅ’Œๅคš GPU ้ƒจ็ฝฒใ€‚ๅฎŒๆ•ด็คบไพ‹่ง [VoxCPM2 ้ƒจ็ฝฒๆ ทไพ‹](https://github.com/vllm-project/vllm-omni/tree/main/examples/online_serving/voxcpm2)ใ€‚ + +### ๐Ÿ“ฑ ็ซฏไพงๆŽจ็†๏ผˆllama.cpp-omni๏ผ‰ + +ๅฆ‚้œ€ๅœจ็ซฏไพง/ๆถˆ่ดน็บง็กฌไปถไธŠๆ—  Python ่ฟ่กŒ๏ผŒไฝฟ็”จ **[llama.cpp-omni](https://github.com/tc-mb/llama.cpp-omni)** โ€” ๅŸบไบŽ llama.cpp ็š„้ซ˜ๆ€ง่ƒฝ C++ ๆŽจ็†ๅผ•ๆ“Ž๏ผŒๅŽŸ็”Ÿๆ”ฏๆŒ VoxCPM2 GGUF๏ผŒๅฏๅœจ **CPU / Metal / CUDA / Vulkan** ไธŠ่ฟ่กŒใ€‚ + +**1. ไธ‹่ฝฝ GGUF ๆƒ้‡**๏ผšไปŽ [HFไธ‹่ฝฝ](https://huggingface.co/DennisHuang648/VoxCPM2-GGUF) | [ModelScope](https://modelscope.cn/models/DennisHuang/VoxCPM2-GGUF)๏ผŒ้œ€่ฆไธ€ไธช **BaseLM**๏ผˆF16 ๆˆ– Q8_0๏ผ‰+ **Acoustic** ๆ–‡ไปถใ€‚Q8_0 ไฝ“็งฏๅ‡ๅŠ๏ผŒ่ดจ้‡ๆŸๅคฑๅฏๅฟฝ็•ฅใ€‚ + +**2. ็ผ–่ฏ‘** + +```bash +git clone https://github.com/tc-mb/llama.cpp-omni.git && cd llama.cpp-omni +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build --target voxcpm2-cli -j +``` + +> CMake ไผš่‡ชๅŠจๆฃ€ๆต‹ๅนถๅฏ็”จ Metal๏ผˆmacOS๏ผ‰ๆˆ– CUDA๏ผˆLinux + NVIDIA GPU๏ผ‰ใ€‚ + +**3. ่ฟ่กŒ** + +```bash +# ๅŸบ็ก€ TTS +./build/bin/voxcpm2-cli \ + -t "ไฝ ๅฅฝ๏ผŒๆˆ‘ๆ˜ฏ้€š่ฟ‡ llama.cpp-omni ่ฟ่กŒ็š„ VoxCPM2ใ€‚" \ + -o output.wav VoxCPM2-BaseLM-Q8_0.gguf VoxCPM2-Acoustic-F16.gguf + +# ๅฃฐ้Ÿณๅ…‹้š†๏ผˆๅ‚่€ƒ้Ÿณ้ข‘๏ผ‰ +./build/bin/voxcpm2-cli \ + -t "ๅ…‹้š†็š„ๅฃฐ้Ÿณใ€‚" -r speaker.wav -o clone.wav \ + VoxCPM2-BaseLM-Q8_0.gguf VoxCPM2-Acoustic-F16.gguf + +# ็ฒพๅ‡†ๅ…‹้š†๏ผˆๅ‚่€ƒ้Ÿณ้ข‘ + ่ฝฌๅ†™ๆ–‡ๆœฌ๏ผ‰ +./build/bin/voxcpm2-cli \ + -t "็›ฎๆ ‡ๆ–‡ๆœฌใ€‚" --prompt-wav speaker.wav --prompt-text "ๅ‚่€ƒ้Ÿณ้ข‘็š„่ฝฌๅ†™ๆ–‡ๆœฌ" \ + -o clone.wav VoxCPM2-BaseLM-Q8_0.gguf VoxCPM2-Acoustic-F16.gguf +``` + +> **ๅœจ Apple M4 Pro / Metal ไธŠ RTF ~1.76๏ผˆQ8_0๏ผ‰ใ€‚** ไธป่ฆๅ‚ๆ•ฐ๏ผš`--cfg`๏ผˆๅผ•ๅฏผๅฐบๅบฆ๏ผ‰ใ€`--timesteps`๏ผˆCFM ๆญฅๆ•ฐ๏ผ‰ใ€`--seed`ใ€`--temperature`ใ€`--stream`ใ€‚่ฏฆ่ง [llama.cpp-omni ไป“ๅบ“](https://github.com/tc-mb/llama.cpp-omni) ๅ’Œ [GGUF ๆƒ้‡้กต้ข](https://huggingface.co/DennisHuang648/VoxCPM2-GGUF)ใ€‚ + +> **ๅฎŒๆ•ดๅ‚ๆ•ฐ่ฏดๆ˜Žใ€ๅคšๅœบๆ™ฏ็คบไพ‹ไธŽๅฃฐ้Ÿณๅ…‹้š†ๆŠ€ๅทง โ†’** [ๅฟซ้€Ÿๅผ€ๅง‹ๆŒ‡ๅ—](https://voxcpm.readthedocs.io/zh-cn/latest/quickstart.html) | [ไฝฟ็”จๆŒ‡ๅ—](https://voxcpm.readthedocs.io/zh-cn/latest/usage_guide.html) | [Cookbook](https://voxcpm.readthedocs.io/zh-cn/latest/cookbook.html) + +--- + +## ๐Ÿ“ฆ ๆจกๅž‹ไธŽ็‰ˆๆœฌ + +| | **VoxCPM2** | **VoxCPM1.5** | **VoxCPM-0.5B** | +|---|:---:|:---:|:---:| +| **็Šถๆ€** | ๐ŸŸข ๆœ€ๆ–ฐ็‰ˆๆœฌ | ็จณๅฎš็‰ˆ | ๆ—ง็‰ˆ | +| **ไธปๆจกๅž‹ๅ‚ๆ•ฐ้‡** | 2B | 0.6B | 0.5B | +| **้Ÿณ้ข‘้‡‡ๆ ท็އ** | 48kHz | 44.1kHz | 16kHz | +| **LMๅค„็†็ ็އ** | 6.25Hz | 6.25Hz | 12.5Hz | +| **่ฏญ่จ€ๆ”ฏๆŒๆ•ฐ้‡** | 30 | 2๏ผˆไธญๆ–‡ใ€่‹ฑๆ–‡๏ผ‰ | 2๏ผˆไธญๆ–‡ใ€่‹ฑๆ–‡๏ผ‰ | +| **ๅ…‹้š†ๆจกๅผ** | ้š”็ฆปๅ‚่€ƒ้Ÿณ้ข‘๏ผˆๆ— ้œ€ๆ–‡ๆœฌ๏ผ‰ & ้Ÿณ้ข‘็ปญๅ†™ | ไป…้Ÿณ้ข‘็ปญๅ†™ | ไป…้Ÿณ้ข‘็ปญๅ†™ | +| **้Ÿณ่‰ฒ่ฎพ่ฎก** | โœ… | โ€” | โ€” | +| **ๅฏๆŽงๅฃฐ้Ÿณๅ…‹้š†** | โœ… | โ€” | โ€” | +| **SFT / LoRA** | โœ… | โœ… | โœ… | +| **RTF (RTX 4090)** | ~0.30 | ~0.15 | ~0.17 | +| **RTF Nano-VLLM (RTX 4090)** | ~0.13 | ~0.08 | ~0.10 | +| **ๆ˜พๅญ˜ๅ ็”จ** | ~8 GB | ~6 GB | ~5 GB | +| **ๆจกๅž‹ๆƒ้‡** | [๐Ÿค— HF](https://huggingface.co/openbmb/VoxCPM2) / [MS](https://modelscope.cn/models/OpenBMB/VoxCPM2) | [๐Ÿค— HF](https://huggingface.co/openbmb/VoxCPM1.5) / [MS](https://modelscope.cn/models/OpenBMB/VoxCPM1.5) | [๐Ÿค— HF](https://huggingface.co/openbmb/VoxCPM-0.5B) / [MS](https://modelscope.cn/models/OpenBMB/VoxCPM-0.5B) | +| **ๆŠ€ๆœฏๆŠฅๅ‘Š** | [arXiv](https://arxiv.org/abs/2606.06928) | โ€” | [arXiv](https://arxiv.org/abs/2509.24650) [ICLR 2026](https://openreview.net/forum?id=h5KLpGoqzC) | +| **Demo ้กต้ข** | [้Ÿณ้ข‘็คบไพ‹](https://openbmb.github.io/voxcpm2-demopage) | โ€” | [้Ÿณ้ข‘็คบไพ‹](https://openbmb.github.io/VoxCPM-demopage) | + +VoxCPM2 ้‡‡็”จ**่ฟž็ปญ้Ÿณ้ข‘่กจๅพใ€ๆ‰ฉๆ•ฃ่‡ชๅ›žๅฝ’**่Œƒๅผ๏ผŒๆจกๅž‹ๅœจ **AudioVAE** ็š„่ฟž็ปญ้š็ฉบ้—ดไธญ้€š่ฟ‡ๅ››้˜ถๆฎตๅค„็†๏ผš**LocEnc โ†’ TSLM โ†’ RALM โ†’ LocDiT**๏ผŒๅฎž็ŽฐไธฐๅฏŒ็š„่กจ็ŽฐๅŠ›่ฏญ้Ÿณๅˆๆˆๅ’Œ 48kHz ๅŽŸ็”Ÿ้Ÿณ้ข‘่พ“ๅ‡บใ€‚ + +
+ VoxCPM2 ๆจกๅž‹ๆžถๆž„ +
+ +> ๅฎŒๆ•ดๆžถๆž„็ป†่Š‚ใ€VoxCPM2 ๅ‡็บงๅ†…ๅฎนๅ’Œๆจกๅž‹ๅฏนๆฏ”่กจ่ง [ๆžถๆž„่ฎพ่ฎกๆ–‡ๆกฃ](https://voxcpm.readthedocs.io/zh-cn/latest/models/architecture.html)ใ€‚ + +--- + +## ๐Ÿ“Š ๆ€ง่ƒฝ่ฏ„ๆต‹ + +VoxCPM2 ๅœจๅ…ฌๅผ€็š„้›ถๆ ทๆœฌๅ’ŒๅฏๆŽง TTS ๅŸบๅ‡†ๆต‹่ฏ•ไธญๅ–ๅพ—ไบ† SOTA ๆˆ–ๅฏๆฏ”็š„็ป“ๆžœใ€‚ + +### Seed-TTS-eval + +
+Seed-TTS-eval WER(โฌ‡)&SIM(โฌ†) ็ป“ๆžœ๏ผˆ็‚นๅ‡ปๅฑ•ๅผ€๏ผ‰ + +| Model | Parameters | Open-Source | test-EN | | test-ZH | | test-Hard | | +|------|------|------|:------------:|:--:|:------------:|:--:|:-------------:|:--:| +| | | | WER/%โฌ‡ | SIM/%โฌ†| CER/%โฌ‡| SIM/%โฌ† | CER/%โฌ‡ | SIM/%โฌ† | +| MegaTTS3 | 0.5B | โŒ | 2.79 | 77.1 | 1.52 | 79.0 | - | - | +| DiTAR | 0.6B | โŒ | 1.69 | 73.5 | 1.02 | 75.3 | - | - | +| CosyVoice3 | 0.5B | โŒ | 2.02 | 71.8 | 1.16 | 78.0 | 6.08 | 75.8 | +| CosyVoice3 | 1.5B | โŒ | 2.22 | 72.0 | 1.12 | 78.1 | 5.83 | 75.8 | +| Seed-TTS | - | โŒ | 2.25 | 76.2 | 1.12 | 79.6 | 7.59 | 77.6 | +| MiniMax-Speech | - | โŒ | 1.65 | 69.2 | 0.83 | 78.3 | - | - | +| F5-TTS | 0.3B | โœ… | 2.00 | 67.0 | 1.53 | 76.0 | 8.67 | 71.3 | +| MaskGCT | 1B | โœ… | 2.62 | 71.7 | 2.27 | 77.4 | - | - | +| CosyVoice | 0.3B | โœ… | 4.29 | 60.9 | 3.63 | 72.3 | 11.75 | 70.9 | +| CosyVoice2 | 0.5B | โœ… | 3.09 | 65.9 | 1.38 | 75.7 | 6.83 | 72.4 | +| SparkTTS | 0.5B | โœ… | 3.14 | 57.3 | 1.54 | 66.0 | - | - | +| FireRedTTS | 0.5B | โœ… | 3.82 | 46.0 | 1.51 | 63.5 | 17.45 | 62.1 | +| FireRedTTS-2 | 1.5B | โœ… | 1.95 | 66.5 | 1.14 | 73.6 | - | - | +| Qwen2.5-Omni | 7B | โœ… | 2.72 | 63.2 | 1.70 | 75.2 | 7.97 | 74.7 | +| Qwen3-Omni | 30B-A3B | โœ… | 1.39 | - | 1.07 | - | - | - | +| OpenAudio-s1-mini | 0.5B | โœ… | 1.94 | 55.0 | 1.18 | 68.5 | 23.37 | 64.3 | +| IndexTTS2 | 1.5B | โœ… | 2.23 | 70.6 | 1.03 | 76.5 | 7.12 | 75.5 | +| VibeVoice | 1.5B | โœ… | 3.04 | 68.9 | 1.16 | 74.4 | - | - | +| HiggsAudio-v2 | 3B | โœ… | 2.44 | 67.7 | 1.50 | 74.0 | 55.07 | 65.6 | +| VoxCPM-0.5B | 0.6B | โœ… | 1.85 | 72.9 | 0.93 | 77.2 | 8.87 | 73.0 | +| VoxCPM1.5 | 0.8B | โœ… | 2.12 | 71.4 | 1.18 | 77.0 | 7.74 | 73.1 | +| MOSS-TTS | | โœ… | 1.85 | 73.4 | 1.20 | 78.8 | - | - | +| Qwen3-TTS | 1.7B | โœ… | 1.23 | 71.7 | 1.22 | 77.0 | 6.76 | 74.8 | +| FishAudio S2 | 4B | โœ… | 0.99 | - | 0.54 | - | 5.99 | - | +| LongCat-Audio-DiT | 3.5B | โœ… | 1.50 | 78.6 | 1.09 | 81.8 | 6.04 | 79.7 | +| **VoxCPM2** | 2B | โœ… | 1.84 | 75.3 | 0.97| 79.5| 8.13 | 75.3 | +
+ + +### CV3-eval +
+CV3-eval ๅคš่ฏญ่จ€ WER/CER(โฌ‡) ็ป“ๆžœ๏ผˆ็‚นๅ‡ปๅฑ•ๅผ€๏ผ‰ + +| Model | zh | en | hard-zh | hard-en | ja | ko | de | es | fr | it | ru | +|-------|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:| +| CosyVoice2 | 4.08 | 6.32 | 12.58| 11.96| 9.13 | 19.7 |- | - | - | - | - | +| CosyVoice3-1.5B | 3.91 | 4.99 | 9.77 | 10.55 | 7.57 | 5.69 | 6.43 | 4.47 | 11.8 | 10.5 | 6.64 | +| Fish Audio S2 | 2.65 | 2.43 | 9.10 | 4.40 | 3.96 | 2.76 | 2.22 | 2.00 | 6.26 | 2.04 | 2.78 | +| **VoxCPM2** | 3.65 | 5.00 | 8.55 | 8.48 | 5.96 | 5.69 | 4.77 | 3.80 | 9.85 | 4.25 | 5.21 | +
+ +### MiniMax-Multilingual-Test + +
+Minimax-MLS-test WER(โฌ‡) ็ป“ๆžœ๏ผˆ็‚นๅ‡ปๅฑ•ๅผ€๏ผ‰ + +| Language | Minimax | ElevenLabs | Qwen3-TTS | FishAudio S2 | **VoxCPM2** | +|----------|:-------:|:----------:|:--------------------:|:------------:|:-----------:| +| Arabic | **1.665** | 1.666 | โ€“ | 3.500 | 13.046 | +| Cantonese | 34.111 | 51.513 | โ€“ | **30.670** | 38.584 | +| Chinese | 2.252 | 16.026 | 0.928 | **0.730** | 1.136 | +| Czech | 3.875 | **2.108** | โ€“ | 2.840 | 24.132 | +| Dutch | 1.143 | **0.803** | โ€“ | 0.990 | 0.913 | +| English | 2.164 | 2.339 | **0.934** | 1.620 | 2.289 | +| Finnish | 4.666 | 2.964 | โ€“ | 3.330 | **2.632** | +| French | 4.099 | 5.216 | **2.858** | 3.050 | 4.534 | +| German | 1.906 | 0.572 | 1.235 | **0.550** | 0.679 | +| Greek | 2.016 | **0.991** | โ€“ | 5.740 | 2.844 | +| Hindi | 6.962 | **5.827** | โ€“ | 14.640 | 19.699 | +| Indonesian | 1.237 | **1.059** | โ€“ | 1.460 | 1.084 | +| Italian | 1.543 | 1.743 | **0.948** | 1.270 | 1.563 | +| Japanese | 3.519 | 10.646 | 3.823 | **2.760** | 4.628 | +| Korean | 1.747 | 1.865 | 1.755 | **1.180** | 1.962 | +| Polish | 1.415 | **0.766** | โ€“ | 1.260 | 1.141 | +| Portuguese | 1.877 | 1.331 | 1.526 | **1.140** | 1.938 | +| Romanian | 2.878 | **1.347** | โ€“ | 10.740 | 21.577 | +| Russian | 4.281 | 3.878 | 3.212 | **2.400** | 3.634 | +| Spanish | 1.029 | 1.084 | 1.126 | **0.910** | 1.438 | +| Thai | 2.701 | 73.936 | โ€“ | 4.230 | 2.961 | +| Turkish | 1.52 | 0.699 | โ€“ | 0.870 | 0.817 | +| Ukrainian | 1.082 | **0.997** | โ€“ | 2.300 | 6.316 | +| Vietnamese | **0.88** | 73.415 | โ€“ | 7.410 | 3.307 | + +
+ +
+Minimax-MLS-test SIM(โฌ†) ็ป“ๆžœ๏ผˆ็‚นๅ‡ปๅฑ•ๅผ€๏ผ‰ + +| Language | Minimax | ElevenLabs | Qwen3-TTS | FishAudio S2 | **VoxCPM2** | +|----------|:-------:|:----------:|:--------------------:|:------------:|:-----------:| +| Arabic | 73.6 | 70.6 | โ€“ | 75.0 | **79.1** | +| Cantonese | 77.8 | 67.0 | โ€“ | 80.5 | **83.5** | +| Chinese | 78.0 | 67.7 | 79.9 | 81.6 | **82.5** | +| Czech | 79.6 | 68.5 | โ€“ | **79.8** | 78.3 | +| Dutch | 73.8 | 68.0 | โ€“ | 73.0 | **80.8** | +| English | 75.6 | 61.3 | 77.5 | 79.7 | **85.4** | +| Finnish | 83.5 | 75.9 | โ€“ | 81.9 | **89.0** | +| French | 62.8 | 53.5 | 62.8 | 69.8 | **73.5** | +| German | 73.3 | 61.4 | 77.5 | 76.7 | **80.3** | +| Greek | 82.6 | 73.3 | โ€“ | 79.5 | **86.0** | +| Hindi | 81.8 | 73.0 | โ€“ | 82.1 | **85.6** | +| Indonesian | 72.9 | 66.0 | โ€“ | 76.3 | **80.0** | +| Italian | 69.9 | 57.9 | 81.7 | 74.7 | **78.0** | +| Japanese | 77.6 | 73.8 | 78.8 | 79.6 | **82.8** | +| Korean | 77.6 | 70.0 | 79.9 | 81.7 | **83.3** | +| Polish | 80.2 | 72.9 | โ€“ | 81.9 | **88.4** | +| Portuguese | 80.5 | 71.1 | 81.7 | 78.1 | **83.7** | +| Romanian | **80.9** | 69.9 | โ€“ | 73.3 | 79.7 | +| Russian | 76.1 | 67.6 | 79.2 | 79.0 | **81.1** | +| Spanish | 76.2 | 61.5 | 81.4 | 77.6 | **83.1** | +| Thai | 80.0 | 58.8 | โ€“ | 78.6 | **84.0** | +| Turkish | 77.9 | 59.6 | โ€“ | 83.5 | **87.1** | +| Ukrainian | 73.0 | 64.7 | โ€“ | 74.7 | **79.8** | +| Vietnamese | 74.3 | 36.9 | โ€“ | 74.0 | **80.6** | + +
+ +### Internal 30-Language ASR Benchmark + +ๆˆ‘ไปฌ้ขๅค–่ฟ›่กŒไบ†ๅ†…้ƒจๅคš่ฏญ่จ€ๅฏๆ‡‚ๅบฆ่ฏ„ๆต‹๏ผš**30 ่ฏญ็ง ร— 500 ๆ ทๆœฌ**๏ผŒASR ่ฝฌๅ†™่ฏ„ไผฐไฝฟ็”จ **Gemini 3.1 Flash Lite API**ใ€‚ + +
+ๅ†…้ƒจ30่ฏญ็ง่ฏ„ๆต‹้›†ASR็ป“ๆžœ๏ผˆ็‚นๅ‡ปๅฑ•ๅผ€๏ผ‰ + +| ่ฏญ่จ€ | ๆŒ‡ๆ ‡ | VoxCPM2 | Fish S2-Pro | +|---|---:|---:|---:| +| ar (้˜ฟๆ‹‰ไผฏ่ฏญ) | CER | 1.23% | 0.30% | +| da (ไธน้บฆ่ฏญ) | WER | 2.70% | 3.52% | +| de (ๅพท่ฏญ) | WER | 0.96% | 0.64% | +| el (ๅธŒ่…Š่ฏญ) | WER | 3.17% | 4.61% | +| en (่‹ฑ่ฏญ) | WER | 0.42% | 1.03% | +| es (่ฅฟ็ญ็‰™่ฏญ) | WER | 1.33% | 0.64% | +| fi (่Šฌๅ…ฐ่ฏญ) | WER | 2.24% | 2.80% | +| fr (ๆณ•่ฏญ) | WER | 2.16% | 2.34% | +| he (ๅธŒไผฏๆฅ่ฏญ) | CER | 2.98% | 15.27% | +| hi (ๅฐๅœฐ่ฏญ) | CER | 0.79% | 0.91% | +| id (ๅฐๅฐผ่ฏญ) | WER | 1.36% | 1.68% | +| it (ๆ„ๅคงๅˆฉ่ฏญ) | WER | 1.65% | 1.08% | +| ja (ๆ—ฅ่ฏญ) | CER | 2.40% | 1.82% | +| km (้ซ˜ๆฃ‰่ฏญ) | CER | 2.05% | 75.15% | +| ko (้Ÿฉ่ฏญ) | CER | 0.95% | 0.29% | +| lo (่€ๆŒ่ฏญ) | CER | 1.90% | 87.40% | +| ms (้ฉฌๆฅ่ฏญ) | WER | 1.75% | 1.41% | +| my (็ผ…็”ธ่ฏญ) | CER | 1.42% | 85.27% | +| nl (่ทๅ…ฐ่ฏญ) | WER | 1.25% | 1.68% | +| no (ๆŒชๅจ่ฏญ) | WER | 2.49% | 3.76% | +| pl (ๆณขๅ…ฐ่ฏญ) | WER | 1.90% | 1.65% | +| pt (่‘ก่„็‰™่ฏญ) | WER | 1.48% | 1.49% | +| ru (ไฟ„่ฏญ) | WER | 0.90% | 0.86% | +| sv (็‘žๅ…ธ่ฏญ) | WER | 2.22% | 2.63% | +| sw (ๆ–ฏ็“ฆๅธŒ้‡Œ่ฏญ) | CER | 1.07% | 2.02% | +| th (ๆณฐ่ฏญ) | CER | 0.94% | 1.92% | +| tl (่ฒๅพ‹ๅฎพ่ฏญ) | WER | 2.63% | 4.00% | +| tr (ๅœŸ่€ณๅ…ถ่ฏญ) | WER | 1.65% | 1.65% | +| vi (่ถŠๅ—่ฏญ) | WER | 1.56% | 5.56% | +| zh (ไธญๆ–‡) | CER | 0.92% | 1.02% | +| ๅนณๅ‡๏ผˆ30 ่ฏญ็ง๏ผ‰ | | **1.68%** | - | + +
+ + +### InstructTTSEval + +
+ๆŒ‡ไปค้ฉฑๅŠจ้Ÿณ่‰ฒ่ฎพ่ฎก็ป“ๆžœ (็‚นๅ‡ปๅฑ•ๅผ€) + +| Model | InstructTTSEval-ZH | | | InstructTTSEval-EN | | | +|-------|:---:|:----:|:----:|:----:|:----:|:----:| +| | APSโฌ†| DSDโฌ† | RPโฌ†| APSโฌ† | DSDโฌ† | RPโฌ† | +| Hume | โ€“ | โ€“ | โ€“ | 83.0 | 75.3 | 54.3 | +| VoxInstruct | 47.5 | 52.3 | 42.6 | 54.9 | 57.0 | 39.3 | +| Parler-tts-mini | โ€“ | โ€“ | โ€“ | 63.4 | 48.7 | 28.6 | +| Parler-tts-large | โ€“ | โ€“ | โ€“ | 60.0 | 45.9 | 31.2 | +| PromptTTS | โ€“ | โ€“ | โ€“ | 64.3 | 47.2 | 31.4 | +| PromptStyle | โ€“ | โ€“ | โ€“ | 57.4 | 46.4 | 30.9 | +| VoiceSculptor | 75.7 | 64.7 | 61.5 | โ€“ | โ€“ | โ€“ | +| Mimo-Audio-7B-Instruct | 75.7 | 74.3 | 61.5 | 80.6 | 77.6 | 59.5 | +| Qwen3TTS-12Hz-1.7B-VD | **85.2** | **81.1** | **65.1** | 82.9 | 82.4 | 68.4 | +| **VoxCPM2** | **85.2** | 71.5 | 60.8 | **84.2** | **83.2** | **71.4** | + +
+ +--- + +## โš™๏ธ ๅพฎ่ฐƒ + +VoxCPM ๆ”ฏๆŒ**ๅ…จๅ‚ๆ•ฐๅพฎ่ฐƒ๏ผˆSFT๏ผ‰** ๅ’Œ **LoRA ๅพฎ่ฐƒ**ใ€‚ไป…้œ€ **5-10ๅˆ†้’Ÿ** ็š„้Ÿณ้ข‘ๆ•ฐๆฎ๏ผŒๅณๅฏ้€‚้…็‰นๅฎš่ฏด่ฏไบบใ€่ฏญ่จ€ๆˆ–้ข†ๅŸŸใ€‚ + +```bash +# LoRA ๅพฎ่ฐƒ๏ผˆๅ‚ๆ•ฐ้ซ˜ๆ•ˆ๏ผŒๆŽจ่๏ผ‰ +python scripts/train_voxcpm_finetune.py \ + --config_path conf/voxcpm_v2/voxcpm_finetune_lora.yaml + +# ๅ…จๅ‚ๆ•ฐๅพฎ่ฐƒ +python scripts/train_voxcpm_finetune.py \ + --config_path conf/voxcpm_v2/voxcpm_finetune_all.yaml + +# WebUI ่ฎญ็ปƒไธŽๆŽจ็† +python lora_ft_webui.py # ็„ถๅŽๆ‰“ๅผ€ http://localhost:7860 +``` + +> **ๅฎŒๆ•ดๆŒ‡ๅ— โ†’** [ๅพฎ่ฐƒๆ–‡ๆกฃ](https://voxcpm.readthedocs.io/zh-cn/latest/finetuning/finetune.html)๏ผˆๆ•ฐๆฎๅ‡†ๅค‡ใ€้…็ฝฎใ€่ฎญ็ปƒใ€LoRA ็ƒญๅˆ‡ๆขใ€ๅธธ่ง้—ฎ้ข˜๏ผ‰ + +--- + +## ๐Ÿ“š ๆ–‡ๆกฃ + +ๅฎŒๆ•ดๆ–‡ๆกฃ๏ผš**[voxcpm.readthedocs.io](https://voxcpm.readthedocs.io/zh-cn/latest/)** + +| ไธป้ข˜ | ้“พๆŽฅ | +|---|---| +| ๅฟซ้€Ÿๅผ€ๅง‹ไธŽๅฎ‰่ฃ… | [ๅฟซ้€Ÿๅผ€ๅง‹](https://voxcpm.readthedocs.io/zh-cn/latest/quickstart.html) | +| ไฝฟ็”จๆŒ‡ๅ—ไธŽ Cookbook | [ไฝฟ็”จๆŒ‡ๅ—](https://voxcpm.readthedocs.io/zh-cn/latest/usage_guide.html) | +| VoxCPM ็ณปๅˆ—ๆจกๅž‹ | [ๆจกๅž‹ๅˆ—่กจ](https://voxcpm.readthedocs.io/zh-cn/latest/models/version_history.html) | +| ๅพฎ่ฐƒ๏ผˆSFT & LoRA๏ผ‰ | [ๅพฎ่ฐƒๆŒ‡ๅ—](https://voxcpm.readthedocs.io/zh-cn/latest/finetuning/finetune.html) | +| ๅธธ่ง้—ฎ้ข˜ | [FAQ](https://voxcpm.readthedocs.io/zh-cn/latest/faq.html) | + +--- + +## ๐ŸŒŸ ็”Ÿๆ€ไธŽ็คพๅŒบ + +| ้กน็›ฎ | ่ฏดๆ˜Ž | +|---|---| +| [**Nano-vLLM**](https://github.com/a710128/nanovllm-voxcpm) | ้ซ˜ๅžๅๅฟซ้€Ÿ GPU ๆŽจ็†ๅผ•ๆ“Ž | +| [**vLLM-Omni**](https://github.com/vllm-project/vllm-omni) | ๅฎ˜ๆ–น vLLM ๅ…จๆจกๆ€ๆœๅŠก๏ผˆๅŽŸ็”Ÿๆ”ฏๆŒ VoxCPM2๏ผ‰โ€” PagedAttentionใ€OpenAI ๅ…ผๅฎน API | +| [**llama.cpp-omni**](https://github.com/tc-mb/llama.cpp-omni) | ๅ…จๅŒๅทฅๅ…จๆจกๆ€ๆŽจ็†ๅผ•ๆ“Ž โ€” VoxCPM2 GGUF๏ผŒๆ”ฏๆŒ CPU / Metal / CUDA / Vulkan | +| [**VoxCPM.cpp**](https://github.com/bluryar/VoxCPM.cpp) | GGML/GGUF๏ผšCPUใ€CUDAใ€Vulkan ๆŽจ็† | +| [**audio.cpp**](https://github.com/0xShug0/audio.cpp) | ๅŸบไบŽ ggml ็š„็ปŸไธ€ C++ ๆŽจ็†ๆก†ๆžถ โ€” CPU/CUDA/Vulkan/Metal๏ผŒCLI ไธŽๆœๅŠก็ซฏ๏ผŒๆ— ้œ€ Python | +| [**VoxCPM-ONNX**](https://github.com/bluryar/VoxCPM-ONNX) | ONNX ๅฏผๅ‡บ๏ผŒๆ”ฏๆŒ CPU ๆŽจ็† | +| [**VoxCPMANE**](https://github.com/0seba/VoxCPMANE) | Apple Neural Engine ๅŽ็ซฏ | +| [**voxcpm_rs**](https://github.com/madushan1000/voxcpm_rs) | Rust ้‡ๆ–ฐๅฎž็Žฐ | +| [**ComfyUI-VoxCPM**](https://github.com/wildminder/ComfyUI-VoxCPM) | ComfyUI ่Š‚็‚นๅทฅไฝœๆต | +| [**ComfyUI_RH_VoxCPM**](https://github.com/HM-RunningHub/ComfyUI_RH_VoxCPM) | ้ขๅ‘ VoxCPM 2 ็š„ๅŠŸ่ƒฝๆ›ดๅฎŒๆ•ด็š„ ComfyUI ๅทฅไฝœๆต๏ผŒๆ”ฏๆŒๅคš่ฏด่ฏไบบใ€LoRA ๅ’Œ่‡ชๅŠจ ASR | +| [**ComfyUI-VoxCPMTTS**](https://github.com/1038lab/ComfyUI-VoxCPMTTS) | ComfyUI TTS ๆ‰ฉๅฑ• | +| [**TTS WebUI**](https://github.com/rsxdalv/tts_webui_extension.vox_cpm) | ๆต่งˆๅ™จ็ซฏ TTS ๆ‰ฉๅฑ• | + +> ๅฎŒๆ•ด็”Ÿๆ€่ง[ๆ–‡ๆกฃ](https://voxcpm.readthedocs.io/zh-cn/latest/)ใ€‚็คพๅŒบ้กน็›ฎ้ž OpenBMB ๅฎ˜ๆ–น็ปดๆŠคใ€‚ๅšไบ†ไป€ไนˆๆœ‰่ถฃ็š„ไธœ่ฅฟ๏ผŸ[ๆ Issue ๆˆ– PR](https://github.com/OpenBMB/VoxCPM/issues) ๆŠŠๅฎƒๅŠ ่ฟ›ๆฅ๏ผ + +--- + +## โš ๏ธ ้ฃŽ้™ฉไธŽๅฑ€้™ๆ€ง + +- **ๆปฅ็”จ้ฃŽ้™ฉ๏ผš** VoxCPM ็š„ๅฃฐ้Ÿณๅ…‹้š†่ƒฝๅŠ›ๅฏ็”Ÿๆˆ้ซ˜ๅบฆ้€ผ็œŸ็š„ๅˆๆˆ่ฏญ้Ÿณใ€‚**ไธฅ็ฆ**ๅฐ† VoxCPM ็”จไบŽๅ†’ๅ……ไป–ไบบใ€ๆฌบ่ฏˆๆˆ–่™šๅ‡ไฟกๆฏไผ ๆ’ญใ€‚ๆˆ‘ไปฌๅผบ็ƒˆๅปบ่ฎฎๅฏนๆ‰€ๆœ‰ AI ็”Ÿๆˆ็š„ๅ†…ๅฎน่ฟ›่กŒๆ˜Ž็กฎๆ ‡ๆณจใ€‚ +- **ๅฏๆŽง็”Ÿๆˆ็จณๅฎšๆ€ง๏ผš** ้Ÿณ่‰ฒ่ฎพ่ฎกๅ’ŒๅฏๆŽงๅฃฐ้Ÿณๅ…‹้š†็š„็ป“ๆžœๅฏ่ƒฝๅ› ็”Ÿๆˆๆฌกๆ•ฐ่€Œๅผ‚ โ€” ๅปบ่ฎฎๅฐ่ฏ•็”Ÿๆˆ 1~3 ๆฌกไปฅ่Žทๅพ—็†ๆƒณ็š„้Ÿณ่‰ฒๆˆ–้ฃŽๆ ผใ€‚ๆˆ‘ไปฌๆญฃๅœจ็งฏๆžๆๅ‡ๅฏๆŽงๆ€ง็š„ไธ€่‡ดๆ€งใ€‚ +- **่ฏญ่จ€่ฆ†็›–๏ผš** VoxCPM2 ๅฎ˜ๆ–นๆ”ฏๆŒ 30 ็ง่ฏญ่จ€ใ€‚ๅฏนไบŽๆœชๅˆ—ๅ…ฅ็š„่ฏญ่จ€๏ผŒๆฌข่ฟŽ็›ดๆŽฅๆต‹่ฏ•ๆˆ–ไฝฟ็”จ่‡ชๆœ‰ๆ•ฐๆฎ่ฟ›่กŒๅพฎ่ฐƒใ€‚ๆˆ‘ไปฌ่ฎกๅˆ’ๅœจๆœชๆฅ็‰ˆๆœฌไธญๆ‰ฉๅฑ•่ฏญ่จ€่ฆ†็›–ใ€‚ +- **ไฝฟ็”จ่ฏดๆ˜Ž๏ผš** ๆœฌๆจกๅž‹ๅŸบไบŽ Apache-2.0 ๅ่ฎฎๅ‘ๅธƒใ€‚็”จไบŽ็”Ÿไบง้ƒจ็ฝฒๆ—ถ๏ผŒๆˆ‘ไปฌๅปบ่ฎฎ้’ˆๅฏนๅ…ทไฝ“ๅœบๆ™ฏ่ฟ›่กŒๅ……ๅˆ†็š„ๆต‹่ฏ•ๅ’Œๅฎ‰ๅ…จ่ฏ„ไผฐใ€‚ + +--- + +## ๐Ÿ“– ๅผ•็”จ + +ๅฆ‚ๆžœ VoxCPM ๅฏนๆ‚จๆœ‰ๅธฎๅŠฉ๏ผŒ่ฏท่€ƒ่™‘ๅผ•็”จๆˆ‘ไปฌ็š„ๅทฅไฝœๅนถไธบไป“ๅบ“ๅŠ ๆ˜Ÿ โญ๏ผ + +```bib +@article{zhou2026voxcpm2, + title = {VoxCPM2 Technical Report}, + author = {Zhou, Yixuan and Zeng, Guoyang and Liu, Xin and Li, Xiang and Yu, Renjie and Gui, Jiancheng and Wu, Jiaheng and Wang, Ziyang and Shen, Xudong and Ye, Runchuan and Zhang, Zhisheng and Zhou, Jiuyang and Bai, Bingsong and Sun, Weiyue and Deng, Mengyuan and Shi, Qundong and Wu, Zhiyong and Liu, Zhiyuan}, + journal = {arXiv preprint arXiv:2606.06928}, + year = {2026}, +} + +@article{zhou2025voxcpm, + title = {Voxcpm: Tokenizer-free TTS for context-aware speech generation and true-to-life voice cloning}, + author = {Zhou, Yixuan and Zeng, Guoyang and Liu, Xin and Li, Xiang and Yu, Renjie and Wang, Ziyang and Ye, Runchuan and Sun, Weiyue and Gui, Jiancheng and Li, Kehan and Wu, Zhiyong and Liu, Zhiyuan}, + journal = {arXiv preprint arXiv:2509.24650}, + year = {2025} +} +``` + +## ๐Ÿ“„ ่ฎธๅฏ่ฏ + +VoxCPM ๆจกๅž‹ๆƒ้‡ๅ’Œไปฃ็ ๅŸบไบŽ [Apache-2.0](LICENSE) ๅ่ฎฎๅผ€ๆบใ€‚ + +## ๐Ÿ™ ่‡ด่ฐข + +- [DiTAR](https://arxiv.org/abs/2502.03930) ๆ‰ฉๆ•ฃ่‡ชๅ›žๅฝ’้ชจๅนฒๆžถๆž„ +- [MiniCPM-4](https://github.com/OpenBMB/MiniCPM) ่ฏญ่จ€ๆจกๅž‹ๅŸบๅบง +- [CosyVoice](https://github.com/FunAudioLLM/CosyVoice) ๅŸบไบŽ Flow Matching ็š„ LocDiT ๅฎž็Žฐ +- [DAC](https://github.com/descriptinc/descript-audio-codec) Audio VAE ้ชจๅนฒ +- ๆ„Ÿ่ฐขๆ‰€ๆœ‰็คพๅŒบ็”จๆˆท่ฏ•็”จ VoxCPMใ€ๅ้ฆˆ้—ฎ้ข˜ใ€ๅˆ†ไบซๆƒณๆณ•ๅ’Œ่ดก็Œฎโ€”โ€”ไฝ ไปฌ็š„ๆ”ฏๆŒ่ฎฉ้กน็›ฎๆŒ็ปญ่ฟ›ๆญฅ + +## ๆœบๆž„ + +

+ ้ขๅฃๆ™บ่ƒฝ +     + ๆธ…ๅŽๅคงๅญฆไบบๆœบไบคไบ’ๅฎž้ชŒๅฎค +

+ +## โญ Star ๅކๅฒ + +[![Star History Chart](https://api.star-history.com/svg?repos=OpenBMB/VoxCPM&type=Date)](https://star-history.com/#OpenBMB/VoxCPM&Date) diff --git a/app.py b/app.py new file mode 100644 index 0000000..1544828 --- /dev/null +++ b/app.py @@ -0,0 +1,606 @@ +import os +import re +import sys +import logging +import random +import numpy as np +import gradio as gr +from typing import Optional, Tuple +from funasr import AutoModel +from pathlib import Path + +os.environ["TOKENIZERS_PARALLELISM"] = "false" + +import voxcpm +from voxcpm.model.utils import resolve_runtime_device + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[logging.StreamHandler(sys.stdout)], +) +logger = logging.getLogger(__name__) + +# ---------- Inline i18n (en + zh-CN only) ---------- + +_USAGE_INSTRUCTIONS_EN = ( + "**VoxCPM2 โ€” Three Modes of Speech Generation:**\n\n" + "๐ŸŽจ **Voice Design** โ€” Create a brand-new voice \n" + "No reference audio required. Describe the desired voice characteristics " + "(gender, age, tone, emotion, pace โ€ฆ) in **Control Instruction**, and VoxCPM2 " + "will craft a unique voice from your description alone.\n\n" + "๐ŸŽ›๏ธ **Controllable Cloning** โ€” Clone a voice with optional style guidance \n" + "Upload a reference audio clip, then use **Control Instruction** to steer " + "emotion, speaking pace, and overall style while preserving the original timbre.\n\n" + "๐ŸŽ™๏ธ **Ultimate Cloning** โ€” Reproduce every vocal nuance through audio continuation \n" + "Turn on **Ultimate Cloning Mode** and provide (or auto-transcribe) the reference audio's transcript. " + "The model treats the reference clip as a spoken prefix and seamlessly **continues** from it, faithfully preserving every vocal detail." + "Note: This mode will disable Control Instruction." +) + +_EXAMPLES_FOOTER_EN = ( + "---\n" + "**๐Ÿ’ก Voice Description Examples:** \n" + "Try the following Control Instructions to explore different voices: \n\n" + "**Example 1 โ€” Gentle & Melancholic Girl** \n" + '`Control Instruction`: *"A young girl with a soft, sweet voice. ' + 'Speaks slowly with a melancholic, slightly tsundere tone."* \n' + "`Target Text`: *\"I never asked you to stayโ€ฆ It's not like I care or anything. " + "Butโ€ฆ why does it still hurt so much now that you're gone?\"* \n\n" + "**Example 2 โ€” Laid-Back Surfer Dude** \n" + '`Control Instruction`: *"Relaxed young male voice, slightly nasal, ' + 'lazy drawl, very casual and chill."* \n' + '`Target Text`: *"Dude, did you see that set? The waves out there are totally gnarly today. ' + "Just catching barrels all morning โ€” it's like, totally righteous, you know what I mean?\"*" +) + +_USAGE_INSTRUCTIONS_ZH = ( + "**VoxCPM2 โ€” ไธ‰็ง่ฏญ้Ÿณ็”Ÿๆˆๆ–นๅผ๏ผš**\n\n" + "๐ŸŽจ **ๅฃฐ้Ÿณ่ฎพ่ฎก๏ผˆVoice Design๏ผ‰** \n" + "ๆ— ้œ€ๅ‚่€ƒ้Ÿณ้ข‘ใ€‚ๅœจ **Control Instruction** ไธญๆ่ฟฐ็›ฎๆ ‡้Ÿณ่‰ฒ็‰นๅพ" + "๏ผˆๆ€งๅˆซใ€ๅนด้พ„ใ€่ฏญๆฐ”ใ€ๆƒ…็ปชใ€่ฏญ้€Ÿ็ญ‰๏ผ‰๏ผŒVoxCPM2 ๅณๅฏไธบไฝ ไปŽ้›ถๅˆ›้€ ็‹ฌไธ€ๆ— ไบŒ็š„ๅฃฐ้Ÿณใ€‚\n\n" + "๐ŸŽ›๏ธ **ๅฏๆŽงๅ…‹้š†๏ผˆControllable Cloning๏ผ‰** \n" + "ไธŠไผ ๅ‚่€ƒ้Ÿณ้ข‘๏ผŒๅŒๆ—ถๅฏ้€‰ๅœฐไฝฟ็”จ **Control Instruction** ๆฅๆŒ‡ๅฎšๆƒ…็ปชใ€่ฏญ้€Ÿใ€้ฃŽๆ ผ็ญ‰่กจ่พพๆ–นๅผ๏ผŒ" + "ๅœจไฟ็•™ๅŽŸๅง‹้Ÿณ่‰ฒ็š„ๅŸบ็ก€ไธŠ็ตๆดปๆŽงๅˆถ่ฏด่ฏ้ฃŽๆ ผใ€‚\n\n" + "๐ŸŽ™๏ธ **ๆž่‡ดๅ…‹้š†๏ผˆUltimate Cloning๏ผ‰** \n" + "ๅผ€ๅฏ **ๆž่‡ดๅ…‹้š†ๆจกๅผ** ๅนถๆไพ›ๅ‚่€ƒ้Ÿณ้ข‘็š„ๆ–‡ๅญ—ๅ†…ๅฎน๏ผˆๅฏ่‡ชๅŠจ่ฏ†ๅˆซ๏ผ‰ใ€‚" + "ๆจกๅž‹ไผšๅฐ†ๅ‚่€ƒ้Ÿณ้ข‘่ง†ไธบๅทฒ่ฏดๅ‡บ็š„ๅ‰ๆ–‡๏ผŒไปฅ**้Ÿณ้ข‘็ปญๅ†™**็š„ๆ–นๅผๅฎŒๆ•ด่ฟ˜ๅŽŸๅ‚่€ƒ้Ÿณ้ข‘ไธญ็š„ๆ‰€ๆœ‰ๅฃฐ้Ÿณ็ป†่Š‚ใ€‚" + "ๆณจๆ„๏ผš่ฏฅๆจกๅผไธŽๅฏๆŽงๅ…‹้š†ๆจกๅผไบ’ๆ–ฅ๏ผŒๅฐ†็ฆ็”จControl Instructionใ€‚\n\n" +) + +_EXAMPLES_FOOTER_ZH = ( + "---\n" + "**๐Ÿ’ก ๅฃฐ้Ÿณๆ่ฟฐ็คบไพ‹๏ผˆไธญ่‹ฑๆ–‡ๅ‡ๅฏ๏ผ‰๏ผš** \n\n" + "**็คบไพ‹ 1 โ€” ๆทฑๅฎซๅคชๅŽ** \n" + '`Control Instruction`: *"ไธญ่€ๅนดๅฅณๆ€ง๏ผŒๅฃฐ้ŸณไฝŽๆฒ‰้˜ดๅ†ท๏ผŒ่ฏญ้€Ÿ็ผ“ๆ…ข่€Œๆœ‰ๅŠ›๏ผŒ' + 'ๅญ—ๅญ—ๆทฑๆ€็†Ÿ่™‘๏ผŒๅธฆๆœ‰ๆทฑไธๅฏๆต‹็š„ๅŸŽๅบœไธŽๅจๆ…‘ๆ„Ÿใ€‚"* \n' + '`Target Text`: *"ๅ“€ๅฎถๅœจ่ฟ™ๆทฑๅฎซๅพ…ไบ†ๅ››ๅๅนด๏ผŒไป€ไนˆ้ฃŽๆตชๆฒก่ง่ฟ‡๏ผŸไฝ ไปฅไธบ็ž’ๅพ—่ฟ‡ๅ“€ๅฎถ๏ผŸ"* \n\n' + "**็คบไพ‹ 2 โ€” ๆšด่บ้ฉพๆ กๆ•™็ปƒ** \n" + '`Control Instruction`: *"ๆšด่บ็š„ไธญๅนด็”ทๅฃฐ๏ผŒ่ฏญ้€Ÿๅฟซ๏ผŒๅ……ๆปกๆ— ๅฅˆๅ’Œๆ„คๆ€’"* \n' + '`Target Text`: *"่ธฉ็ฆปๅˆ๏ผ่ธฉๅˆน่ฝฆๅ•Š๏ผไฝ ๅพ€ๅ“ชๅ„ฟๅผ€ๅ‘ข๏ผŸๅ‰้ขๆ˜ฏๆ ‘ไฝ ็œ‹ไธ่งๅ—๏ผŸ' + 'ๆˆ‘ๆ•™ไบ†ไฝ ๅ…ซ็™พ้ไบ†๏ผŒๆ‰“ๆญปๆ–นๅ‘็›˜๏ผไฝ ๆ˜ฏไธๆ˜ฏๆƒณๆŠŠ่ฝฆ็ป™ๆˆ‘ๅผ€ๅˆฐๆฒŸ้‡ŒๅŽป๏ผŸ"* \n\n' + "---\n" + "**๐Ÿ—ฃ๏ธ ๆ–น่จ€็”ŸๆˆๆŒ‡ๅ—๏ผš** \n" + "่ฆ็”Ÿๆˆๅœฐ้“็š„ๆ–น่จ€่ฏญ้Ÿณ๏ผŒ่ฏทๅœจ **Target Text** ไธญ็›ดๆŽฅไฝฟ็”จๆ–น่จ€่ฏๆฑ‡ๅ’Œๅฅๅผ๏ผŒ" + "ๅนถๅœจ **Control Instruction** ไธญๆ่ฟฐๆ–น่จ€็‰นๅพใ€‚ \n\n" + "**็คบไพ‹ โ€” ๅนฟไธœ่ฏ** \n" + '`Control Instruction`: *"็ฒค่ฏญ๏ผŒไธญๅนด็”ทๆ€ง๏ผŒ่ฏญๆฐ”ๅนณๆทก"* \n' + 'โœ… ๆญฃ็กฎ๏ผˆ็ฒค่ฏญ่กจ่พพ๏ผ‰๏ผš*"ไผ™่จˆ๏ผŒๅ””่ฉฒไธ€ๅ€‹A้ค๏ผŒๅ‡ๅฅถ่Œถๅฐ‘็”œ๏ผ"* \n' + 'โŒ ้”™่ฏฏ๏ผˆๆ™ฎ้€š่ฏๅŽŸๆ–‡๏ผ‰๏ผš*"ไผ™่ฎก๏ผŒ้บป็ƒฆๆฅไธ€ไธชA้ค๏ผŒๅ†ปๅฅถ่Œถๅฐ‘็”œ๏ผ"* \n\n' + "**็คบไพ‹ โ€” ๆฒณๅ—่ฏ** \n" + '`Control Instruction`: *"ๆฒณๅ—่ฏ๏ผŒๆŽฅๅœฐๆฐ”็š„ๅคงๅ”"* \n' + 'โœ… ๆญฃ็กฎ๏ผˆๆฒณๅ—่ฏ่กจ่พพ๏ผ‰๏ผš*"ๆ่ฟ™ๆ˜ฏๅผ„ๅ•ฅๅ˜ž๏ผŸๆ™Œๅˆๅƒๅ•ฅ้ฅญ๏ผŸ"* \n' + 'โŒ ้”™่ฏฏ๏ผˆๆ™ฎ้€š่ฏๅŽŸๆ–‡๏ผ‰๏ผš*"ไฝ ่ฟ™ๆ˜ฏๅœจๅนฒไป€ไนˆๅ‘ข๏ผŸไธญๅˆๅƒไป€ไนˆ้ฅญ๏ผŸ"* \n\n' + "๐Ÿค– **ๅฐๆŠ€ๅทง๏ผš** ไธ็Ÿฅ้“ๆ–น่จ€ๆ€Žไนˆๅ†™๏ผŸๅฏไปฅ็”จ่ฑ†ๅŒ…ใ€DeepSeekใ€Kimi ็ญ‰ AI ๅŠฉๆ‰‹" + "ๅฐ†ๆ™ฎ้€š่ฏ็ฟป่ฏ‘ไธบๆ–น่จ€ๆ–‡ๆœฌ๏ผŒๅ†็ฒ˜่ดดๅˆฐ Target Text ไธญๅณๅฏใ€‚ \n\n" +) + +_I18N_TRANSLATIONS = { + "en": { + "reference_audio_label": "๐ŸŽค Reference Audio (optional โ€” upload for cloning)", + "show_prompt_text_label": "๐ŸŽ™๏ธ Ultimate Cloning Mode (transcript-guided cloning)", + "show_prompt_text_info": "Auto-transcribes reference audio for every vocal nuance reproduced. Control Instruction will be disabled when active.", + "prompt_text_label": "Transcript of Reference Audio (auto-filled via ASR, editable)", + "prompt_text_placeholder": "The transcript of your reference audio will appear here โ€ฆ", + "control_label": "๐ŸŽ›๏ธ Control Instruction (optional โ€” supports Chinese & English)", + "control_placeholder": "e.g. A warm young woman / ๅนด่ฝปๅฅณๆ€ง๏ผŒๆธฉๆŸ”็”œ็พŽ / Excited and fast-paced", + "target_text_label": "โœ๏ธ Target Text โ€” the content to speak", + "generate_btn": "๐Ÿ”Š Generate Speech", + "generated_audio_label": "Generated Audio", + "advanced_settings_title": "โš™๏ธ Advanced Settings", + "ref_denoise_label": "Reference audio enhancement", + "ref_denoise_info": "Apply ZipEnhancer denoising to the reference audio before cloning", + "normalize_label": "Text normalization", + "normalize_info": "Normalize numbers, dates, and abbreviations via wetext", + "cfg_label": "CFG (guidance scale)", + "cfg_info": "Higher โ†’ closer to the prompt / reference; lower โ†’ more creative variation", + "dit_steps_label": "LocDiT flow-matching steps", + "dit_steps_info": "LocDiT flow-matching steps โ€” more steps โ†’ maybe better audio quality, but slower", + "seed_label": "Seed", + "seed_info": "Seed used for reproducible generation. Updated with the actual successful seed after generation.", + "random_seed_label": "Random Seed", + "random_seed_info": "Generate a new seed before each inference run.", + "usage_instructions": _USAGE_INSTRUCTIONS_EN, + "examples_footer": _EXAMPLES_FOOTER_EN, + }, + "zh-CN": { + "reference_audio_label": "๐ŸŽค ๅ‚่€ƒ้Ÿณ้ข‘๏ผˆๅฏ้€‰ โ€” ไธŠไผ ๅŽ็”จไบŽๅ…‹้š†๏ผ‰", + "show_prompt_text_label": "๐ŸŽ™๏ธ ๆž่‡ดๅ…‹้š†ๆจกๅผ๏ผˆๅŸบไบŽๆ–‡ๆœฌๅผ•ๅฏผ็š„ๆž่‡ดๅ…‹้š†๏ผ‰", + "show_prompt_text_info": "่‡ชๅŠจ่ฏ†ๅˆซๅ‚่€ƒ้Ÿณ้ข‘ๆ–‡ๆœฌ๏ผŒๅฎŒๆ•ด่ฟ˜ๅŽŸ้Ÿณ่‰ฒใ€่Š‚ๅฅใ€ๆƒ…ๆ„Ÿ็ญ‰ๅ…จ้ƒจๅฃฐ้Ÿณ็ป†่Š‚ใ€‚ๅผ€ๅฏๅŽ Control Instruction ๅฐ†ๆš‚ๆ—ถ็ฆ็”จ", + "prompt_text_label": "ๅ‚่€ƒ้Ÿณ้ข‘ๅ†…ๅฎนๆ–‡ๆœฌ๏ผˆASR ่‡ชๅŠจๅกซๅ……๏ผŒๅฏๆ‰‹ๅŠจ็ผ–่พ‘๏ผ‰", + "prompt_text_placeholder": "ๅ‚่€ƒ้Ÿณ้ข‘็š„ๆ–‡ๅญ—ๅ†…ๅฎนๅฐ†่‡ชๅŠจ่ฏ†ๅˆซๅนถๆ˜พ็คบๅœจๆญคๅค„ โ€ฆ", + "control_label": "๐ŸŽ›๏ธ Control Instruction๏ผˆๅฏ้€‰ โ€” ๆ”ฏๆŒไธญ่‹ฑๆ–‡ๆ่ฟฐ๏ผ‰", + "control_placeholder": "ๅฆ‚๏ผšๅนด่ฝปๅฅณๆ€ง๏ผŒๆธฉๆŸ”็”œ็พŽ / A warm young woman / ๆšด่บ่€ๅ“ฅ๏ผŒ่ฏญ้€Ÿ้ฃžๅฟซ", + "target_text_label": "โœ๏ธ Target Text โ€” ่ฆๅˆๆˆ็š„็›ฎๆ ‡ๆ–‡ๆœฌ", + "generate_btn": "๐Ÿ”Š ๅผ€ๅง‹็”Ÿๆˆ", + "generated_audio_label": "็”Ÿๆˆ็ป“ๆžœ", + "advanced_settings_title": "โš™๏ธ ้ซ˜็บง่ฎพ็ฝฎ", + "ref_denoise_label": "ๅ‚่€ƒ้Ÿณ้ข‘้™ๅ™ชๅขžๅผบ", + "ref_denoise_info": "ๅ…‹้š†ๅ‰ไฝฟ็”จ ZipEnhancer ๅฏนๅ‚่€ƒ้Ÿณ้ข‘่ฟ›่กŒ้™ๅ™ชๅค„็†", + "normalize_label": "ๆ–‡ๆœฌ่ง„่ŒƒๅŒ–", + "normalize_info": "่‡ชๅŠจ่ง„่ŒƒๅŒ–ๆ•ฐๅญ—ใ€ๆ—ฅๆœŸๅŠ็ผฉๅ†™๏ผˆๅŸบไบŽ wetext๏ผ‰", + "cfg_label": "CFG๏ผˆๅผ•ๅฏผๅผบๅบฆ๏ผ‰", + "cfg_info": "ๆ•ฐๅ€ผ่ถŠ้ซ˜ โ†’ ่ถŠ่ดดๅˆๆ็คบ/ๅ‚่€ƒ้Ÿณ่‰ฒ๏ผ›ๆ•ฐๅ€ผ่ถŠไฝŽ โ†’ ็”Ÿๆˆ้ฃŽๆ ผๆ›ด่‡ช็”ฑ", + "dit_steps_label": "LocDiT ๆตๅŒน้…่ฟญไปฃๆญฅๆ•ฐ", + "dit_steps_info": "LocDiT ๆตๅŒน้…็”Ÿๆˆ่ฟญไปฃๆญฅๆ•ฐ โ€” ๆญฅๆ•ฐ่ถŠๅคš โ†’ ๅฏ่ƒฝ็”Ÿๆˆๆ›ดๅฅฝ็š„้Ÿณ้ข‘่ดจ้‡๏ผŒไฝ†้€Ÿๅบฆๅ˜ๆ…ข", + "usage_instructions": _USAGE_INSTRUCTIONS_ZH, + "examples_footer": _EXAMPLES_FOOTER_ZH, + }, + "zh-Hans": None, # alias, filled below + "zh": None, # alias, filled below +} +_I18N_TRANSLATIONS["zh-Hans"] = _I18N_TRANSLATIONS["zh-CN"] +_I18N_TRANSLATIONS["zh"] = _I18N_TRANSLATIONS["zh-CN"] + +for _d in _I18N_TRANSLATIONS.values(): + if _d is not None: + for _k, _v in _I18N_TRANSLATIONS["en"].items(): + _d.setdefault(_k, _v) + +I18N = gr.I18n(**_I18N_TRANSLATIONS) + +DEFAULT_TARGET_TEXT = ( + "VoxCPM2 is a creative multilingual TTS model from ModelBest, " "designed to generate highly realistic speech." +) + +_CUSTOM_CSS = """ +.logo-container { + text-align: center; + margin: 0.5rem 0 1rem 0; +} +.logo-container img { + height: 80px; + width: auto; + max-width: 200px; + display: inline-block; +} + +/* Toggle switch style */ +.switch-toggle { + padding: 8px 12px; + border-radius: 8px; + background: var(--block-background-fill); +} +.switch-toggle input[type="checkbox"] { + appearance: none; + -webkit-appearance: none; + width: 44px; + height: 24px; + background: #ccc; + border-radius: 12px; + position: relative; + cursor: pointer; + transition: background 0.3s ease; + flex-shrink: 0; +} +.switch-toggle input[type="checkbox"]::after { + content: ""; + position: absolute; + top: 2px; + left: 2px; + width: 20px; + height: 20px; + background: white; + border-radius: 50%; + transition: transform 0.3s ease; + box-shadow: 0 1px 3px rgba(0,0,0,0.2); +} +.switch-toggle input[type="checkbox"]:checked { + background: var(--color-accent); +} +.switch-toggle input[type="checkbox"]:checked::after { + transform: translateX(20px); +} +""" + +_APP_THEME = gr.themes.Soft( + primary_hue="blue", + secondary_hue="gray", + neutral_hue="slate", + font=[gr.themes.GoogleFont("Inter"), "Arial", "sans-serif"], +) + + +# ---------- Model ---------- + + +class VoxCPMDemo: + def __init__(self, model_id: str = "openbmb/VoxCPM2", device: str = "auto") -> None: + self.device = resolve_runtime_device(device, "cuda") + logger.info(f"Running VoxCPM on device: {self.device}") + self.optimize = self.device.startswith("cuda") + + self.asr_model_id = "iic/SenseVoiceSmall" + self.asr_device = "cuda:0" if self.device.startswith("cuda") else "cpu" + self.asr_model: Optional[AutoModel] = None + + self.voxcpm_model: Optional[voxcpm.VoxCPM] = None + self._model_id = model_id + + def get_or_load_voxcpm(self) -> voxcpm.VoxCPM: + if self.voxcpm_model is not None: + return self.voxcpm_model + logger.info(f"Loading model: {self._model_id}") + self.voxcpm_model = voxcpm.VoxCPM.from_pretrained( + self._model_id, + optimize=self.optimize, + device=self.device, + ) + logger.info("Model loaded successfully.") + return self.voxcpm_model + + def get_or_load_asr_model(self) -> AutoModel: + if self.asr_model is not None: + return self.asr_model + logger.info(f"Loading ASR model: {self.asr_model_id} on device: {self.asr_device}") + self.asr_model = AutoModel( + model=self.asr_model_id, + disable_update=True, + log_level="DEBUG", + device=self.asr_device, + ) + logger.info("ASR model loaded successfully.") + return self.asr_model + + def prompt_wav_recognition(self, prompt_wav: Optional[str]) -> str: + if prompt_wav is None: + return "" + res = self.get_or_load_asr_model().generate( + input=prompt_wav, + language="auto", + use_itn=True, + ) + return res[0]["text"].split("|>")[-1] + + def _build_generate_kwargs( + self, + *, + final_text: str, + audio_path: Optional[str], + prompt_text_clean: Optional[str], + cfg_value_input: float, + do_normalize: bool, + denoise: bool, + inference_timesteps: int = 10, + seed: Optional[int] = None, + ) -> dict: + generate_kwargs = dict( + text=final_text, + reference_wav_path=audio_path, + cfg_value=float(cfg_value_input), + inference_timesteps=inference_timesteps, + normalize=do_normalize, + denoise=denoise, + seed=seed, + ) + if prompt_text_clean and audio_path: + generate_kwargs["prompt_wav_path"] = audio_path + generate_kwargs["prompt_text"] = prompt_text_clean + return generate_kwargs + + def generate_tts_audio( + self, + text_input: str, + control_instruction: str = "", + reference_wav_path_input: Optional[str] = None, + prompt_text: str = "", + cfg_value_input: float = 2.0, + do_normalize: bool = True, + denoise: bool = True, + inference_timesteps: int = 10, + seed: Optional[int] = None, + ) -> Tuple[int, np.ndarray, Optional[int]]: + current_model = self.get_or_load_voxcpm() + + text = (text_input or "").strip() + if len(text) == 0: + raise ValueError("Please input text to synthesize.") + + control = (control_instruction or "").strip() + # Strip any parentheses (half-width/full-width) from control text to avoid + # breaking the "(control)text" prompt format expected by the model. + control = re.sub(r"[()๏ผˆ๏ผ‰]", "", control).strip() + final_text = f"({control}){text}" if control else text + + audio_path = reference_wav_path_input if reference_wav_path_input else None + prompt_text_clean = (prompt_text or "").strip() or None + + if audio_path and prompt_text_clean: + logger.info(f"[Voice Cloning] prompt_wav + prompt_text + reference_wav") + elif audio_path: + logger.info(f"[Voice Control] reference_wav only") + else: + logger.info(f"[Voice Design] control: {control[:50] if control else 'None'}...") + + logger.info(f"Generating audio for text: '{final_text[:80]}...'") + generate_kwargs = self._build_generate_kwargs( + final_text=final_text, + audio_path=audio_path, + prompt_text_clean=prompt_text_clean, + cfg_value_input=cfg_value_input, + do_normalize=do_normalize, + denoise=denoise, + inference_timesteps=inference_timesteps, + seed=seed, + ) + wav = current_model.generate(**generate_kwargs) + last_successful_seed = getattr(current_model.tts_model, "last_successful_seed", seed) + return (current_model.tts_model.sample_rate, wav, last_successful_seed) + + +# ---------- UI ---------- + + +def create_demo_interface(demo: VoxCPMDemo): + gr.set_static_paths(paths=[Path.cwd().absolute() / "assets"]) + + def _coerce_seed(seed_value) -> Optional[int]: + if seed_value is None or seed_value == "": + return None + return int(seed_value) + + def _prepare_seed(use_random_seed: bool, seed_value): + if use_random_seed: + return random.randint(0, 2**32 - 1) + return _coerce_seed(seed_value) + + def _on_random_seed_toggle(checked): + return gr.update(interactive=not checked) + + def _generate( + text: str, + control_instruction: str, + ref_wav: Optional[str], + use_prompt_text: bool, + prompt_text_value: str, + cfg_value: float, + do_normalize: bool, + denoise: bool, + dit_steps: int, + seed_value, + ): + actual_prompt_text = prompt_text_value.strip() if use_prompt_text else "" + actual_control = "" if use_prompt_text else control_instruction + seed = _coerce_seed(seed_value) + sr, wav_np, last_successful_seed = demo.generate_tts_audio( + text_input=text, + control_instruction=actual_control, + reference_wav_path_input=ref_wav, + prompt_text=actual_prompt_text, + cfg_value_input=cfg_value, + do_normalize=do_normalize, + denoise=denoise, + inference_timesteps=int(dit_steps), + seed=seed, + ) + return (sr, wav_np), last_successful_seed + + def _on_toggle_instant(checked): + """Instant UI toggle โ€” no ASR, no blocking.""" + if checked: + return ( + gr.update(visible=True, value="", placeholder="Recognizing reference audio..."), + gr.update(visible=False), + ) + return ( + gr.update(visible=False), + gr.update(visible=True, interactive=True), + ) + + def _run_asr_if_needed(checked, audio_path): + """Run ASR after the UI has updated. Only when toggled ON.""" + if not checked or not audio_path: + return gr.update() + try: + logger.info("Running ASR on reference audio...") + asr_text = demo.prompt_wav_recognition(audio_path) + logger.info(f"ASR result: {asr_text[:60]}...") + return gr.update(value=asr_text) + except Exception as e: + logger.warning(f"ASR recognition failed: {e}") + return gr.update(value="") + + with gr.Blocks() as interface: + gr.HTML( + '
' + 'VoxCPM Logo' + "
" + ) + + gr.Markdown(I18N("usage_instructions")) + + with gr.Row(): + with gr.Column(): + reference_wav = gr.Audio( + sources=["upload", "microphone"], + type="filepath", + label=I18N("reference_audio_label"), + ) + show_prompt_text = gr.Checkbox( + value=False, + label=I18N("show_prompt_text_label"), + info=I18N("show_prompt_text_info"), + elem_classes=["switch-toggle"], + ) + prompt_text = gr.Textbox( + value="", + label=I18N("prompt_text_label"), + placeholder=I18N("prompt_text_placeholder"), + lines=2, + visible=False, + ) + control_instruction = gr.Textbox( + value="", + label=I18N("control_label"), + placeholder=I18N("control_placeholder"), + lines=2, + ) + text = gr.Textbox( + value=DEFAULT_TARGET_TEXT, + label=I18N("target_text_label"), + lines=3, + ) + + with gr.Accordion(I18N("advanced_settings_title"), open=False): + DoDenoisePromptAudio = gr.Checkbox( + value=False, + label=I18N("ref_denoise_label"), + elem_classes=["switch-toggle"], + info=I18N("ref_denoise_info"), + ) + DoNormalizeText = gr.Checkbox( + value=False, + label=I18N("normalize_label"), + elem_classes=["switch-toggle"], + info=I18N("normalize_info"), + ) + cfg_value = gr.Slider( + minimum=1.0, + maximum=3.0, + value=2.0, + step=0.1, + label=I18N("cfg_label"), + info=I18N("cfg_info"), + ) + dit_steps = gr.Slider( + minimum=1, + maximum=50, + value=10, + step=1, + label=I18N("dit_steps_label"), + info=I18N("dit_steps_info"), + ) + with gr.Row(): + seed_value = gr.Number( + value=random.randint(0, 2**32 - 1), + precision=0, + label=I18N("seed_label"), + info=I18N("seed_info"), + interactive=False, + ) + random_seed = gr.Checkbox( + value=True, + label=I18N("random_seed_label"), + elem_classes=["switch-toggle"], + info=I18N("random_seed_info"), + ) + + run_btn = gr.Button(I18N("generate_btn"), variant="primary", size="lg") + + with gr.Column(): + audio_output = gr.Audio(label=I18N("generated_audio_label")) + gr.Markdown(I18N("examples_footer")) + + show_prompt_text.change( + fn=_on_toggle_instant, + inputs=[show_prompt_text], + outputs=[prompt_text, control_instruction], + ).then( + fn=_run_asr_if_needed, + inputs=[show_prompt_text, reference_wav], + outputs=[prompt_text], + ) + + random_seed.change( + fn=_on_random_seed_toggle, + inputs=[random_seed], + outputs=[seed_value], + ) + + run_btn.click( + fn=_prepare_seed, + inputs=[random_seed, seed_value], + outputs=[seed_value], + show_progress=False, + ).then( + fn=_generate, + inputs=[ + text, + control_instruction, + reference_wav, + show_prompt_text, + prompt_text, + cfg_value, + DoNormalizeText, + DoDenoisePromptAudio, + dit_steps, + seed_value, + ], + outputs=[audio_output, seed_value], + show_progress=True, + api_name="generate", + ) + + return interface + + +def run_demo( + server_name: str = "0.0.0.0", + server_port: int = 8808, + show_error: bool = True, + model_id: str = "openbmb/VoxCPM2", + device: str = "auto", +): + demo = VoxCPMDemo(model_id=model_id, device=device) + interface = create_demo_interface(demo) + interface.queue(max_size=10, default_concurrency_limit=1).launch( + server_name=server_name, + server_port=server_port, + show_error=show_error, + i18n=I18N, + theme=_APP_THEME, + css=_CUSTOM_CSS, + ) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-id", + type=str, + default="openbmb/VoxCPM2", + help="Local path or HuggingFace repo ID (default: openbmb/VoxCPM2)", + ) + parser.add_argument("--port", type=int, default=8808, help="Server port") + parser.add_argument( + "--host", + type=str, + default="0.0.0.0", + help="Bind address. Use 127.0.0.1 to restrict access to the local machine; " + "the default 0.0.0.0 exposes the unauthenticated UI/API to the network (default: 0.0.0.0)", + ) + parser.add_argument( + "--device", + type=str, + default="auto", + help="Runtime device: auto, cpu, mps, cuda, or cuda:N (default: auto)", + ) + args = parser.parse_args() + run_demo( + model_id=args.model_id, + server_name=args.host, + server_port=args.port, + device=args.device, + ) diff --git a/app_old.py b/app_old.py new file mode 100644 index 0000000..c6ddbeb --- /dev/null +++ b/app_old.py @@ -0,0 +1,292 @@ +import os +import sys +import numpy as np +import torch +import gradio as gr +from typing import Optional, Tuple +from funasr import AutoModel +from pathlib import Path + +os.environ["TOKENIZERS_PARALLELISM"] = "false" +if os.environ.get("HF_REPO_ID", "").strip() == "": + os.environ["HF_REPO_ID"] = "openbmb/VoxCPM1.5" + +import voxcpm + + +class VoxCPMDemo: + def __init__(self) -> None: + self.device = "cuda" if torch.cuda.is_available() else "cpu" + print(f"๐Ÿš€ Running on device: {self.device}", file=sys.stderr) + + # ASR model for prompt text recognition + self.asr_model_id = "iic/SenseVoiceSmall" + self.asr_model: Optional[AutoModel] = AutoModel( + model=self.asr_model_id, + disable_update=True, + log_level="DEBUG", + device="cuda:0" if self.device == "cuda" else "cpu", + ) + + # TTS model (lazy init) + self.voxcpm_model: Optional[voxcpm.VoxCPM] = None + self.default_local_model_dir = "./models/VoxCPM1.5" + + # ---------- Model helpers ---------- + def _resolve_model_dir(self) -> str: + """ + Resolve model directory: + 1) Use local checkpoint directory if exists + 2) If HF_REPO_ID env is set, download into models/{repo} + 3) Fallback to 'models' + """ + if os.path.isdir(self.default_local_model_dir): + return self.default_local_model_dir + + repo_id = os.environ.get("HF_REPO_ID", "").strip() + if len(repo_id) > 0: + target_dir = os.path.join("models", repo_id.replace("/", "__")) + if not os.path.isdir(target_dir): + try: + from huggingface_hub import snapshot_download # type: ignore + + os.makedirs(target_dir, exist_ok=True) + print(f"Downloading model from HF repo '{repo_id}' to '{target_dir}' ...", file=sys.stderr) + snapshot_download(repo_id=repo_id, local_dir=target_dir, local_dir_use_symlinks=False) + except Exception as e: + print(f"Warning: HF download failed: {e}. Falling back to 'data'.", file=sys.stderr) + return "models" + return target_dir + return "models" + + def get_or_load_voxcpm(self) -> voxcpm.VoxCPM: + if self.voxcpm_model is not None: + return self.voxcpm_model + print("Model not loaded, initializing...", file=sys.stderr) + model_dir = self._resolve_model_dir() + print(f"Using model dir: {model_dir}", file=sys.stderr) + self.voxcpm_model = voxcpm.VoxCPM(voxcpm_model_path=model_dir) + print("Model loaded successfully.", file=sys.stderr) + return self.voxcpm_model + + # ---------- Functional endpoints ---------- + def prompt_wav_recognition(self, prompt_wav: Optional[str]) -> str: + if prompt_wav is None: + return "" + res = self.asr_model.generate(input=prompt_wav, language="auto", use_itn=True) + text = res[0]["text"].split("|>")[-1] + return text + + def generate_tts_audio( + self, + text_input: str, + prompt_wav_path_input: Optional[str] = None, + prompt_text_input: Optional[str] = None, + cfg_value_input: float = 2.0, + inference_timesteps_input: int = 10, + do_normalize: bool = True, + denoise: bool = True, + ) -> Tuple[int, np.ndarray]: + """ + Generate speech from text using VoxCPM; optional reference audio for voice style guidance. + Returns (sample_rate, waveform_numpy) + """ + current_model = self.get_or_load_voxcpm() + + text = (text_input or "").strip() + if len(text) == 0: + raise ValueError("Please input text to synthesize.") + + prompt_wav_path = prompt_wav_path_input if prompt_wav_path_input else None + prompt_text = prompt_text_input if prompt_text_input else None + + print(f"Generating audio for text: '{text[:60]}...'", file=sys.stderr) + wav = current_model.generate( + text=text, + prompt_text=prompt_text, + prompt_wav_path=prompt_wav_path, + cfg_value=float(cfg_value_input), + inference_timesteps=int(inference_timesteps_input), + normalize=do_normalize, + denoise=denoise, + ) + return (current_model.tts_model.sample_rate, wav) + + +# ---------- UI Builders ---------- + +_APP_THEME = gr.themes.Soft( + primary_hue="blue", + secondary_hue="gray", + neutral_hue="slate", + font=[gr.themes.GoogleFont("Inter"), "Arial", "sans-serif"], +) + +_CUSTOM_CSS = """ +.logo-container { + text-align: center; + margin: 0.5rem 0 1rem 0; +} +.logo-container img { + height: 80px; + width: auto; + max-width: 200px; + display: inline-block; +} +/* Bold accordion labels */ +#acc_quick details > summary, +#acc_tips details > summary { + font-weight: 600 !important; + font-size: 1.1em !important; +} +/* Bold labels for specific checkboxes */ +#chk_denoise label, +#chk_denoise span, +#chk_normalize label, +#chk_normalize span { + font-weight: 600; +} +""" + + +def create_demo_interface(demo: VoxCPMDemo): + """Build the Gradio UI for VoxCPM demo.""" + gr.set_static_paths(paths=[Path.cwd().absolute() / "assets"]) + + with gr.Blocks() as interface: + # Header logo + gr.HTML( + '
VoxCPM Logo
' + ) + + # Quick Start + with gr.Accordion("๐Ÿ“‹ Quick Start Guide ๏ฝœๅฟซ้€Ÿๅ…ฅ้—จ", open=False, elem_id="acc_quick"): + gr.Markdown(""" + ### How to Use ๏ฝœไฝฟ็”จ่ฏดๆ˜Ž + 1. **(Optional) Provide a Voice Prompt** - Upload or record an audio clip to provide the desired voice characteristics for synthesis. + **๏ผˆๅฏ้€‰๏ผ‰ๆไพ›ๅ‚่€ƒๅฃฐ้Ÿณ** - ไธŠไผ ๆˆ–ๅฝ•ๅˆถไธ€ๆฎต้Ÿณ้ข‘๏ผŒไธบๅฃฐ้Ÿณๅˆๆˆๆไพ›้Ÿณ่‰ฒใ€่ฏญ่ฐƒๅ’Œๆƒ…ๆ„Ÿ็ญ‰ไธชๆ€งๅŒ–็‰นๅพ + 2. **(Optional) Enter prompt text** - If you provided a voice prompt, enter the corresponding transcript here (auto-recognition available). + **๏ผˆๅฏ้€‰้กน๏ผ‰่พ“ๅ…ฅๅ‚่€ƒๆ–‡ๆœฌ** - ๅฆ‚ๆžœๆไพ›ไบ†ๅ‚่€ƒ่ฏญ้Ÿณ๏ผŒ่ฏท่พ“ๅ…ฅๅ…ถๅฏนๅบ”็š„ๆ–‡ๆœฌๅ†…ๅฎน๏ผˆๆ”ฏๆŒ่‡ชๅŠจ่ฏ†ๅˆซ๏ผ‰ใ€‚ + 3. **Enter target text** - Type the text you want the model to speak. + **่พ“ๅ…ฅ็›ฎๆ ‡ๆ–‡ๆœฌ** - ่พ“ๅ…ฅๆ‚จๅธŒๆœ›ๆจกๅž‹ๆœ—่ฏป็š„ๆ–‡ๅญ—ๅ†…ๅฎนใ€‚ + 4. **Generate Speech** - Click the "Generate" button to create your audio. + **็”Ÿๆˆ่ฏญ้Ÿณ** - ็‚นๅ‡ป"็”Ÿๆˆ"ๆŒ‰้’ฎ๏ผŒๅณๅฏไธบๆ‚จๅˆ›้€ ๅ‡บ้Ÿณ้ข‘ใ€‚ + """) + + # Pro Tips + with gr.Accordion("๐Ÿ’ก Pro Tips ๏ฝœไฝฟ็”จๅปบ่ฎฎ", open=False, elem_id="acc_tips"): + gr.Markdown(""" + ### Prompt Speech Enhancement๏ฝœๅ‚่€ƒ่ฏญ้Ÿณ้™ๅ™ช + - **Enable** to remove background noise for a clean voice, with an external ZipEnhancer component. However, this will limit the audio sampling rate to 16kHz, restricting the cloning quality ceiling. + **ๅฏ็”จ**๏ผš้€š่ฟ‡ ZipEnhancer ็ป„ไปถๆถˆ้™ค่ƒŒๆ™ฏๅ™ช้Ÿณ๏ผŒไฝ†ไผšๅฐ†้Ÿณ้ข‘้‡‡ๆ ท็އ้™ๅˆถๅœจ16kHz๏ผŒ้™ๅˆถๅ…‹้š†ไธŠ้™ใ€‚ + - **Disable** to preserve the original audio's all information, including background atmosphere, and support audio cloning up to 44.1kHz sampling rate. + **็ฆ็”จ**๏ผšไฟ็•™ๅŽŸๅง‹้Ÿณ้ข‘็š„ๅ…จ้ƒจไฟกๆฏ๏ผŒๅŒ…ๆ‹ฌ่ƒŒๆ™ฏ็Žฏๅขƒๅฃฐ๏ผŒๆœ€้ซ˜ๆ”ฏๆŒ44.1kHz็š„้Ÿณ้ข‘ๅคๅˆปใ€‚ + + ### Text Normalization๏ฝœๆ–‡ๆœฌๆญฃๅˆ™ๅŒ– + - **Enable** to process general text with an external WeTextProcessing component. + **ๅฏ็”จ**๏ผšไฝฟ็”จ WeTextProcessing ็ป„ไปถ๏ผŒๅฏๆ”ฏๆŒๅธธ่งๆ–‡ๆœฌ็š„ๆญฃๅˆ™ๅŒ–ๅค„็†ใ€‚ + - **Disable** to use VoxCPM's native text understanding ability. For example, it supports phonemes input (For Chinese, phonemes are converted using pinyin, {ni3}{hao3}; For English, phonemes are converted using CMUDict, {HH AH0 L OW1}), try it! + **็ฆ็”จ**๏ผšๅฐ†ไฝฟ็”จ VoxCPM ๅ†…็ฝฎ็š„ๆ–‡ๆœฌ็†่งฃ่ƒฝๅŠ›ใ€‚ๅฆ‚๏ผŒๆ”ฏๆŒ้Ÿณ็ด ่พ“ๅ…ฅ๏ผˆๅฆ‚ไธญๆ–‡่ฝฌๆ‹ผ้Ÿณ๏ผš{ni3}{hao3}๏ผ›่‹ฑๆ–‡่ฝฌCMUDict๏ผš{HH AH0 L OW1}๏ผ‰ๅ’Œๅ…ฌๅผ็ฌฆๅทๅˆๆˆ๏ผŒๅฐ่ฏ•ไธ€ไธ‹๏ผ + + ### CFG Value๏ฝœCFG ๅ€ผ + - **Lower CFG** if the voice prompt sounds strained or expressive, or instability occurs with long text input. + **่ฐƒไฝŽ**๏ผšๅฆ‚ๆžœๆ็คบ่ฏญ้Ÿณๅฌ่ตทๆฅไธ่‡ช็„ถๆˆ–่ฟ‡ไบŽๅคธๅผ ๏ผŒๆˆ–่€…้•ฟๆ–‡ๆœฌ่พ“ๅ…ฅๅ‡บ็Žฐ็จณๅฎšๆ€ง้—ฎ้ข˜ใ€‚ + - **Higher CFG** for better adherence to the prompt speech style or input text, or instability occurs with too short text input. + **่ฐƒ้ซ˜**๏ผšไธบๆ›ดๅฅฝๅœฐ่ดดๅˆๆ็คบ้Ÿณ้ข‘็š„้ฃŽๆ ผๆˆ–่พ“ๅ…ฅๆ–‡ๆœฌ๏ผŒ ๆˆ–่€…ๆž็Ÿญๆ–‡ๆœฌ่พ“ๅ…ฅๅ‡บ็Žฐ็จณๅฎšๆ€ง้—ฎ้ข˜ใ€‚ + + ### Inference Timesteps๏ฝœๆŽจ็†ๆ—ถ้—ดๆญฅ + - **Lower** for faster synthesis speed. + **่ฐƒไฝŽ**๏ผšๅˆๆˆ้€Ÿๅบฆๆ›ดๅฟซใ€‚ + - **Higher** for better synthesis quality. + **่ฐƒ้ซ˜**๏ผšๅˆๆˆ่ดจ้‡ๆ›ดไฝณใ€‚ + """) + + # Main controls + with gr.Row(): + with gr.Column(): + prompt_wav = gr.Audio( + sources=["upload", "microphone"], + type="filepath", + label="Prompt Speech (Optional, or let VoxCPM improvise)", + value="./examples/example.wav", + ) + DoDenoisePromptAudio = gr.Checkbox( + value=False, + label="Prompt Speech Enhancement", + elem_id="chk_denoise", + info="We use ZipEnhancer model to denoise the prompt audio.", + ) + with gr.Row(): + prompt_text = gr.Textbox( + value="Just by listening a few minutes a day, you'll be able to eliminate negative thoughts by conditioning your mind to be more positive.", + label="Prompt Text", + placeholder="Please enter the prompt text. Automatic recognition is supported, and you can correct the results yourself...", + ) + run_btn = gr.Button("Generate Speech", variant="primary") + + with gr.Column(): + cfg_value = gr.Slider( + minimum=1.0, + maximum=3.0, + value=2.0, + step=0.1, + label="CFG Value (Guidance Scale)", + info="Higher values increase adherence to prompt, lower values allow more creativity", + ) + inference_timesteps = gr.Slider( + minimum=4, + maximum=30, + value=10, + step=1, + label="Inference Timesteps", + info="Number of inference timesteps for generation (higher values may improve quality but slower)", + ) + with gr.Row(): + text = gr.Textbox( + value="VoxCPM is an innovative end-to-end TTS model from ModelBest, designed to generate highly realistic speech.", + label="Target Text", + ) + with gr.Row(): + DoNormalizeText = gr.Checkbox( + value=False, + label="Text Normalization", + elem_id="chk_normalize", + info="We use wetext library to normalize the input text.", + ) + audio_output = gr.Audio(label="Output Audio") + + # Wiring + run_btn.click( + fn=demo.generate_tts_audio, + inputs=[ + text, + prompt_wav, + prompt_text, + cfg_value, + inference_timesteps, + DoNormalizeText, + DoDenoisePromptAudio, + ], + outputs=[audio_output], + show_progress=True, + api_name="generate", + ) + prompt_wav.change(fn=demo.prompt_wav_recognition, inputs=[prompt_wav], outputs=[prompt_text]) + + return interface + + +def run_demo(server_name: str = "localhost", server_port: int = 7860, show_error: bool = True): + demo = VoxCPMDemo() + interface = create_demo_interface(demo) + interface.queue(max_size=10, default_concurrency_limit=1).launch( + server_name=server_name, + server_port=server_port, + show_error=show_error, + theme=_APP_THEME, + css=_CUSTOM_CSS, + ) + + +if __name__ == "__main__": + run_demo() diff --git a/assets/discord-logo.png b/assets/discord-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c15e40a5031e400002c04f14c3a4726eb42474 GIT binary patch literal 9476 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±^KBX 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�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

?!r@s6uCja-g93FFgwBcv9D=W4qeo)F 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
?HQGbnxZ(HU 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 Y>?zg?ycgSm-pvg~IkhKHnP*}D2e%X}{r~^~ literal 0 HcmV?d00001 diff --git a/assets/feishu-logo.png b/assets/feishu-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b37abaab8e29b290963085ee31a6b2a1807c8399 GIT binary patch literal 512 zcmV+b0{{JqP)^{{Ysx6Fi#V`uEJ+|K{!g^7j8fc>eGG``P6GO@jX*+rb}D z!KT3f;pg&eg}@4lsk6!dnYjOerT=rB|5=OwFlzOH>f9$>*)ZM4dXdHu*u73|vl&IL zjIRIi^Y}`B_`mh-ukz`{&gP%+(jKW;swy{Ga+eea=Q2pj2i-(qX;6Er7bW;)C^F37~H1EY=zW0QpFCyngFyHUMBo zdh%+P_BS|AG1?(kJ(y zjCzBidG;VPcLN|qRFnW0Pfn}3_b(sbK==*wA~*m7-5zCoY|63#0000h7t37u>wmH4w-n!I&hbnAhbo0mpzb; zS@aagQPg!=Se&XX-o0|s>o2O`--#X}7MDfew%a%#IZBYiiQ;nG7v5}6N8b1lw*Atk zkGXC=a1!Zp9j8H#fp3ODcD_@!-2TCj6FU&~hfEf92Gs8?pTw|HzkhlNMXk{<`~UtL zwH^PrE&mq|APoL5Oa2cX{tp%Z|4V}(B({A062jT{{@S}8EPRzNzY9@lx1RX;@tJfv zy5Ab8P59<@IT|gNc8v6DWmzUH@$n9chZBLJ9`sOqVJ}7yZK zdah0D?bkWM_!07Q@JWl&kyjtm*a*{vMcYbB+UqCK{ES-N!krMQvG4P1D#uJt-a%x) zh++SLxHf&;ykj8M{xdL7G|0ZOJt<~AUEp{+A;cQJRRF>f(P@+>#Bk(KCvBDNT3N8T z%L{u2F_odmfU2~&$A`cq32C7zP~We^8NW%c&z@7_#gjB6HY>$S??EDdH>hoOG(0JM z;<|*a%8k_{hB%`>NRRp;9h?=nyNCBYre~#sO*<;OrOI+MU9I^s7CmRN#_qV_#&$mO zQ2Il)H*XxavLP(~;62?K7~=JXbFfY$KZn~5S`78B9HHK@j-@U8V-*jCDK^&9)77<) zS4*(<7-=9Ufi32XAr2A1C8#;uq2w*_wY6195wWvx;`Q3pJpZlT^Y7l&m4ge!uvy36 zku5QWm}v2*tyygZIyM9l2ECW!r7d({Xs2KBJ$~HFZZMKY)a+F3xtI;FTVy-$C&z%8 z@QatmJZ3tpXW#Kcq7g9oLFl3Ahuk5ZSG}F1cdojnWv-cV`5XmGpQg(%M0-0P9Ctl< zf{c4djS%oDTlavQv$RR{4lN0@8 ze6~-74voVY@F0HXV7HYXBurQJcx?9Ygn444VL<$$V&PJOI&{1D=jxOd>c^M$Fg1($ zd=&nWracIcCso&S%7yw-y8MMUzPERjz6#pt;VF!c8H1dFU>QLtB6@Xm^;76fHe!4W zyd0gEXh#~6kjvzE_(y@9DRcEQ1%cG~b);0}|w0>yf;?Htqm`*%-@;)1c1VeAX zjfdg!Mls7pj{fKu70&GCnf)eau5lV6yUFhzG0g^8P!*clkY}k0e}*iN;E7HjHZlBu zfIz#5pQf1m;ll}D{T?X?F5k{?PG>jQjfjRG5x7O%s0~^sM!3}O1ou_ahcH*qaMWS^ z&-ZyTvQ6?;7}y?!WJ`#{k9kZ=5)(5&+l*bmr z-Qj+%-(g-KkoJ@<*)glLHXW`9g6loyIAZrO#Kly@aBAD{{Gr_;S}$K^Gj}z!kWs4j zy!yME@n8+C0BPxK)tl|{B*|WMAkr$@H>B@n+9b0~H`ZM%LAMwjG%q}VsEX2?Y`fkc z^;id54{`ZEMON8qXSAA1wLAFuc5l@{po;*LA1lj_ovQtAv%pR>Fkrg=dFZYa^~lEJ zD_t8GWRwUStwwiJgvrJvnB^SzDq+DsNs#-p@9Bf$De}oF5XxdUKf9;Ngj2lira1K4 z?vd1zk5UE2BB4;6lVR*P>wWg@WNOXmWi|l zc65A!1!28dd_J`4#C56^(0V5jk%l%-fz7K(&BbB=cMHSU#|82b07u{DKb65%W!lAb zC%KvS6uolCHB&SFMb6(_K@h0)`wFvxtw0U=@$8&CM*_bN>c#}qmfoHH@cF*l!*q47 z1A&r&JyDeiaJw$c&SE@{Eyax?w$rBO22nVMdcu!y34v>-4Opk+X33T@aG$3w2ly*9 zSHe`>RzgWoKeE^jTALFp2t`hA^-4k;|LUo=UfFw$yH9uwyO~*f$M(L2j;QQ<9%#Wx z_vFxYb%(LCHH8wW=*UOD<7N10o?d12-(1{nS|T0&-sx5+r91kIh}y>UIt^FUhY`|| z#efkjt?{zL;O~{jw(3^^W`}y5oUd%+^9NIRaN!E(G_?_YH@#EWSzFsNdSvVRIOrF2 z=nQ^H-=gukoxkVHx&Y=70hQ9##2I z7Q5h6h7V-+g@(~kAp_&Fh*~A9g6mAx3p4ogHIXzshTqX&*ZvsB)v0I7-0vTJcpa8; z$H@I6i1w1US=9RM#FUF6^YIW!%Z%u;U<1Te^;EG-!xGA))?d>(=0a7b z9_@)wmMb*vDg_u2-t4@{cOsm+I>I~iTq&_?UmO#ov^_`AJGQ5iOe|ueFK1zi z-A8y9Y#fbx%m``-X}BMM9@5j^m!G9XN@CL+X6FQGK37Z;ULbv7`{|`ROyIo*_V8K2 zfy}ey1ly{lKZI!i0n^~>sOw+NYE}h#g2nHTa_06{z($DC&wJ$@U#1QmEEo^K6Caaa zU*l(Wj?T-pHtk2eh1=pLK~=CU0EmVjsAu)$=zW_m6mMD>yD5_`*SbE;&;YpWrw{h> ze&=ewvMaAB``zxzzcD^S{p4ikGy*JTmq_nC!TL@!hH~V$`PHL2DoA2{g9rkW7*)>t zK78-Z{AD zpLkb_{rfWAXfmq4)ra)lJ{@S)5y=`x_2Z3y8meF2n0(g9_Ty_=UFk0i7a5TeVCo)UvNS~?4E*mH7KSmR=w zLB(gRtnxjoT63x7nT>tOA-PX2T6J_e>wK+5Y0+VsAY-k=pseC|>J}*E`SK9<;`c6L zFWJ$* zV}2n)H@;XA{@PTvK*Pqp3JyH(;s!rU^rLRVQ<`0^ygFeWbPj5tBDCs>tod0YR>c9gQ$A!5(tLEZA334wq>jSlBeos$|H+X`= z9Q4W=kPRzEm@`QdGz!#iKT!{%cSHI$MIHC{BpfRjru6QcpNK=e9x)2LUvESZb^ZxT z1dI!b)$v|b^gwS?#B_Z2B$0xPf&LCU1AX%}MaoRD{#8+jqK@+9B&#Z^G>8p@xXC&~ z8C3e1|>DKaTkjU@wCt?I6)9Rf>0NH*un_eQ9k3#m$n5@12UN5JIPL&3~#>Ef9 zoLaj9S?KXJF@2d$Q}EtWoX1q!28?}Dz-NiQNKInvzT_+HP(Y%v%d=KeN+u3Q6H62+ zpZwaG71=qm-Y%f;2xbvu+%3LISjw|_&linq0kJ;j7+~GDr#}MaeKN`ji3Npt!&onnP=Sj z_2vpIvJ9CCO-(X?7q<7A{@n)aHLxw$x}Ya# z57Ed9Uo!+$Yg7-U0>}?7=lIf}kO;@Yi7(zwvn~hbjmmt!oR_61ORpsUJLLl}|B-V`ZZxW=tz6Qkb~vgUdT-9-R`u`0d5##!Ev3Lus+ou)XtO4&6FI z=0q;sUeIk}AE1N6vN0zjU{pd`7YP%ZO~2`4RS%kSCg}g===L}Br_=Kh*A=B*(BOq{ z=D&1KiLv7IX$y&Zo&#Z1h>O$`Gp1F>L#(!X8&~p~<>sLdTR96z}&eg>xMgWC| zu3By%{?5gDxVdrL+l?rDNXd(gr}$@aLD(Y1uzNG5k}5!wFU%=6dRKpEgTH9})=h+E)c8dtb8Btr znlGXv-7_PhjkOs-bm}v=Yk7$Xux>K91G>!-RK_9f~-N=+(`2p6?C(b^MlnY?7=Fn??F_LB+y#`H^5Po^)PH+9 zAVfhwYZm?nQ01z_%)76Hg0wdW<@6g_G^Q3J9*&vy6~sINAr?qzEQaaR);qm6CqrG_ z@i|&Eh%Ef<=ivqTs0M8vwzl5P%y&1L4e#>;5z)NY=;{BnN3^^U%8NRNlOsDiZ}U`- z+sGCvEbb7r$6IQcNK5bjDlXe$J%M@hd7+kbp_&?sua(_NDK1m+C1Zt;N?gnfU|5{Oy4>8! zXTV?r_-C4FKu=!|;OQG`&I{CMx!Gfhv6LP_M*nkI2Hr;rxT)UdNwtTweB!Ba6 zR>k08lhCO}+3H>CPfsy-)YrpoDTPxm>msd_UDqu4w(;!L-|yLpXc~Jzz+1or-FO!tThj`d8_Xi9gfM1J66uW z&?N`O(l5N?U5!s<@(pS9%+@F<@+XS6Jb``~s1Ko!L$9#E-zKqaV-W`zm*qm=2>=F= zOYikxht(?DjP*pmW_n&NTS)7#vKc%gEpc0Udg-J5M|!|A0bs@`)9JTq*A|UfPdtuL zOcfR6X9~=>OB}MR3qF`j@=(-*{UsaEXIR5$@Cyg+G1rJ^fkI5+G%ACKk#C2J4guy= z@tN00E2RC(B9SR@ndF%Q6px7Lw{)rMn?FeIz?Bui^vGX738QB%s!9L9W&Ai4+nN)(nuo`RDW`a&Y88$9chlv=W