From bf71d0a6367051e7a0082e692564f2a71d7e9bbf Mon Sep 17 00:00:00 2001 From: root Date: Fri, 18 Jul 2025 05:45:12 +0000 Subject: [PATCH 1/3] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 65e94f8d3eb..5a63dba9352 100644 --- a/README.md +++ b/README.md @@ -228,6 +228,7 @@ verl is inspired by the design of Nemo-Aligner, Deepspeed-chat and OpenRLHF. The - [LLaSA-TTS-GRPO](https://github.com/channel-io/ch-tts-llasa-rl-grpo): TTS fine-tuning with GRPO optimization based on LLASA models ![GitHub Repo stars](https://img.shields.io/github/stars/channel-io/ch-tts-llasa-rl-grpo) - [PF-PPO](https://arxiv.org/abs/2409.06957): Policy Filtration for PPO based on the reliability of reward signals for more efficient and robust RLHF. - [RACRO](https://github.com/gyhdog99/RACRO2): Build multi-modal reasoning models via decoupling it into query-conditioned captioning and text-only reasoning ![GitHub Repo stars](https://img.shields.io/github/stars/gyhdog99/RACRO2) +- [CosyVoice-TTS-GRPO](https://github.com/nvidia-china-sae/mair-hub/tree/main/rl-tutorial/cosyvoice_llm): Cosyvoice TTS GRPO fine-tuning recipe![GitHub Repo stars](https://img.shields.io/github/stars/nvidia-china-sae/mair-hub) and many more awesome work listed in [recipe](recipe/README.md). From dea6a7232aec12b5df0e469adfe7349119d04a46 Mon Sep 17 00:00:00 2001 From: Yuekai Zhang Date: Fri, 18 Jul 2025 13:56:50 +0800 Subject: [PATCH 2/3] Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a63dba9352..12f0e91f500 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,7 @@ verl is inspired by the design of Nemo-Aligner, Deepspeed-chat and OpenRLHF. The - [LLaSA-TTS-GRPO](https://github.com/channel-io/ch-tts-llasa-rl-grpo): TTS fine-tuning with GRPO optimization based on LLASA models ![GitHub Repo stars](https://img.shields.io/github/stars/channel-io/ch-tts-llasa-rl-grpo) - [PF-PPO](https://arxiv.org/abs/2409.06957): Policy Filtration for PPO based on the reliability of reward signals for more efficient and robust RLHF. - [RACRO](https://github.com/gyhdog99/RACRO2): Build multi-modal reasoning models via decoupling it into query-conditioned captioning and text-only reasoning ![GitHub Repo stars](https://img.shields.io/github/stars/gyhdog99/RACRO2) -- [CosyVoice-TTS-GRPO](https://github.com/nvidia-china-sae/mair-hub/tree/main/rl-tutorial/cosyvoice_llm): Cosyvoice TTS GRPO fine-tuning recipe![GitHub Repo stars](https://img.shields.io/github/stars/nvidia-china-sae/mair-hub) +- [CosyVoice-TTS-GRPO](https://github.com/nvidia-china-sae/mair-hub/tree/main/rl-tutorial/cosyvoice_llm): Cosyvoice TTS GRPO fine-tuning recipe ![GitHub Repo stars](https://img.shields.io/github/stars/nvidia-china-sae/mair-hub) and many more awesome work listed in [recipe](recipe/README.md). From 0c27fe3abec4499246a3887b0bd873752d4c097d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 25 Jul 2025 03:36:50 +0000 Subject: [PATCH 3/3] update recipe --- README.md | 1 - recipe/README.md | 1 + recipe/cosyvoice_tts/README.md | 142 ++++ recipe/cosyvoice_tts/assets/prompt_audio.wav | Bin 0 -> 318550 bytes recipe/cosyvoice_tts/infer.py | 185 +++++ recipe/cosyvoice_tts/infer_dataset.py | 399 ++++++++++ recipe/cosyvoice_tts/prepare_data.py | 88 ++ .../pretrained_to_huggingface.py | 124 +++ .../cosyvoice_tts/requirements-cosyvoice.txt | 29 + recipe/cosyvoice_tts/reward_tts.py | 230 ++++++ recipe/cosyvoice_tts/run.sh | 170 ++++ recipe/cosyvoice_tts/run_official.sh | 120 +++ recipe/cosyvoice_tts/scripts/compute_wer.sh | 32 + .../scripts/offline-decode-files.py | 753 ++++++++++++++++++ recipe/cosyvoice_tts/token2wav_asr_client.py | 164 ++++ recipe/cosyvoice_tts/token2wav_asr_server.py | 348 ++++++++ 16 files changed, 2785 insertions(+), 1 deletion(-) create mode 100644 recipe/cosyvoice_tts/README.md create mode 100644 recipe/cosyvoice_tts/assets/prompt_audio.wav create mode 100644 recipe/cosyvoice_tts/infer.py create mode 100644 recipe/cosyvoice_tts/infer_dataset.py create mode 100644 recipe/cosyvoice_tts/prepare_data.py create mode 100644 recipe/cosyvoice_tts/pretrained_to_huggingface.py create mode 100644 recipe/cosyvoice_tts/requirements-cosyvoice.txt create mode 100644 recipe/cosyvoice_tts/reward_tts.py create mode 100644 recipe/cosyvoice_tts/run.sh create mode 100644 recipe/cosyvoice_tts/run_official.sh create mode 100644 recipe/cosyvoice_tts/scripts/compute_wer.sh create mode 100644 recipe/cosyvoice_tts/scripts/offline-decode-files.py create mode 100644 recipe/cosyvoice_tts/token2wav_asr_client.py create mode 100644 recipe/cosyvoice_tts/token2wav_asr_server.py diff --git a/README.md b/README.md index c8b1d820d41..6eac3cd34bb 100644 --- a/README.md +++ b/README.md @@ -229,7 +229,6 @@ verl is inspired by the design of Nemo-Aligner, Deepspeed-chat and OpenRLHF. The - [PF-PPO](https://arxiv.org/abs/2409.06957): Policy Filtration for PPO based on the reliability of reward signals for more efficient and robust RLHF. - [RACRO](https://github.com/gyhdog99/RACRO2): Build multi-modal reasoning models via decoupling it into query-conditioned captioning and text-only reasoning ![GitHub Repo stars](https://img.shields.io/github/stars/gyhdog99/RACRO2) - [Agent Lightning](https://github.com/microsoft/agent-lightning): A flexible and extensible framework that enables seamless agent optimization for any existing agent framework. ![GitHub Repo stars](https://img.shields.io/github/stars/microsoft/agent-lightning) -- [CosyVoice-TTS-GRPO](https://github.com/nvidia-china-sae/mair-hub/tree/main/rl-tutorial/cosyvoice_llm): Cosyvoice TTS GRPO fine-tuning recipe ![GitHub Repo stars](https://img.shields.io/github/stars/nvidia-china-sae/mair-hub) and many more awesome work listed in [recipe](recipe/README.md). diff --git a/recipe/README.md b/recipe/README.md index 29fb403841a..fb006a0bc9d 100644 --- a/recipe/README.md +++ b/recipe/README.md @@ -24,3 +24,4 @@ The help the community reproduce experiments, verl team provides a snapshot of t - [cognitive-behaviors](https://github.com/kanishkg/cognitive-behaviors): Cognitive Behaviors that Enable Self-Improving Reasoners, or, Four Habits of Highly Effective STaRs ![GitHub Repo stars](https://img.shields.io/github/stars/kanishkg/cognitive-behaviors) - [deepscaler](https://github.com/agentica-project/rllm/tree/deepscaler): iterative context scaling with GRPO ![GitHub Repo stars](https://img.shields.io/github/stars/agentica-project/deepscaler) - [DAPO](https://dapo-sia.github.io/): the fully open source SOTA RL algorithm that beats DeepSeek-R1-zero-32B ![GitHub Repo stars](https://img.shields.io/github/stars/volcengine/verl) +- [CosyVoice-TTS-GRPO](https://github.com/FunAudioLLM/CosyVoice/tree/main): Cosyvoice TTS GRPO fine-tuning recipe ![GitHub Repo stars](https://img.shields.io/github/stars/FunAudioLLM/CosyVoice) diff --git a/recipe/cosyvoice_tts/README.md b/recipe/cosyvoice_tts/README.md new file mode 100644 index 00000000000..41cce1c1049 --- /dev/null +++ b/recipe/cosyvoice_tts/README.md @@ -0,0 +1,142 @@ +# CosyVoice2 LLM Reinforcement Learning Recipe + +This recipe shows how to train the **CosyVoice2** large language model with reinforcement learning algorithms such as **GRPO** using the [veRL](https://github.com/volcengine/verl) framework. Our experiments show that applying GRPO reduces the character error rate (CER) on the Seed-TTS test_zh set from 1.81% to 1.06%. + +We initialize the model from a Supervised Fine-Tuned (SFT) version of Qwen2-0.5B-Instruct and then continue training with reinforcement learning. Given an input sentence, the model predicts the corresponding CosyVoice2 speech tokens. For the SFT training recipe please refer to [PR #1887](https://github.com/k2-fsa/icefall/pull/1887). + +## Table of Contents + +- [Environment Setup](#environment-setup) +- [Data Preparation](#data-preparation) +- [Reward Function & ASR Server](#reward-function--asr-server) +- [Training](#training) +- [Evaluation](#evaluation) +- [Single-Utterance Inference](#single-utterance-inference) +- [Results](#results) +- [Acknowledgement](#acknowledgement) + +## Environment Setup + +Stage `-1` of `run.sh` installs all required dependencies: + +```bash +bash run.sh -1 -1 # run only stage -1 +``` + +The script performs the following tasks: + +1. Clones and installs **veRL** (without Megatron). +2. Checks out the **CosyVoice** source code to `/workspace/CosyVoice` and installs the Python packages from `requirements-cosyvoice.txt`. +3. Downloads the TTS codec model `iic/CosyVoice2-0.5B` from **ModelScope** into `/workspace/CosyVoice2-0.5B`. +4. Installs **PytritonSensevoice** together with **Pytriton**. +5. Downloads the SFT-finetuned CosyVoice2-0.5B LLM whose vocabulary was extended on Emilia-Zh data. + +> [!TIP] +> The **veRL** repository evolves quickly. To reproduce our results you can checkout this [specific commit](https://github.com/yuekaizhang/verl/tree/thread). + +## Data Preparation + +`prepare_data.py` expects a JSON/JSONL file with at least the following schema: + +```jsonc +{ + "text": "An example sentence to be synthesized." +} +``` +You can download the JSONL files from the metadata directory of the [SparkAudio/voxbox](https://huggingface.co/datasets/SparkAudio/voxbox/tree/main/metadata) dataset on Hugging Face. + +Stage `0` converts raw JSONL files into the parquet format expected by veRL: + +```bash +bash run.sh 0 0 +``` +Create two JSONL files – `train.jsonl` and `test.jsonl`. +The script will generate two parquet files: + +``` +data/parquet_tiny/train.parquet +data/parquet_tiny/test.parquet +``` + +Each sample is automatically wrapped into a chat-style prompt with the special system token `<|SPEECH_GENERATION_START|>` so that the LLM learns to output CosyVoice2 speech tokens. + +> [!TIP] +> For the `prompt_template` we recommend using the same configuration as during SFT training. See the corresponding setup [here](https://github.com/yuekaizhang/icefall/blob/emilia/egs/emilia/TTS/llasa_cosyvoice2_token/train.py#L84). + +## Reward Function & ASR Server + +To compute rewards we run a lightweight server that: + +1. Converts generated speech tokens back to a 16 kHz waveform with the **CosyVoice2** pretrained U-Net model. +2. Transcribes the waveform with **SenseVoice** ASR. +3. Calculates the pinyin-level error rate against the ground-truth text and maps it to a score in the range \[0 … 1\]. + +Start the server (stage `1`) in a dedicated terminal / GPU: + +```bash +bash run.sh 1 1 +# Triton server listens on ports 8000/8001/8002 +``` + +The custom reward implementation lives in [`reward_tts.py`](./reward_tts.py) and calls the server to obtain the reward score. + +## Training + +Run stage `2` to start GRPO training: + +```bash +bash run.sh 2 2 +``` + +Key CLI arguments passed to `verl.trainer.main_ppo`: + +* `algorithm.adv_estimator=grpo` – use GRPO instead of PPO. +* `data.train_files=data/parquet_aishell3/train.parquet` and `data.val_files=data/parquet_aishell3/test.parquet` +* `actor_rollout_ref.model.path=/workspace/rl/llasa_cosyvoice2_token_qwen_0.5b/checkpoint-885000` – path to the pretrained CosyVoice2 LLM. +* `custom_reward_function.path=reward_tts.py` – custom reward function described above. +* `trainer.total_epochs=1` – number of training epochs (adjust as needed). + +Tune `CUDA_VISIBLE_DEVICES`, batch sizes and other hyper-parameters according to your hardware. + +## Evaluation + +After training finishes we gather the sharded FSDP weights and export a HuggingFace-style checkpoint (stage `3`): + +```bash +bash run.sh 3 3 # merges weights into $llm_path/merged_hf_model +``` + +We can then evaluate the model on the CosyVoice3 zero-shot Chinese test set (stage `4`): + +```bash +bash run.sh 4 4 +``` + +This command launches distributed inference via `infer_dist.py` and computes WER with `scripts/compute_wer.sh`. + +> [!TIP] +> The script also supports the Seed-TTS test set by setting `dataset=test_zh`. + +## Single-Utterance Inference + +For a quick demo run stage `5`: + +```bash +bash run.sh 5 5 +``` + +The script synthesizes a tongue-twister using the merged checkpoint and prints the path of the generated audio file. + +## Results + +| Model | Seed-TTS `test_zh` CER | Cosyvoice3 `zero_shot_zh` |Comment | +|-|------------------------------------------------------|------------------------|--------------------------------------------------------------------------------| +| Official CosyVoice2 LLM | 1.45 % |4.08%| See the [paper](https://arxiv.org/abs/2412.10117) | +| SFT (initialized from Qwen2-0.5B-Instruct) | 1.81 % |4.83%| See [PR #1887](https://github.com/k2-fsa/icefall/pull/1887) | +| GRPO (this work, trained on AIShell-3) | **1.06 %** |4.03%| | + +## Acknowledgement + +This work is inspired by the implementation in +https://github.com/channel-io/ch-tts-llasa-rl-grpo + diff --git a/recipe/cosyvoice_tts/assets/prompt_audio.wav b/recipe/cosyvoice_tts/assets/prompt_audio.wav new file mode 100644 index 0000000000000000000000000000000000000000..a6481ea611bb00d82b80189af61d66b106bc072d GIT binary patch literal 318550 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

%F6n>hPa6D& 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

-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

X?b77ZxfQA_!rLSh6+}+RLAaont4A7W^9B1y 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 literal 0 HcmV?d00001 diff --git a/recipe/cosyvoice_tts/infer.py b/recipe/cosyvoice_tts/infer.py new file mode 100644 index 00000000000..c9d9d4164ed --- /dev/null +++ b/recipe/cosyvoice_tts/infer.py @@ -0,0 +1,185 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +from transformers import AutoTokenizer, AutoModelForCausalLM +import torch +import soundfile as sf +from cosyvoice.cli.cosyvoice import CosyVoice2 +from cosyvoice.utils.file_utils import load_wav +from argparse import ArgumentParser +import sys + +sys.path.append("/workspace/CosyVoice/third_party/Matcha-TTS") +TEMPLATE = "{% for message in messages %}{%- if message['role'] == 'user' %}{{- '<|im_start|>' + message['role'] + '\n' + 'Convert the text to speech: ' + message['content'] + '<|im_end|>\n'}}{%- elif message['role'] == 'assistant' %}{{- '<|im_start|>' + message['role'] + '\n' + '<|SPEECH_GENERATION_START|>' + message['content']}}{%- endif %}{%- endfor %}" + +def get_args(): + parser = ArgumentParser() + + parser.add_argument( + "--token2wav-path", + type=str, + default=None, + help="Token2Wav path, default to %(default)r", + ) + parser.add_argument( + "--prompt-text", + type=str, + default="Romeo and Juliet might be the most famous act of William Shakespeare.", + help="The prompt text", + ) + + parser.add_argument( + "--prompt-speech-path", + type=str, + default="./assets/common_voice_en_2586258.wav", + help="The path to the prompt speech", + ) + parser.add_argument( + "--input-text", + type=str, + default='突然,身边一阵笑声。我看着他们,意气风发地挺直了胸膛,甩了甩那稍显肉感的双臂,轻笑道:我身上的肉,是为了掩饰我爆棚的魅力,否则,岂不吓坏了你们呢?"', + help="The input text", + ) + parser.add_argument( + "--model-path", + type=str, + default='/workspace/rl/llasa_cosyvoice2_token_qwen_0.5b/checkpoint-885000', + help="The path to the model", + ) + args = parser.parse_args() + return args + +args = get_args() + +def audio_decode_cosyvoice2( + audio_tokens, prompt_text, prompt_speech_16k, codec_decoder +): + """ + Generate audio from tokens with optional tone and prompt embedding. + + Args: + audio_tokens (list): List of audio tokens to be processed. + model_config: Configuration object containing vocab settings. + codec_decoder: Codec decoder for generating audio. + tone_dir (str): The tone directory or setting. + audio_prompt_path (str, optional): Path to the audio prompt file. Required when tone_dir is not "default_tone". + code_layer (int, optional): Number of code layers. Defaults to 1. + num_latency_tokens (int, optional): Number of latency tokens to ignore. Defaults to 0. + speed (float, optional): Speed factor for audio generation. Defaults to 1.0. + + Returns: + torch.Tensor: Generated audio waveform. + """ + model_inputs_dict = codec_decoder.frontend.frontend_zero_shot( + "empty", prompt_text, prompt_speech_16k, 24000 + ) + tts_mel, _ = codec_decoder.model.flow.inference( + token=audio_tokens.to(codec_decoder.model.device), + token_len=torch.tensor([audio_tokens.shape[1]], dtype=torch.int32).to( + codec_decoder.model.device + ), + prompt_token=model_inputs_dict["flow_prompt_speech_token"].to( + codec_decoder.model.device + ), + prompt_token_len=torch.tensor( + [model_inputs_dict["flow_prompt_speech_token_len"]], dtype=torch.int32 + ).to(codec_decoder.model.device), + prompt_feat=model_inputs_dict["prompt_speech_feat"].to( + codec_decoder.model.device + ), + prompt_feat_len=model_inputs_dict["prompt_speech_feat_len"].to( + codec_decoder.model.device + ), + embedding=model_inputs_dict["flow_embedding"].to(codec_decoder.model.device), + finalize=True, + ) + + audio_hat, _ = codec_decoder.model.hift.inference( + speech_feat=tts_mel, cache_source=torch.zeros(1, 1, 0) + ) + + return audio_hat + +def extract_speech_ids(speech_tokens_str): + + speech_ids = [] + for token_str in speech_tokens_str: + if token_str.startswith('<|s_') and token_str.endswith('|>'): + num_str = token_str[4:-2] + + num = int(num_str) + speech_ids.append(num) + else: + print(f"Unexpected token: {token_str}") + return speech_ids + + + +tokenizer = AutoTokenizer.from_pretrained(args.model_path) +model = AutoModelForCausalLM.from_pretrained(args.model_path) +model.eval() +model.to('cuda') + +token2wav_model = CosyVoice2( + args.token2wav_path, load_jit=False, load_trt=False, fp16=False +) + +prompt_speech_16k = load_wav(args.prompt_speech_path, 16000) + +with torch.no_grad(): + # Tokenize the text + chat = [ + {"role": "user", "content": f"{args.input_text}"}, + {"role": "assistant", "content": ""} + ] + if 'system' in tokenizer.chat_template: + tokenizer.chat_template = TEMPLATE + input_ids = tokenizer.apply_chat_template( + chat, + tokenize=True, + return_tensors='pt', + continue_final_message=True + ) + input_ids = input_ids.to('cuda') + + # Generate the speech autoregressively + outputs = model.generate( + input_ids, + max_length=2048, # We trained our model with a max length of 2048 + do_sample=True, + top_p=1, # Adjusts the diversity of generated content + temperature=0.8, # Controls randomness in output + ) + # Extract the speech tokens + generated_ids = outputs[0][input_ids.shape[1]:-1] + + speech_tokens = tokenizer.batch_decode(generated_ids, skip_special_tokens=True) + + # Convert token <|s_23456|> to int 23456 + speech_tokens = extract_speech_ids(speech_tokens) + + speech_tokens = torch.tensor(speech_tokens).cuda().unsqueeze(0) + + + audio_hat = audio_decode_cosyvoice2( + speech_tokens, + args.prompt_text, + prompt_speech_16k, + token2wav_model, + ) + + audio = audio_hat.squeeze(0).cpu().numpy() + + +sf.write("gen.wav", audio, 24000) diff --git a/recipe/cosyvoice_tts/infer_dataset.py b/recipe/cosyvoice_tts/infer_dataset.py new file mode 100644 index 00000000000..40c968d27af --- /dev/null +++ b/recipe/cosyvoice_tts/infer_dataset.py @@ -0,0 +1,399 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +""" Example Usage +dataset=zero_shot_zh +output_dir=./outputs_rl_aishell3_step${step}_${dataset}_jit_trt_fp16_reward_tts + +token2wav_path=/workspace/CosyVoice2-0.5B +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ +torchrun --nproc_per_node=8 \ + infer_dataset.py \ + --output-dir $output_dir \ + --llm-model-name-or-path $llm_path/merged_hf_model \ + --token2wav-path $token2wav_path \ + --split-name ${dataset} || exit 1 +""" + +import argparse +import json +import os +import sys +from pathlib import Path + +import torch +import torch.distributed as dist +import torch.nn.functional as F +import torchaudio +from cosyvoice.cli.cosyvoice import CosyVoice2 +from cosyvoice.utils.file_utils import load_wav +from datasets import load_dataset +from transformers import AutoTokenizer, AutoModelForCausalLM +from torch.utils.data import DataLoader, Dataset, DistributedSampler +from tqdm import tqdm +import soundfile as sf +import s3tokenizer +from functools import partial + +sys.path.append("/workspace/CosyVoice/third_party/Matcha-TTS") +try: + torch.multiprocessing.set_start_method("spawn") +except RuntimeError: + pass + + +TEMPLATE = "{% for message in messages %}{%- if message['role'] == 'user' %}{{- '<|im_start|>' + message['role'] + '\n' + 'Convert the text to speech: ' + message['content'] + '<|im_end|>\n'}}{%- elif message['role'] == 'assistant' %}{{- '<|im_start|>' + message['role'] + '\n' + '<|SPEECH_GENERATION_START|>' + message['content']}}{%- endif %}{%- endfor %}" + + +def audio_decode_cosyvoice2( + audio_tokens, prompt_text, prompt_speech_16k, codec_decoder +): + """ + Generate audio from tokens with optional tone and prompt embedding. + """ + model_inputs_dict = codec_decoder.frontend.frontend_zero_shot( + "empty", prompt_text, prompt_speech_16k, 24000 + ) + tts_mel, _ = codec_decoder.model.flow.inference( + token=audio_tokens.to(codec_decoder.model.device), + token_len=torch.tensor([audio_tokens.shape[1]], dtype=torch.int32).to( + codec_decoder.model.device + ), + prompt_token=model_inputs_dict["flow_prompt_speech_token"].to( + codec_decoder.model.device + ), + prompt_token_len=torch.tensor( + [model_inputs_dict["flow_prompt_speech_token_len"]], dtype=torch.int32 + ).to(codec_decoder.model.device), + prompt_feat=model_inputs_dict["prompt_speech_feat"].to( + codec_decoder.model.device + ), + prompt_feat_len=model_inputs_dict["prompt_speech_feat_len"].to( + codec_decoder.model.device + ), + embedding=model_inputs_dict["flow_embedding"].to(codec_decoder.model.device), + finalize=True, + ) + + audio_hat, _ = codec_decoder.model.hift.inference( + speech_feat=tts_mel, cache_source=torch.zeros(1, 1, 0) + ) + + return audio_hat + + +def extract_speech_ids(speech_tokens_str): + """Extract speech IDs from token strings like <|s_23456|>""" + speech_ids = [] + for token_str in speech_tokens_str: + if token_str.startswith('<|s_') and token_str.endswith('|>'): + num_str = token_str[4:-2] + num = int(num_str) + speech_ids.append(num) + else: + print(f"Unexpected token: {token_str}") + return speech_ids + +def convert_cosy2_tokens_to_speech_id_str(cosy2_tokens): + """Convert CosyVoice2 tokens to speech IDs string like <|s_23456|>""" + speech_id_str = "" + for token in cosy2_tokens: + speech_id_str += f"<|s_{token}|>" + return speech_id_str + + +def get_args(): + parser = argparse.ArgumentParser(description="Speech generation using LLM + CosyVoice2") + parser.add_argument( + "--split-name", + type=str, + default="wenetspeech4tts", + help="huggingface dataset split name, see yuekai/CV3-Eval, yuekai/seed_tts_cosy2", + ) + parser.add_argument( + "--output-dir", required=True, type=str, help="dir to save result" + ) + parser.add_argument( + "--batch-size", + default=1, + type=int, + help="batch size (per-device) for inference", + ) + parser.add_argument( + "--num-workers", type=int, default=1, help="workers for dataloader" + ) + parser.add_argument( + "--prefetch", type=int, default=5, help="prefetch for dataloader" + ) + parser.add_argument( + "--llm-model-name-or-path", + required=True, + type=str, + help="LLM model path (includes both model and tokenizer)", + ) + parser.add_argument( + "--token2wav-path", + required=True, + type=str, + help="CosyVoice2 token2wav model path", + ) + parser.add_argument( + "--prompt-text", + type=str, + default=None, + help="The prompt text for CosyVoice2", + ) + parser.add_argument( + "--prompt-speech-path", + type=str, + default=None, + help="The path to the prompt speech for CosyVoice2", + ) + parser.add_argument( + "--top-p", + type=float, + default=0.95, + help="top p for sampling", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.8, + help="temperature for sampling", + ) + parser.add_argument( + "--top-k", + type=int, + default=50, + help="top k for sampling", + ) + args = parser.parse_args() + return args + + + +def data_collator(batch, tokenizer, s3_tokenizer): + """Simplified data collator for batch_size=1 processing""" + target_sample_rate = 16000 # CosyVoice2 uses 16kHz for prompt audio + device = s3_tokenizer.device if s3_tokenizer is not None else torch.device("cpu") + input_ids_list, prompt_audio_list, prompt_text_list = [], [], [] + mels, prompt_audio_cosy2tokens_list = [], [] + for i, item in enumerate(batch): + prompt_text, target_text = ( + item["prompt_text"], + item["target_text"], + ) + prompt_text_list.append(prompt_text) + # Combine prompt and target text + full_text = prompt_text + target_text + + # get prompt audio for CosyVoice2 (convert to 16kHz) + ref_audio_org, ref_sr = ( + item["prompt_audio"]["array"], + item["prompt_audio"]["sampling_rate"], + ) + ref_audio_org = torch.from_numpy(ref_audio_org).float().unsqueeze(0) + # ref_audio_org = ref_audio_org.mean(dim=0, keepdim=True) + print(ref_audio_org.shape) + + if ref_sr != target_sample_rate: + resampler = torchaudio.transforms.Resample(ref_sr, target_sample_rate) + ref_audio = resampler(ref_audio_org) + else: + ref_audio = ref_audio_org + + prompt_audio_list.append(ref_audio) + + if "prompt_audio_cosy2_tokens" in item: + prompt_audio_cosy2tokens = item["prompt_audio_cosy2_tokens"] + prompt_audio_cosy2tokens_list.append(prompt_audio_cosy2tokens) + else: + # convert to float first + mels.append(s3tokenizer.log_mel_spectrogram(ref_audio.squeeze(0))) + + if len(mels) > 0: + mels, mels_lens = s3tokenizer.padding(mels) + codes, codes_lens = s3_tokenizer.quantize(mels.to(device), mels_lens.to(device)) + for i in range(len(codes)): + prompt_audio_cosy2tokens_list.append(codes[i, :codes_lens[i].item()]) + for i, prompt_audio_cosy2tokens in enumerate(prompt_audio_cosy2tokens_list): + prompt_audio_cosy2_id_str = convert_cosy2_tokens_to_speech_id_str(prompt_audio_cosy2tokens) + # Create chat template for LLM generation + chat = [ + {"role": "user", "content": full_text}, + {"role": "assistant", "content": prompt_audio_cosy2_id_str} + ] + if 'system' in tokenizer.chat_template: + tokenizer.chat_template = TEMPLATE + input_ids = tokenizer.apply_chat_template( + chat, + tokenize=True, + return_tensors='pt', + continue_final_message=True + ) + input_ids_list.append(input_ids.squeeze(0)) + + + # For batch_size=1, no need to pad + if len(input_ids_list) == 1: + input_ids = input_ids_list[0].unsqueeze(0) + else: + # Handle batch > 1 if needed + max_len = max([len(input_ids) for input_ids in input_ids_list]) + input_ids_list = [ + torch.cat([torch.full((max_len - len(input_ids),), tokenizer.pad_token_id), input_ids]) + for input_ids in input_ids_list + ] + input_ids = torch.stack(input_ids_list) + + ids = [item["id"] for item in batch] + + return { + "input_ids": input_ids, + "ids": ids, + "prompt_text": prompt_text_list, + "prompt_audio_list": prompt_audio_list, + } + + +def init_distributed(): + world_size = int(os.environ.get("WORLD_SIZE", 1)) + local_rank = int(os.environ.get("LOCAL_RANK", 0)) + rank = int(os.environ.get("RANK", 0)) + print( + "Inference on multiple gpus, this gpu {}".format(local_rank) + + ", rank {}, world_size {}".format(rank, world_size) + ) + torch.cuda.set_device(local_rank) + dist.init_process_group("nccl") + return world_size, local_rank, rank + + +def main(): + args = get_args() + os.makedirs(args.output_dir, exist_ok=True) + + assert torch.cuda.is_available() + world_size, local_rank, rank = init_distributed() + device = torch.device(f"cuda:{local_rank}") + + # Load LLM model and tokenizer directly + tokenizer = AutoTokenizer.from_pretrained(args.llm_model_name_or_path) + model = AutoModelForCausalLM.from_pretrained(args.llm_model_name_or_path) + model.eval() + model.to(device) + + cosyvoice_codec = CosyVoice2( + args.token2wav_path, load_jit=True, load_trt=True, fp16=True + ) + if args.prompt_speech_path: + prompt_speech_16k = load_wav(args.prompt_speech_path, 16000) + else: + prompt_speech_16k = None + s3_tokenizer = s3tokenizer.load_model("speech_tokenizer_v2_25hz").to(device) if 'zero' in args.split_name else None + dataset_name = "yuekai/CV3-Eval" if 'zero' in args.split_name else "yuekai/seed_tts_cosy2" + dataset = load_dataset( + dataset_name, + split=args.split_name, + trust_remote_code=True, + ) + + sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank) + + dataloader = DataLoader( + dataset, + batch_size=args.batch_size, + sampler=sampler, + shuffle=False, + num_workers=args.num_workers, + prefetch_factor=args.prefetch, + collate_fn=partial(data_collator, tokenizer=tokenizer, s3_tokenizer=s3_tokenizer), + ) + + total_steps = len(dataset) + + if rank == 0: + progress_bar = tqdm(total=total_steps, desc="Processing", unit="wavs") + + for batch in dataloader: + with torch.no_grad(): + input_ids = batch["input_ids"].to(device) + + # Generate speech tokens using LLM + outputs = model.generate( + input_ids, + max_new_tokens=2048, # Max length for generation + do_sample=True, + top_p=args.top_p, + temperature=args.temperature, + top_k=args.top_k, + ) + + # Process each sample in the batch + for i in range(len(batch["ids"])): + # Extract generated tokens (excluding input) + input_length = input_ids[i].shape[0] + generated_ids = outputs[i][input_length:-1] # Remove last token if needed + speech_tokens_str = tokenizer.batch_decode(generated_ids, skip_special_tokens=True) + + # Extract speech IDs from token strings like <|s_23456|> + speech_ids = extract_speech_ids(speech_tokens_str) + + if len(speech_ids) == 0: + print(f"Warning: No speech tokens generated for sample {batch['ids'][i]}, skipping") + continue + + # Convert to tensor for CosyVoice2 + audio_tokens = torch.tensor(speech_ids, dtype=torch.long, device=device).unsqueeze(0) + + if args.prompt_text is not None: + current_prompt_text = args.prompt_text + current_prompt_audio = prompt_speech_16k + else: + current_prompt_text = batch["prompt_text"][i] + current_prompt_audio = batch["prompt_audio_list"][i] + + if current_prompt_audio is not None: + # Generate audio using CosyVoice2 + audio_hat = audio_decode_cosyvoice2( + audio_tokens, + current_prompt_text, + current_prompt_audio, + cosyvoice_codec, + ) + + # Convert to numpy and save + generated_wave = audio_hat.squeeze(0).cpu().numpy() + target_sample_rate = 24000 + + utt = batch["ids"][i] + sf.write(f"{args.output_dir}/{utt}.wav", generated_wave, target_sample_rate) + + print(f"Generated audio for sample {utt} with {len(speech_ids)} tokens") + else: + print(f"Warning: No prompt audio available for sample {batch['ids'][i]}, skipping") + + + if rank == 0: + progress_bar.update(world_size * len(batch["ids"])) + + if rank == 0: + progress_bar.close() + + dist.barrier() + dist.destroy_process_group() + + +if __name__ == "__main__": + main() diff --git a/recipe/cosyvoice_tts/prepare_data.py b/recipe/cosyvoice_tts/prepare_data.py new file mode 100644 index 00000000000..e63ae47f7da --- /dev/null +++ b/recipe/cosyvoice_tts/prepare_data.py @@ -0,0 +1,88 @@ +# Copyright 2024 Bytedance Ltd. and/or its affiliates +# +# 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. +""" +Preprocess the Text to Speech dataset to parquet format +""" + +import argparse +import os +import re + +import datasets + +from verl.utils.hdfs_io import copy, makedirs + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--train_file", required=True, help="Path to training JSON/JSONL file") + parser.add_argument("--test_file", required=True, help="Path to test JSON/JSONL file") + parser.add_argument("--local_dir", default=None, required=True) + parser.add_argument("--hdfs_dir", default=None) + + args = parser.parse_args() + + # Load datasets from local JSON files + train_dataset = datasets.load_dataset("json", data_files=args.train_file)['train'] + test_dataset = datasets.load_dataset("json", data_files=args.test_file)['train'] + + # add a row to each data item that represents a unique id + def make_map_fn(split): + def process_fn(example, idx): + text = example.pop("text") + + # use cosyvoice2 official huggingface compatible checkpoint template + question = text + answer = "" + + data = { + "data_source": f"{args.train_file}_{args.test_file}", # Use file names as data source + "prompt": [ + { + "role": "user", + "content": question, + }, + { + "role": "assistant", + "content": answer, + }, + ], + "ability": "text-to-speech", + "reward_model": {"style": "rule", "ground_truth": text}, + "extra_info": { + "split": split, + "index": idx, + "text": text, + }, + } + return data + + return process_fn + + train_dataset = train_dataset.map(function=make_map_fn("train"), with_indices=True) + test_dataset = test_dataset.map(function=make_map_fn("test"), with_indices=True) + + local_dir = args.local_dir + hdfs_dir = args.hdfs_dir + + print(train_dataset) + print(test_dataset) + train_dataset.to_parquet(os.path.join(local_dir, "train.parquet")) + test_dataset.to_parquet(os.path.join(local_dir, "test.parquet")) + + if hdfs_dir is not None: + makedirs(hdfs_dir) + + copy(src=local_dir, dst=hdfs_dir) diff --git a/recipe/cosyvoice_tts/pretrained_to_huggingface.py b/recipe/cosyvoice_tts/pretrained_to_huggingface.py new file mode 100644 index 00000000000..5034f5626ef --- /dev/null +++ b/recipe/cosyvoice_tts/pretrained_to_huggingface.py @@ -0,0 +1,124 @@ + +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +""" +Usage: Instruct TTS + python3 infer.py \ + --token2wav-path /workspace/CosyVoice2-0.5B \ + --prompt-text "吃燕窝就选燕之屋,本节目由26年专注高品质燕窝的燕之屋冠名播出。豆奶牛奶换着喝,营养更均衡,本节目由豆本豆豆奶特约播出。" \ + --prompt-speech-path ./assets/prompt_audio.wav \ + --model-path ./transformers_cosyvoice2_llm \ + --input-text "用四川话说<|endofprompt|>扁担长,板凳宽,扁担绑在板凳上。吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。" +""" +from cosyvoice.cli.cosyvoice import CosyVoice2 +import sys +from argparse import ArgumentParser +from transformers import AutoTokenizer, AutoModelForCausalLM +import torch + +sys.path.append("/workspace/CosyVoice/third_party/Matcha-TTS") + + + +def get_args(): + parser = ArgumentParser() + + parser.add_argument( + "--pretrained-cosyvoice2-path", + type=str, + default="/workspace/CosyVoice2-0.5B", + help="Token2Wav path, default to %(default)r", + ) + parser.add_argument( + "--save-path", + type=str, + default='./transformers_cosyvoice2_llm', + help="The path to save the model", + ) + args = parser.parse_args() + return args + + +if __name__ == "__main__": + args = get_args() + cosy2_model = CosyVoice2( + args.pretrained_cosyvoice2_path, load_jit=False, load_trt=False, fp16=False + ) + + llm = cosy2_model.model.llm.llm.model + + speech_embedding = cosy2_model.model.llm.speech_embedding + llm_decoder = cosy2_model.model.llm.llm_decoder + llm_embedding = cosy2_model.model.llm.llm_embedding + + tokenizer = AutoTokenizer.from_pretrained(f"{args.pretrained_cosyvoice2_path}/CosyVoice-BlankEN") + special_tokens = { + 'eos_token': '<|endoftext|>', + 'pad_token': '<|endoftext|>', + 'additional_special_tokens': [ + '<|im_start|>', '<|im_end|>', '<|endofprompt|>', + '[breath]', '', '', '[noise]', + '[laughter]', '[cough]', '[clucking]', '[accent]', + '[quick_breath]', + "", "", + "[hissing]", "[sigh]", "[vocalized-noise]", + "[lipsmack]", "[mn]" + ] + } + tokenizer.add_special_tokens(special_tokens) + + original_tokenizer_vocab_size = len(tokenizer) + cosyvoice2_token_size = 6561 + new_tokens = [f"<|s_{i}|>" for i in range(cosyvoice2_token_size)] + [ + "<|eos1|>", "<|eos2|>", "<|eos3|>", "<|sos|>", "<|task_id|>" + ] + num_added_tokens = tokenizer.add_tokens(new_tokens) + + llm.resize_token_embeddings(len(tokenizer), pad_to_multiple_of=128) + vocab_size = llm.get_input_embeddings().weight.shape[0] + + feature_size = speech_embedding.embedding_dim + new_lm_head = torch.nn.Linear(in_features=feature_size, out_features=vocab_size, bias=True) + + with torch.no_grad(): + # set the weight and bias of the new lm_head to 0 + new_lm_head.weight.data.zero_() + new_lm_head.bias.data.zero_() + new_lm_head.weight[original_tokenizer_vocab_size:original_tokenizer_vocab_size+cosyvoice2_token_size+3] = llm_decoder.weight + new_lm_head.bias[original_tokenizer_vocab_size:original_tokenizer_vocab_size+cosyvoice2_token_size+3] = llm_decoder.bias + + llm.lm_head = new_lm_head + input_embeddings = llm.get_input_embeddings() + + with torch.no_grad(): + input_embeddings.weight[original_tokenizer_vocab_size:original_tokenizer_vocab_size+cosyvoice2_token_size+3] = speech_embedding.weight + input_embeddings.weight[original_tokenizer_vocab_size+cosyvoice2_token_size+3:original_tokenizer_vocab_size+cosyvoice2_token_size+3+2] = llm_embedding.weight + + eos_token_ids = [original_tokenizer_vocab_size + cosyvoice2_token_size, original_tokenizer_vocab_size + cosyvoice2_token_size + 1, original_tokenizer_vocab_size + cosyvoice2_token_size + 2] + llm.generation_config.eos_token_id = eos_token_ids + llm.generation_config.temperature = 1.0 + llm.generation_config.top_p = 0.8 + llm.generation_config.top_k = 25 + + llm.config.eos_token_id = original_tokenizer_vocab_size + cosyvoice2_token_size + llm.config.vocab_size = vocab_size + llm.config.tie_word_embeddings = False + llm.config.use_bias = True + llm.to(torch.bfloat16) + llm.save_pretrained(args.save_path) + + TEMPLATE = "{%- for message in messages %}{%- if message['role'] == 'user' %}{{- '<|sos|>' + message['content'] + '<|task_id|>' }}{%- elif message['role'] == 'assistant' %}{{- message['content']}}{%- endif %}{%- endfor %}" + tokenizer.chat_template = TEMPLATE + tokenizer.save_pretrained(args.save_path) \ No newline at end of file diff --git a/recipe/cosyvoice_tts/requirements-cosyvoice.txt b/recipe/cosyvoice_tts/requirements-cosyvoice.txt new file mode 100644 index 00000000000..73a449dd26a --- /dev/null +++ b/recipe/cosyvoice_tts/requirements-cosyvoice.txt @@ -0,0 +1,29 @@ +conformer==0.3.2 +diffusers==0.29.0 +gdown==5.1.0 +gradio +hydra-core==1.3.2 +HyperPyYAML==1.2.2 +inflect==7.3.1 +librosa==0.10.2 +lightning==2.2.4 +matplotlib==3.7.5 +modelscope==1.15.0 +networkx==3.1 +omegaconf==2.3.0 +onnx==1.16.0 +onnxruntime-gpu==1.18.0 +protobuf==4.25 +pydantic==2.7.0 +pyworld==0.3.4 +rich==13.7.1 +soundfile==0.12.1 +tensorboard==2.14.0 +wget==3.2 +WeTextProcessing==1.0.3 +s3tokenizer +tensorrt +sherpa_onnx +jiwer +zhon +numpy==1.25.2 \ No newline at end of file diff --git a/recipe/cosyvoice_tts/reward_tts.py b/recipe/cosyvoice_tts/reward_tts.py new file mode 100644 index 00000000000..f49dc6d0dce --- /dev/null +++ b/recipe/cosyvoice_tts/reward_tts.py @@ -0,0 +1,230 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +""" +Reward calculation for CosyVoice2-0.5B. +""" + +from __future__ import annotations + +import os, re, warnings, json, time, argparse +from typing import List + +import numpy as np +import requests + + +REWARD_SERVER_URL = "http://localhost:8000/v2/models/token2wav_asr/infer" + + +def _parse_ids(token_str: str) -> List[int]: + return [int(t) for t in re.findall(r"<\|s_(\d+)\|>", token_str)] + +def _remote_reward(tokens: List[int], ground_truth: str, timeout: float = 200.0) -> float: + """Send token IDs and ground-truth text to the Triton server and get reward.""" + + tokens_arr = np.array(tokens, dtype=np.int32).reshape(1, -1) + lens_arr = np.array([[tokens_arr.shape[1]]], dtype=np.int32) + + gt_arr = np.array([ground_truth.encode("utf-8")], dtype=object) + + payload = { + "inputs": [ + { + "name": "TOKENS", + "shape": list(tokens_arr.shape), + "datatype": "INT32", + "data": tokens_arr.tolist(), + }, + { + "name": "TOKEN_LENS", + "shape": list(lens_arr.shape), + "datatype": "INT32", + "data": lens_arr.tolist(), + }, + { + "name": "GT_TEXT", + "shape": [1, 1], + "datatype": "BYTES", + "data": [ground_truth], + }, + ] + } + rsp = requests.post( + REWARD_SERVER_URL, + headers={"Content-Type": "application/json"}, + json=payload, + timeout=timeout, + verify=False, + params={"request_id": "0"}, + ) + rsp.raise_for_status() + result = rsp.json() + + try: + # Reward is returned as the first output + return float(result["outputs"][0]["data"][0]) + except (KeyError, IndexError, TypeError): + return 0.0 + + +def compute_score( + data_source: str, + solution_str: str, + ground_truth: str, + extra_info: dict | None = None, + *, + debug_dump: bool = False, +) -> float: + """Return reward in [0, 1] using the Triton ASR service. + + The reward is based on the pinyin-level WER between the ASR transcript + produced from *solution_str* and the provided *ground_truth* text. + """ + + # Decode token IDs + ids = _parse_ids(solution_str) + + # Query remote server for reward + try: + reward = _remote_reward(ids, ground_truth) + except Exception as e: + warnings.warn(f"Remote reward server error: {e}; returning 0.0") + reward = 0.0 + + if debug_dump: + print( + f"\033[92m[{data_source}] Remote reward: {reward:.4f}\033[0m" + ) + + return reward + +# CLI quick test +if __name__ == "__main__": + import sys + + def get_args(): + """Parse command line arguments.""" + parser = argparse.ArgumentParser( + description="Test TTS CER scoring with data from JSONL file", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "--input", "-i", + type=str, + default="data/emilia_zh-cosy-tiny-test.jsonl", + help="Path to input JSONL file" + ) + + parser.add_argument( + "--max-samples", "-n", + type=int, + default=None, + help="Maximum number of samples to process (default: all)" + ) + + parser.add_argument( + "--no-interactive", + action="store_true", + help="Run in non-interactive mode (process all samples without prompts)" + ) + + + parser.add_argument( + "--debug", + action="store_true", + help="Enable debug mode" + ) + + return parser.parse_args() + + def load_jsonl(file_path: str): + """Load data from jsonl file.""" + data = [] + with open(file_path, 'r', encoding='utf-8') as f: + for line in f: + data.append(json.loads(line.strip())) + return data + + def code_to_solution_str(code_list: List[int]) -> str: + """Convert code list to solution string format.""" + return ''.join([f"<|s_{code}|>" for code in code_list]) + + # Parse command line arguments + args = get_args() + + try: + # Load data from jsonl file + print(f"Loading data from: {args.input}") + data_list = load_jsonl(args.input) + print(f"Loaded {len(data_list)} samples") + + # Limit samples if specified + if args.max_samples is not None: + data_list = data_list[:args.max_samples] + print(f"Processing first {len(data_list)} samples (limited by --max-samples)") + + # Process each sample + begin_time = time.time() + for i, sample in enumerate(data_list): + print(f"\n--- Sample {i+1}/{len(data_list)} ---") + print(f"Index: {sample.get('index', 'unknown')}") + print(f"Text: {sample['text']}") + + # Extract required fields + code_list = sample['code'] + ground_truth = sample['text'] + data_source = sample.get('index', f'sample_{i}') # Use index as data_source + + # Convert code list to solution string + solution_str = code_to_solution_str(code_list) + print(f"Solution tokens: {len(code_list)} tokens") + if args.debug: + print(f"Solution string: {solution_str}") + else: + print(f"Solution string preview: {solution_str[:100]}..." if len(solution_str) > 100 else f"Solution string: {solution_str}") + + # Call compute_score function + try: + score = compute_score( + data_source=data_source, + solution_str=solution_str, + ground_truth=ground_truth, + extra_info=None, + debug_dump=args.debug + ) + print(f"Final Score: {score:.4f}") + except Exception as e: + print(f"Error computing score: {e}") + + # Ask user if they want to continue (for interactive mode) + if not args.no_interactive and i < len(data_list) - 1: + try: + response = input("\nPress Enter to continue or 'q' to quit: ").strip().lower() + if response == 'q': + break + except KeyboardInterrupt: + print("\nStopped by user") + break + + print(f"\nProcessed {min(i+1, len(data_list))} samples") + end_time = time.time() + print(f"Time taken: {end_time - begin_time} seconds") + except FileNotFoundError: + print(f"Error: File not found - {args.input}") + print("Please check the file path or use --input to specify correct path") + print("Run with --help for usage information") + except Exception as e: + print(f"Error: {e}") diff --git a/recipe/cosyvoice_tts/run.sh b/recipe/cosyvoice_tts/run.sh new file mode 100644 index 00000000000..27ed6206fe8 --- /dev/null +++ b/recipe/cosyvoice_tts/run.sh @@ -0,0 +1,170 @@ +#!/usr/bin/env bash + +set -eou pipefail + +stage=$1 +stop_stage=$2 + +log() { + # This function is from espnet + local fname=${BASH_SOURCE[1]##*/} + echo -e "$(date '+%Y-%m-%d %H:%M:%S') (${fname}:${BASH_LINENO[0]}:${FUNCNAME[1]}) $*" +} + + +export PYTHONPATH=/workspace/CosyVoice + +if [ $stage -le -1 ] && [ $stop_stage -ge -1 ]; then + log "stage -1: install vllm and CosyVoice" + # install verl + git clone https://github.com/volcengine/verl.git + cd verl + USE_MEGATRON=0 USE_SGLANG=0 bash scripts/install_vllm_sglang_mcore.sh + pip install -r requirements.txt + pip install --no-deps -e . + + # install CosyVoice + git clone https://github.com/FunAudioLLM/CosyVoice.git /workspace/CosyVoice + pip install -r ./requirements-cosyvoice.txt + + # download CosyVoice2-0.5B for token2wav + modelscope download --model iic/CosyVoice2-0.5B --local-dir /workspace/CosyVoice2-0.5B + + # install PytritonSenseVoice + git clone https://github.com/yuekaizhang/PytritonSenseVoice.git /workspace/PytritonSenseVoice + cd /workspace/PytritonSenseVoice + pip install -e . + + # install Pytriton + pip install -U nvidia-pytriton + + # download custom CosyVoice2-0.5B LLM + huggingface-cli download --local-dir /workspace/llasa_cosyvoice2_token_qwen_0.5b yuekai/llasa_cosyvoice2_token_qwen_0.5b + + # download official CosyVoice2-0.5B LLM + # First, obtained the huggingface compatible checkpoint. You could directly download the checkpoint from yuekai/cosyvoice2_llm + huggingface-cli download --local-dir ./transformers_cosyvoice2_llm yuekai/cosyvoice2_llm + # Or, you could use the following command to convert the pretrained model to huggingface compatible checkpoint + # python3 pretrained_to_huggingface.py \ + # --pretrained-cosyvoice2-path /workspace/CosyVoice2-0.5B \ + # --save-path ./transformers_cosyvoice2_llm + # If you would like to use the official CosyVoice2-0.5B LLM and do RL training, please see run_official.sh +fi + +data_dir=data/parquet_aishell3 +if [ $stage -le 0 ] && [ $stop_stage -ge 0 ]; then + log "stage 0: prepare data into verl format" + # You could download the aishell3 data from https://huggingface.co/datasets/SparkAudio/voxbox/blob/main/metadata/aishell-3.jsonl + mkdir -p $data_dir + tail -n 80000 data/aishell-3.jsonl > data/train.jsonl + tail -n 100 data/aishell-3.jsonl > data/test.jsonl + python prepare_data.py \ + --train_file data/train.jsonl \ + --test_file data/test.jsonl \ + --local_dir $data_dir +fi + +if [ $stage -le 1 ] && [ $stop_stage -ge 1 ]; then + log "stage 1: start token2wav asr server for reward function" + python3 token2wav_asr_server.py --number-of-devices 8 + + # log "Test the reward server" + # python3 reward_tts.py \ + # --input data/emilia_zh-cosy-tiny-test.jsonl \ + # --no-interactive --debug + + # async test the reward server + # python3 token2wav_asr_client.py +fi + +sft_model_path=/workspace/rl/llasa_cosyvoice2_token_qwen_0.5b/checkpoint-885000 + +if [ $stage -le 2 ] && [ $stop_stage -ge 2 ]; then + log "stage 2: grpo train" + export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" + export MKL_SERVICE_FORCE_INTEL=TRUE + n_gpus_per_node=8 + micro_batch_size=4 + train_batch_size=32 + python3 -m verl.trainer.main_ppo \ + algorithm.adv_estimator=grpo \ + data.train_files=$data_dir/train.parquet \ + data.val_files=$data_dir/test.parquet \ + data.train_batch_size=$train_batch_size \ + data.max_prompt_length=1024 \ + data.max_response_length=1024 \ + data.truncation='error' \ + actor_rollout_ref.model.use_remove_padding=True \ + actor_rollout_ref.model.path=$sft_model_path \ + actor_rollout_ref.actor.optim.lr=1e-6 \ + actor_rollout_ref.actor.ppo_mini_batch_size=16 \ + actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=$micro_batch_size \ + actor_rollout_ref.actor.use_kl_loss=False \ + actor_rollout_ref.model.enable_gradient_checkpointing=True \ + actor_rollout_ref.actor.fsdp_config.param_offload=False \ + actor_rollout_ref.actor.fsdp_config.optimizer_offload=False \ + actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=$micro_batch_size \ + actor_rollout_ref.rollout.tensor_model_parallel_size=1 \ + actor_rollout_ref.rollout.name=vllm \ + actor_rollout_ref.rollout.gpu_memory_utilization=0.6 \ + actor_rollout_ref.rollout.do_sample=true \ + actor_rollout_ref.rollout.temperature=0.8 \ + actor_rollout_ref.rollout.top_p=0.9 \ + actor_rollout_ref.rollout.n=4 \ + actor_rollout_ref.rollout.val_kwargs.do_sample=true \ + actor_rollout_ref.rollout.val_kwargs.temperature=0.8 \ + actor_rollout_ref.rollout.val_kwargs.top_p=0.9 \ + reward_model.reward_manager=prime \ + custom_reward_function.path=reward_tts.py \ + custom_reward_function.name=compute_score \ + trainer.project_name='llasa_tts_grpo' \ + trainer.experiment_name='aishell3' \ + trainer.logger=['console','wandb'] \ + trainer.n_gpus_per_node=$n_gpus_per_node \ + trainer.nnodes=1 \ + trainer.save_freq=100 \ + trainer.test_freq=100 \ + trainer.resume_mode='auto' \ + trainer.total_epochs=1 \ + trainer.val_before_train=False +fi + +step=1600 +llm_path=./checkpoints/llasa_tts_grpo/aishell3/global_step_${step} +if [ $stage -le 3 ] && [ $stop_stage -ge 3 ]; then + log "stage 3: merge the model" + python -m verl.model_merger merge \ + --backend fsdp \ + --local_dir $llm_path/actor \ + --target_dir $llm_path/merged_hf_model || exit 1 + +fi +if [ $stage -le 4 ] && [ $stop_stage -ge 4 ]; then + log "stage 4: Test the model" + datasets=(zero_shot_zh test_zh) + for dataset in ${datasets[@]}; do + output_dir=./outputs_rl_emilia_zh_step${step}_${dataset} + + token2wav_path=/workspace/CosyVoice2-0.5B + model_path=$llm_path/merged_hf_model + + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ + torchrun --nproc_per_node=8 \ + infer_dataset.py \ + --output-dir $output_dir \ + --llm-model-name-or-path $model_path \ + --token2wav-path $token2wav_path \ + --split-name ${dataset} || exit 1 + bash scripts/compute_wer.sh $output_dir ${dataset} + done +fi + +if [ $stage -le 5 ] && [ $stop_stage -ge 5 ]; then + log "stage 5: Infer with single case" + python3 infer.py \ + --token2wav-path /workspace/CosyVoice2-0.5B \ + --prompt-text "吃燕窝就选燕之屋,本节目由26年专注高品质燕窝的燕之屋冠名播出。豆奶牛奶换着喝,营养更均衡,本节目由豆本豆豆奶特约播出。" \ + --prompt-speech-path ./assets/prompt_audio.wav \ + --model-path $llm_path/merged_hf_model \ + --input-text "扁担长,板凳宽,扁担绑在板凳上。吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。" +fi diff --git a/recipe/cosyvoice_tts/run_official.sh b/recipe/cosyvoice_tts/run_official.sh new file mode 100644 index 00000000000..d7f23acff74 --- /dev/null +++ b/recipe/cosyvoice_tts/run_official.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash + +set -eou pipefail + +stage=$1 +stop_stage=$2 + +log() { + # This function is from espnet + local fname=${BASH_SOURCE[1]##*/} + echo -e "$(date '+%Y-%m-%d %H:%M:%S') (${fname}:${BASH_LINENO[0]}:${FUNCNAME[1]}) $*" +} + + +export PYTHONPATH=/workspace/CosyVoice + +if [ $stage -le 0 ] && [ $stop_stage -ge 0 ]; then + log "stage 0: prepare data into verl format" + # yuekai/llasa_cosyvoice2_token_qwen_0.5b is the emilia zh trained model, please set use_custom_template=True to use the custom template + # yuekai/cosyvoice2_llm is the official cosyvoice2 llm model, please set use_custom_template=False to use the official template + python prepare_data.py \ + --train_file data/aishell-3-cosy.jsonl \ + --test_file data/emilia_test.jsonl \ + --local_dir data/parquet_aishell3 +fi + +sft_model_path=./transformers_cosyvoice2_llm +exp_name=official_llm_aishell3_reward_tts_prime + +if [ $stage -le 2 ] && [ $stop_stage -ge 2 ]; then + log "stage 2: grpo train" + export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" + export MKL_SERVICE_FORCE_INTEL=TRUE + n_gpus_per_node=8 + micro_batch_size=4 + train_batch_size=32 + python3 -m verl.trainer.main_ppo \ + algorithm.adv_estimator=grpo \ + data.train_files=data/parquet_aishell3/train.parquet \ + data.val_files=data/parquet_aishell3/test.parquet \ + data.train_batch_size=$train_batch_size \ + data.max_prompt_length=1024 \ + data.max_response_length=512 \ + data.truncation='error' \ + actor_rollout_ref.model.use_remove_padding=False \ + actor_rollout_ref.model.path=$sft_model_path \ + actor_rollout_ref.actor.optim.lr=1e-6 \ + actor_rollout_ref.actor.ppo_mini_batch_size=32 \ + actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=$micro_batch_size \ + actor_rollout_ref.actor.use_kl_loss=False \ + actor_rollout_ref.model.enable_gradient_checkpointing=True \ + actor_rollout_ref.actor.fsdp_config.param_offload=False \ + actor_rollout_ref.actor.fsdp_config.optimizer_offload=False \ + actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=$micro_batch_size \ + actor_rollout_ref.rollout.tensor_model_parallel_size=1 \ + actor_rollout_ref.rollout.name=vllm \ + actor_rollout_ref.rollout.gpu_memory_utilization=0.6 \ + actor_rollout_ref.rollout.do_sample=true \ + actor_rollout_ref.rollout.temperature=0.8 \ + actor_rollout_ref.rollout.top_p=0.95 \ + actor_rollout_ref.rollout.top_k=25 \ + actor_rollout_ref.rollout.n=4 \ + actor_rollout_ref.rollout.val_kwargs.do_sample=true \ + actor_rollout_ref.rollout.val_kwargs.temperature=0.8 \ + actor_rollout_ref.rollout.val_kwargs.top_p=0.95 \ + actor_rollout_ref.rollout.val_kwargs.top_k=25 \ + reward_model.reward_manager=prime \ + custom_reward_function.path=reward_tts.py \ + custom_reward_function.name=compute_score \ + trainer.project_name='llasa_tts_grpo' \ + trainer.experiment_name=$exp_name \ + trainer.logger=['console','wandb'] \ + trainer.n_gpus_per_node=$n_gpus_per_node \ + trainer.nnodes=1 \ + trainer.save_freq=100 \ + trainer.test_freq=100 \ + trainer.resume_mode='auto' \ + trainer.total_epochs=1 \ + trainer.val_before_train=False +fi + +step=100 +llm_path=./checkpoints/llasa_tts_grpo/$exp_name/global_step_${step} +if [ $stage -le 3 ] && [ $stop_stage -ge 3 ]; then + log "stage 3: merge the model" + python -m verl.model_merger merge \ + --backend fsdp \ + --local_dir $llm_path/actor \ + --target_dir $llm_path/merged_hf_model || exit 1 + +fi +if [ $stage -le 4 ] && [ $stop_stage -ge 4 ]; then + log "stage 4: Test the model" + dataset=zero_shot_zh + # dataset=test_zh + output_dir=./outputs_${exp_name}_${step}_${dataset} + + token2wav_path=/workspace/CosyVoice2-0.5B + model_path=$llm_path/merged_hf_model + + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ + torchrun --nproc_per_node=8 \ + infer_dataset.py \ + --output-dir $output_dir \ + --llm-model-name-or-path $model_path \ + --token2wav-path $token2wav_path \ + --split-name ${dataset} || exit 1 + + bash scripts/compute_wer.sh $output_dir ${dataset} +fi + +if [ $stage -le 5 ] && [ $stop_stage -ge 5 ]; then + log "stage 5: Infer with single case" + python3 infer.py \ + --token2wav-path /workspace/CosyVoice2-0.5B \ + --prompt-text "吃燕窝就选燕之屋,本节目由26年专注高品质燕窝的燕之屋冠名播出。豆奶牛奶换着喝,营养更均衡,本节目由豆本豆豆奶特约播出。" \ + --prompt-speech-path ./assets/prompt_audio.wav \ + --model-path ./transformers_cosyvoice2_llm \ + --input-text "用四川话说<|endofprompt|>扁担长,板凳宽,扁担绑在板凳上。吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。" +fi \ No newline at end of file diff --git a/recipe/cosyvoice_tts/scripts/compute_wer.sh b/recipe/cosyvoice_tts/scripts/compute_wer.sh new file mode 100644 index 00000000000..55ae1a73780 --- /dev/null +++ b/recipe/cosyvoice_tts/scripts/compute_wer.sh @@ -0,0 +1,32 @@ +wav_dir=$1 +wav_files=$(ls $wav_dir/*.wav) +# if wav_files is empty, then exit +if [ -z "$wav_files" ]; then + exit 1 +fi +split_name=$2 +model_path=models/sherpa-onnx-paraformer-zh-2023-09-14 + +if [ ! -d $model_path ]; then + pip install sherpa-onnx + wget -nc https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-paraformer-zh-2023-09-14.tar.bz2 + tar xvf sherpa-onnx-paraformer-zh-2023-09-14.tar.bz2 -C models +fi + +python3 scripts/offline-decode-files.py \ + --tokens=$model_path/tokens.txt \ + --paraformer=$model_path/model.int8.onnx \ + --num-threads=2 \ + --decoding-method=greedy_search \ + --debug=false \ + --sample-rate=24000 \ + --log-dir $wav_dir \ + --feature-dim=80 \ + --split-name $split_name \ + --name sherpa_onnx \ + $wav_files + +# python3 scripts/paraformer-pytriton-client.py \ +# --log-dir $wav_dir \ +# --split-name $split_name \ +# $wav_files \ No newline at end of file diff --git a/recipe/cosyvoice_tts/scripts/offline-decode-files.py b/recipe/cosyvoice_tts/scripts/offline-decode-files.py new file mode 100644 index 00000000000..35fc03da1e5 --- /dev/null +++ b/recipe/cosyvoice_tts/scripts/offline-decode-files.py @@ -0,0 +1,753 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2023 by manyeyes +# Copyright (c) 2023 Xiaomi Corporation + +""" +This file demonstrates how to use sherpa-onnx Python API to transcribe +file(s) with a non-streaming model. + +(1) For paraformer + + ./python-api-examples/offline-decode-files.py \ + --tokens=/path/to/tokens.txt \ + --paraformer=/path/to/paraformer.onnx \ + --num-threads=2 \ + --decoding-method=greedy_search \ + --debug=false \ + --sample-rate=16000 \ + --feature-dim=80 \ + /path/to/0.wav \ + /path/to/1.wav + +(2) For transducer models from icefall + + ./python-api-examples/offline-decode-files.py \ + --tokens=/path/to/tokens.txt \ + --encoder=/path/to/encoder.onnx \ + --decoder=/path/to/decoder.onnx \ + --joiner=/path/to/joiner.onnx \ + --num-threads=2 \ + --decoding-method=greedy_search \ + --debug=false \ + --sample-rate=16000 \ + --feature-dim=80 \ + /path/to/0.wav \ + /path/to/1.wav + +(3) For CTC models from NeMo + +python3 ./python-api-examples/offline-decode-files.py \ + --tokens=./sherpa-onnx-nemo-ctc-en-citrinet-512/tokens.txt \ + --nemo-ctc=./sherpa-onnx-nemo-ctc-en-citrinet-512/model.onnx \ + --num-threads=2 \ + --decoding-method=greedy_search \ + --debug=false \ + ./sherpa-onnx-nemo-ctc-en-citrinet-512/test_wavs/0.wav \ + ./sherpa-onnx-nemo-ctc-en-citrinet-512/test_wavs/1.wav \ + ./sherpa-onnx-nemo-ctc-en-citrinet-512/test_wavs/8k.wav + +(4) For Whisper models + +python3 ./python-api-examples/offline-decode-files.py \ + --whisper-encoder=./sherpa-onnx-whisper-base.en/base.en-encoder.int8.onnx \ + --whisper-decoder=./sherpa-onnx-whisper-base.en/base.en-decoder.int8.onnx \ + --tokens=./sherpa-onnx-whisper-base.en/base.en-tokens.txt \ + --whisper-task=transcribe \ + --num-threads=1 \ + ./sherpa-onnx-whisper-base.en/test_wavs/0.wav \ + ./sherpa-onnx-whisper-base.en/test_wavs/1.wav \ + ./sherpa-onnx-whisper-base.en/test_wavs/8k.wav + +(5) For CTC models from WeNet + +python3 ./python-api-examples/offline-decode-files.py \ + --wenet-ctc=./sherpa-onnx-zh-wenet-wenetspeech/model.onnx \ + --tokens=./sherpa-onnx-zh-wenet-wenetspeech/tokens.txt \ + ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/0.wav \ + ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/1.wav \ + ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/8k.wav + +(6) For tdnn models of the yesno recipe from icefall + +python3 ./python-api-examples/offline-decode-files.py \ + --sample-rate=8000 \ + --feature-dim=23 \ + --tdnn-model=./sherpa-onnx-tdnn-yesno/model-epoch-14-avg-2.onnx \ + --tokens=./sherpa-onnx-tdnn-yesno/tokens.txt \ + ./sherpa-onnx-tdnn-yesno/test_wavs/0_0_0_1_0_0_0_1.wav \ + ./sherpa-onnx-tdnn-yesno/test_wavs/0_0_1_0_0_0_1_0.wav \ + ./sherpa-onnx-tdnn-yesno/test_wavs/0_0_1_0_0_1_1_1.wav + +Please refer to +https://k2-fsa.github.io/sherpa/onnx/index.html +to install sherpa-onnx and to download non-streaming pre-trained models +used in this file. +""" +import argparse +import time +import wave +from pathlib import Path +from typing import List, Tuple, Dict, Iterable, TextIO, Union + +import numpy as np +import sherpa_onnx +import soundfile as sf +from datasets import load_dataset +import logging +from collections import defaultdict +import kaldialign +from zhon.hanzi import punctuation +import string +punctuation_all = punctuation + string.punctuation +Pathlike = Union[str, Path] + +def remove_punctuation(text: str) -> str: + for x in punctuation_all: + if x == '\'': + continue + text = text.replace(x, '') + return text + +def store_transcripts( + filename: Pathlike, texts: Iterable[Tuple[str, str, str]], char_level: bool = False +) -> None: + """Save predicted results and reference transcripts to a file. + + Args: + filename: + File to save the results to. + texts: + An iterable of tuples. The first element is the cur_id, the second is + the reference transcript and the third element is the predicted result. + If it is a multi-talker ASR system, the ref and hyp may also be lists of + strings. + Returns: + Return None. + """ + with open(filename, "w", encoding="utf8") as f: + for cut_id, ref, hyp in texts: + if char_level: + ref = list("".join(ref)) + hyp = list("".join(hyp)) + print(f"{cut_id}:\tref={ref}", file=f) + print(f"{cut_id}:\thyp={hyp}", file=f) + + +def write_error_stats( + f: TextIO, + test_set_name: str, + results: List[Tuple[str, str]], + enable_log: bool = True, + compute_CER: bool = False, + sclite_mode: bool = False, +) -> float: + """Write statistics based on predicted results and reference transcripts. + + It will write the following to the given file: + + - WER + - number of insertions, deletions, substitutions, corrects and total + reference words. For example:: + + Errors: 23 insertions, 57 deletions, 212 substitutions, over 2606 + reference words (2337 correct) + + - The difference between the reference transcript and predicted result. + An instance is given below:: + + THE ASSOCIATION OF (EDISON->ADDISON) ILLUMINATING COMPANIES + + The above example shows that the reference word is `EDISON`, + but it is predicted to `ADDISON` (a substitution error). + + Another example is:: + + FOR THE FIRST DAY (SIR->*) I THINK + + The reference word `SIR` is missing in the predicted + results (a deletion error). + results: + An iterable of tuples. The first element is the cut_id, the second is + the reference transcript and the third element is the predicted result. + enable_log: + If True, also print detailed WER to the console. + Otherwise, it is written only to the given file. + Returns: + Return None. + """ + subs: Dict[Tuple[str, str], int] = defaultdict(int) + ins: Dict[str, int] = defaultdict(int) + dels: Dict[str, int] = defaultdict(int) + + # `words` stores counts per word, as follows: + # corr, ref_sub, hyp_sub, ins, dels + words: Dict[str, List[int]] = defaultdict(lambda: [0, 0, 0, 0, 0]) + num_corr = 0 + ERR = "*" + + if compute_CER: + for i, res in enumerate(results): + cut_id, ref, hyp = res + ref = list("".join(ref)) + hyp = list("".join(hyp)) + results[i] = (cut_id, ref, hyp) + + for cut_id, ref, hyp in results: + ali = kaldialign.align(ref, hyp, ERR, sclite_mode=sclite_mode) + for ref_word, hyp_word in ali: + if ref_word == ERR: + ins[hyp_word] += 1 + words[hyp_word][3] += 1 + elif hyp_word == ERR: + dels[ref_word] += 1 + words[ref_word][4] += 1 + elif hyp_word != ref_word: + subs[(ref_word, hyp_word)] += 1 + words[ref_word][1] += 1 + words[hyp_word][2] += 1 + else: + words[ref_word][0] += 1 + num_corr += 1 + ref_len = sum([len(r) for _, r, _ in results]) + sub_errs = sum(subs.values()) + ins_errs = sum(ins.values()) + del_errs = sum(dels.values()) + tot_errs = sub_errs + ins_errs + del_errs + tot_err_rate = "%.2f" % (100.0 * tot_errs / ref_len) + + if enable_log: + logging.info( + f"[{test_set_name}] %WER {tot_errs / ref_len:.2%} " + f"[{tot_errs} / {ref_len}, {ins_errs} ins, " + f"{del_errs} del, {sub_errs} sub ]" + ) + + print(f"%WER = {tot_err_rate}", file=f) + print( + f"Errors: {ins_errs} insertions, {del_errs} deletions, " + f"{sub_errs} substitutions, over {ref_len} reference " + f"words ({num_corr} correct)", + file=f, + ) + print( + "Search below for sections starting with PER-UTT DETAILS:, " + "SUBSTITUTIONS:, DELETIONS:, INSERTIONS:, PER-WORD STATS:", + file=f, + ) + + print("", file=f) + print("PER-UTT DETAILS: corr or (ref->hyp) ", file=f) + for cut_id, ref, hyp in results: + ali = kaldialign.align(ref, hyp, ERR) + combine_successive_errors = True + if combine_successive_errors: + ali = [[[x], [y]] for x, y in ali] + for i in range(len(ali) - 1): + if ali[i][0] != ali[i][1] and ali[i + 1][0] != ali[i + 1][1]: + ali[i + 1][0] = ali[i][0] + ali[i + 1][0] + ali[i + 1][1] = ali[i][1] + ali[i + 1][1] + ali[i] = [[], []] + ali = [ + [ + list(filter(lambda a: a != ERR, x)), + list(filter(lambda a: a != ERR, y)), + ] + for x, y in ali + ] + ali = list(filter(lambda x: x != [[], []], ali)) + ali = [ + [ + ERR if x == [] else " ".join(x), + ERR if y == [] else " ".join(y), + ] + for x, y in ali + ] + + print( + f"{cut_id}:\t" + + " ".join( + ( + ref_word if ref_word == hyp_word else f"({ref_word}->{hyp_word})" + for ref_word, hyp_word in ali + ) + ), + file=f, + ) + + print("", file=f) + print("SUBSTITUTIONS: count ref -> hyp", file=f) + + for count, (ref, hyp) in sorted([(v, k) for k, v in subs.items()], reverse=True): + print(f"{count} {ref} -> {hyp}", file=f) + + print("", file=f) + print("DELETIONS: count ref", file=f) + for count, ref in sorted([(v, k) for k, v in dels.items()], reverse=True): + print(f"{count} {ref}", file=f) + + print("", file=f) + print("INSERTIONS: count hyp", file=f) + for count, hyp in sorted([(v, k) for k, v in ins.items()], reverse=True): + print(f"{count} {hyp}", file=f) + + print("", file=f) + print("PER-WORD STATS: word corr tot_errs count_in_ref count_in_hyp", file=f) + for _, word, counts in sorted( + [(sum(v[1:]), k, v) for k, v in words.items()], reverse=True + ): + (corr, ref_sub, hyp_sub, ins, dels) = counts + tot_errs = ref_sub + hyp_sub + ins + dels + ref_count = corr + ref_sub + dels + hyp_count = corr + hyp_sub + ins + + print(f"{word} {corr} {tot_errs} {ref_count} {hyp_count}", file=f) + return float(tot_err_rate) + +def get_args(): + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "--tokens", + type=str, + help="Path to tokens.txt", + ) + + parser.add_argument( + "--hotwords-file", + type=str, + default="", + help=""" + The file containing hotwords, one words/phrases per line, like + HELLO WORLD + 你好世界 + """, + ) + + parser.add_argument( + "--hotwords-score", + type=float, + default=1.5, + help=""" + The hotword score of each token for biasing word/phrase. Used only if + --hotwords-file is given. + """, + ) + + parser.add_argument( + "--modeling-unit", + type=str, + default="", + help=""" + The modeling unit of the model, valid values are cjkchar, bpe, cjkchar+bpe. + Used only when hotwords-file is given. + """, + ) + + parser.add_argument( + "--bpe-vocab", + type=str, + default="", + help=""" + The path to the bpe vocabulary, the bpe vocabulary is generated by + sentencepiece, you can also export the bpe vocabulary through a bpe model + by `scripts/export_bpe_vocab.py`. Used only when hotwords-file is given + and modeling-unit is bpe or cjkchar+bpe. + """, + ) + + parser.add_argument( + "--encoder", + default="", + type=str, + help="Path to the encoder model", + ) + + parser.add_argument( + "--decoder", + default="", + type=str, + help="Path to the decoder model", + ) + + parser.add_argument( + "--joiner", + default="", + type=str, + help="Path to the joiner model", + ) + + parser.add_argument( + "--paraformer", + default="", + type=str, + help="Path to the model.onnx from Paraformer", + ) + + parser.add_argument( + "--nemo-ctc", + default="", + type=str, + help="Path to the model.onnx from NeMo CTC", + ) + + parser.add_argument( + "--wenet-ctc", + default="", + type=str, + help="Path to the model.onnx from WeNet CTC", + ) + + parser.add_argument( + "--tdnn-model", + default="", + type=str, + help="Path to the model.onnx for the tdnn model of the yesno recipe", + ) + + parser.add_argument( + "--num-threads", + type=int, + default=1, + help="Number of threads for neural network computation", + ) + + parser.add_argument( + "--whisper-encoder", + default="", + type=str, + help="Path to whisper encoder model", + ) + + parser.add_argument( + "--whisper-decoder", + default="", + type=str, + help="Path to whisper decoder model", + ) + + parser.add_argument( + "--whisper-language", + default="", + type=str, + help="""It specifies the spoken language in the input audio file. + Example values: en, fr, de, zh, jp. + Available languages for multilingual models can be found at + https://github.com/openai/whisper/blob/main/whisper/tokenizer.py#L10 + If not specified, we infer the language from the input audio file. + """, + ) + + parser.add_argument( + "--whisper-task", + default="transcribe", + choices=["transcribe", "translate"], + type=str, + help="""For multilingual models, if you specify translate, the output + will be in English. + """, + ) + + parser.add_argument( + "--whisper-tail-paddings", + default=-1, + type=int, + help="""Number of tail padding frames. + We have removed the 30-second constraint from whisper, so you need to + choose the amount of tail padding frames by yourself. + Use -1 to use a default value for tail padding. + """, + ) + + parser.add_argument( + "--blank-penalty", + type=float, + default=0.0, + help=""" + The penalty applied on blank symbol during decoding. + Note: It is a positive value that would be applied to logits like + this `logits[:, 0] -= blank_penalty` (suppose logits.shape is + [batch_size, vocab] and blank id is 0). + """, + ) + + parser.add_argument( + "--decoding-method", + type=str, + default="greedy_search", + help="Valid values are greedy_search and modified_beam_search", + ) + parser.add_argument( + "--debug", + type=bool, + default=False, + help="True to show debug messages", + ) + + parser.add_argument( + "--sample-rate", + type=int, + default=16000, + help="""Sample rate of the feature extractor. Must match the one + expected by the model. Note: The input sound files can have a + different sample rate from this argument.""", + ) + + parser.add_argument( + "--feature-dim", + type=int, + default=80, + help="Feature dimension. Must match the one expected by the model", + ) + + parser.add_argument( + "sound_files", + type=str, + nargs="+", + help="The input sound file(s) to decode. Each file must be of WAVE" + "format with a single channel, and each sample has 16-bit, " + "i.e., int16_t. " + "The sample rate of the file can be arbitrary and does not need to " + "be 16 kHz", + ) + + parser.add_argument( + "--name", + type=str, + default="", + help="The directory containing the input sound files to decode", + ) + + parser.add_argument( + "--log-dir", + type=str, + default="", + help="The directory containing the input sound files to decode", + ) + + parser.add_argument( + "--label", + type=str, + default=None, + help="wav_base_name label", + ) + + # Dataset related arguments for loading labels when label file is not provided + parser.add_argument( + "--dataset-name", + type=str, + default="yuekai/seed_tts_cosy2", + help="Huggingface dataset name for loading labels", + ) + + parser.add_argument( + "--split-name", + type=str, + default="wenetspeech4tts", + help="Dataset split name for loading labels", + ) + + return parser.parse_args() + + +def assert_file_exists(filename: str): + assert Path(filename).is_file(), ( + f"{filename} does not exist!\n" + "Please refer to " + "https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html to download it" + ) + + +def read_wave(wave_filename: str) -> Tuple[np.ndarray, int]: + """ + Args: + wave_filename: + Path to a wave file. It should be single channel and can be of type + 32-bit floating point PCM. Its sample rate does not need to be 24kHz. + + Returns: + Return a tuple containing: + - A 1-D array of dtype np.float32 containing the samples, + which are normalized to the range [-1, 1]. + - Sample rate of the wave file. + """ + + samples, sample_rate = sf.read(wave_filename, dtype="float32") + assert ( + samples.ndim == 1 + ), f"Expected single channel, but got {samples.ndim} channels." + + samples_float32 = samples.astype(np.float32) + + return samples_float32, sample_rate + + +def normalize_text_alimeeting(text: str) -> str: + """ + Text normalization similar to M2MeT challenge baseline. + See: https://github.com/yufan-aslp/AliMeeting/blob/main/asr/local/text_normalize.pl + """ + import re + text = text.replace('\u00A0', '') # test_hard + text = text.replace(" ", "") + text = text.replace("", "") + text = text.replace("<%>", "") + text = text.replace("<->", "") + text = text.replace("<$>", "") + text = text.replace("<#>", "") + text = text.replace("<_>", "") + text = text.replace("", "") + text = text.replace("`", "") + text = text.replace("&", "") + text = text.replace(",", "") + if re.search("[a-zA-Z]", text): + text = text.upper() + text = text.replace("A", "A") + text = text.replace("a", "A") + text = text.replace("b", "B") + text = text.replace("c", "C") + text = text.replace("k", "K") + text = text.replace("t", "T") + text = text.replace(",", "") + text = text.replace("丶", "") + text = text.replace("。", "") + text = text.replace("、", "") + text = text.replace("?", "") + text = remove_punctuation(text) + return text + + +def main(): + args = get_args() + assert_file_exists(args.tokens) + assert args.num_threads > 0, args.num_threads + + assert len(args.nemo_ctc) == 0, args.nemo_ctc + assert len(args.wenet_ctc) == 0, args.wenet_ctc + assert len(args.whisper_encoder) == 0, args.whisper_encoder + assert len(args.whisper_decoder) == 0, args.whisper_decoder + assert len(args.tdnn_model) == 0, args.tdnn_model + + assert_file_exists(args.paraformer) + + recognizer = sherpa_onnx.OfflineRecognizer.from_paraformer( + paraformer=args.paraformer, + tokens=args.tokens, + num_threads=args.num_threads, + sample_rate=args.sample_rate, + feature_dim=args.feature_dim, + decoding_method=args.decoding_method, + debug=args.debug, + ) + + print("Started!") + start_time = time.time() + + streams, results = [], [] + total_duration = 0 + + for i, wave_filename in enumerate(args.sound_files): + assert_file_exists(wave_filename) + samples, sample_rate = read_wave(wave_filename) + duration = len(samples) / sample_rate + total_duration += duration + s = recognizer.create_stream() + s.accept_waveform(sample_rate, samples) + + streams.append(s) + if i % 10 == 0: + recognizer.decode_streams(streams) + results += [s.result.text for s in streams] + streams = [] + print(f"Processed {i} files") + # process the last batch + if streams: + recognizer.decode_streams(streams) + results += [s.result.text for s in streams] + end_time = time.time() + print("Done!") + + results_dict = {} + for wave_filename, result in zip(args.sound_files, results): + print(f"{wave_filename}\n{result}") + print("-" * 10) + wave_basename = Path(wave_filename).stem + results_dict[wave_basename] = result + + elapsed_seconds = end_time - start_time + rtf = elapsed_seconds / total_duration + print(f"num_threads: {args.num_threads}") + print(f"decoding_method: {args.decoding_method}") + print(f"Wave duration: {total_duration:.3f} s") + print(f"Elapsed time: {elapsed_seconds:.3f} s") + print( + f"Real time factor (RTF): {elapsed_seconds:.3f}/{total_duration:.3f} = {rtf:.3f}" + ) + + # Load labels either from file or from dataset + labels_dict = {} + + if args.label: + # Load labels from file (original functionality) + print(f"Loading labels from file: {args.label}") + with open(args.label, "r") as f: + for line in f: + # fields = line.strip().split(" ") + # fields = [item for item in fields if item] + # assert len(fields) == 4 + # prompt_text, prompt_audio, text, audio_path = fields + + fields = line.strip().split("|") + fields = [item for item in fields if item] + assert len(fields) == 4 + audio_path, prompt_text, prompt_audio, text = fields + labels_dict[Path(audio_path).stem] = normalize_text_alimeeting(text) + else: + # Load labels from dataset (new functionality) + print(f"Loading labels from dataset: {args.dataset_name}, split: {args.split_name}") + if 'zero' in args.split_name: + dataset_name = "yuekai/CV3-Eval" + else: + dataset_name = "yuekai/seed_tts_cosy2" + dataset = load_dataset( + dataset_name, + split=args.split_name, + trust_remote_code=True, + ) + + for item in dataset: + audio_id = item["id"] + labels_dict[audio_id] = normalize_text_alimeeting(item["target_text"]) + + print(f"Loaded {len(labels_dict)} labels from dataset") + + # Perform evaluation if labels are available + if labels_dict: + + final_results = [] + for key, value in results_dict.items(): + if key in labels_dict: + final_results.append((key, labels_dict[key], value)) + else: + print(f"Warning: No label found for {key}, skipping...") + + if final_results: + store_transcripts( + filename=f"{args.log_dir}/recogs-{args.name}.txt", texts=final_results + ) + with open(f"{args.log_dir}/errs-{args.name}.txt", "w") as f: + write_error_stats(f, "test-set", final_results, enable_log=True) + + with open(f"{args.log_dir}/errs-{args.name}.txt", "r") as f: + print(f.readline()) # WER + print(f.readline()) # Detailed errors + else: + print("No matching labels found for evaluation") + else: + print("No labels available for evaluation") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/recipe/cosyvoice_tts/token2wav_asr_client.py b/recipe/cosyvoice_tts/token2wav_asr_client.py new file mode 100644 index 00000000000..9a8033746de --- /dev/null +++ b/recipe/cosyvoice_tts/token2wav_asr_client.py @@ -0,0 +1,164 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +import requests +import soundfile as sf +import json +import numpy as np +import argparse +import time +import asyncio +import aiohttp + +def get_args(): + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "--server-url", + type=str, + default="localhost:8000", + help="Address of the server", + ) + + parser.add_argument( + "--model-name", + type=str, + default="token2wav_asr", + choices=[ + "token2wav_asr" + ], + help="triton model_repo module name to request", + ) + + parser.add_argument( + "--concurrent-job", + type=int, + default=10, + help="Number of concurrent requests to send in parallel", + ) + + parser.add_argument( + "--data-path", + type=str, + default="./data/emilia_zh-cosy-tiny-test.jsonl", + help="Path to the data file", + ) + return parser.parse_args() + +def prepare_request(tokens, token_lens, gt_text): + """Construct HTTP/JSON inference request body.""" + + data = { + "inputs": [ + { + "name": "TOKENS", + "shape": list(tokens.shape), + "datatype": "INT32", + "data": tokens.tolist(), + }, + { + "name": "TOKEN_LENS", + "shape": list(token_lens.shape), + "datatype": "INT32", + "data": token_lens.tolist(), + }, + { + "name": "GT_TEXT", + "shape": [1, 1], + "datatype": "BYTES", + "data": [gt_text], + }, + ] + } + + return data + +def load_jsonl(file_path: str): + """Load data from jsonl file.""" + data = [] + with open(file_path, 'r', encoding='utf-8') as f: + for line in f: + data.append(json.loads(line.strip())) + return data + + +async def process_sample(idx, total, sample, session, url, semaphore): + """Send a single request to the inference server and log the response.""" + async with semaphore: + # Prepare request body + code_list = sample["code"] + tokens = np.array(code_list, dtype=np.int32).reshape(1, -1) + token_lens = np.array([[len(tokens[0])]], dtype=np.int32) + gt_text = sample["text"] + data = prepare_request(tokens, token_lens, gt_text) + + # Send HTTP POST + async with session.post( + url, + headers={"Content-Type": "application/json"}, + json=data, + params={"request_id": "0"}, + ) as rsp: + result = await rsp.json() + + # Parse outputs (order: REWARDS, TRANSCRIPTS) + rewards = None + transcripts = None + for out in result.get("outputs", []): + if out["name"] == "REWARDS": + rewards = out["data"][0] + elif out["name"] == "TRANSCRIPTS": + transcripts = out["data"][0] + + # Output summary (prints may interleave across tasks) + print(f"\n--- Sample {idx}/{total} ---") + print(f"GT Text: {gt_text}") + print(f"Tokens shape: {tokens.shape}, Token_lens shape: {token_lens.shape}") + print(f"Transcript: {transcripts}") + print(f"Reward: {rewards}") + + +async def main_async(): + args = get_args() + + server_url = args.server_url + if not server_url.startswith(("http://", "https://")): + server_url = f"http://{server_url}" + + url = f"{server_url}/v2/models/{args.model_name}/infer" + + # Load dataset + data_list = load_jsonl(args.data_path) + + # Concurrency primitives + semaphore = asyncio.Semaphore(max(1, args.concurrent_job)) + connector = aiohttp.TCPConnector(ssl=False) + + start_time = time.time() + async with aiohttp.ClientSession(connector=connector) as session: + tasks = [ + asyncio.create_task( + process_sample(i + 1, len(data_list), sample, session, url, semaphore) + ) + for i, sample in enumerate(data_list) + ] + await asyncio.gather(*tasks) + end_time = time.time() + print(f"Time taken: {end_time - start_time} seconds") + + +if __name__ == "__main__": + asyncio.run(main_async()) \ No newline at end of file diff --git a/recipe/cosyvoice_tts/token2wav_asr_server.py b/recipe/cosyvoice_tts/token2wav_asr_server.py new file mode 100644 index 00000000000..1273c188ce0 --- /dev/null +++ b/recipe/cosyvoice_tts/token2wav_asr_server.py @@ -0,0 +1,348 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# 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. +"""Pytriton server for token2wav conversion and ASR""" + +import argparse +import io +import logging +from typing import Any, List +import numpy as np +import torch +from scipy.signal import resample +import sys +import random +import re +from jiwer import wer +from pypinyin import lazy_pinyin, Style +from tn.chinese.normalizer import Normalizer as ZhNormalizer + +# Chinese text normalizer (cached globally) +zh_tn_model = ZhNormalizer( + cache_dir="./cache", + remove_erhua=False, + remove_interjections=False, + remove_puncts=True, + overwrite_cache=True, +) + +from pytriton.decorators import batch +from pytriton.model_config import DynamicBatcher, ModelConfig, Tensor +from pytriton.triton import Triton, TritonConfig +from pytriton.proxy.types import Request + +from omnisense.models import OmniSenseVoiceSmall +from cosyvoice.cli.cosyvoice import CosyVoice2 + +from datasets import load_dataset + +sys.path.append("/workspace/CosyVoice/third_party/Matcha-TTS") + +logger = logging.getLogger("token2wav_asr_server") + + +class _ASR_Server: + """Wraps a single OmniSenseVoiceSmall model instance for Triton.""" + + def __init__(self, device_id: int): + self._model = OmniSenseVoiceSmall("iic/SenseVoiceSmall", quantize=False, device_id=device_id) + + @batch + def __call__(self, WAV: np.ndarray, WAV_LENS: np.ndarray, LANGUAGE: np.ndarray, TEXT_NORM: np.ndarray): + """ + WAV: np.ndarray, WAV_LENS: np.ndarray + LANGUAGE: np.ndarray, TEXTNORM: np.ndarray for backward compatibility, not used + See: https://github.com/modelscope/FunASR/tree/main/runtime/triton_gpu + """ + logger.debug("WAV: %s, WAV_LENS: %s, shapes: %s %s", type(WAV), type(WAV_LENS), WAV.shape, WAV_LENS.shape) + wavs = [WAV[i, :WAV_LENS[i, 0]] for i in range(len(WAV))] + + results = self._model.transcribe_single_batch( + wavs, + language="zh", + textnorm="woitn", + ) + texts = [result.text for result in results] + transcripts = np.char.encode(np.array(texts).reshape(-1, 1), "utf-8") + return {"TRANSCRIPTS": transcripts} + + + +def audio_decode_cosyvoice2( + audio_tokens, prompt_text, prompt_speech_16k, codec_decoder +): + """ + Generate audio from tokens with optional tone and prompt embedding. + """ + model_inputs_dict = codec_decoder.frontend.frontend_zero_shot( + "empty", prompt_text, prompt_speech_16k, 24000 + ) + tts_mel, _ = codec_decoder.model.flow.inference( + token=audio_tokens.to(codec_decoder.model.device), + token_len=torch.tensor([audio_tokens.shape[1]], dtype=torch.int32).to( + codec_decoder.model.device + ), + prompt_token=model_inputs_dict["flow_prompt_speech_token"].to( + codec_decoder.model.device + ), + prompt_token_len=torch.tensor( + [model_inputs_dict["flow_prompt_speech_token_len"]], dtype=torch.int32 + ).to(codec_decoder.model.device), + prompt_feat=model_inputs_dict["prompt_speech_feat"].to( + codec_decoder.model.device + ), + prompt_feat_len=model_inputs_dict["prompt_speech_feat_len"].to( + codec_decoder.model.device + ), + embedding=model_inputs_dict["flow_embedding"].to(codec_decoder.model.device), + finalize=True, + ) + + audio_hat, _ = codec_decoder.model.hift.inference( + speech_feat=tts_mel, cache_source=torch.zeros(1, 1, 0) + ) + + return audio_hat + + +def get_random_prompt_from_dataset(dataset): + """ + Get random prompt text and speech from the pre-loaded dataset. + Returns (prompt_text, prompt_speech_16k) + """ + random_idx = random.randint(0, len(dataset) - 1) + sample = dataset[random_idx] + + # Extract audio data + audio_data = sample["audio"] + audio_array = audio_data["array"] + sample_rate = audio_data["sampling_rate"] + + # Convert audio to 16kHz if needed + if sample_rate != 16000: + num_samples = int(len(audio_array) * (16000 / sample_rate)) + audio_array = resample(audio_array, num_samples) + + # Convert to torch tensor + prompt_speech_16k = torch.from_numpy(audio_array).float().unsqueeze(0) + prompt_text = sample["text"] + # remove space in prompt_text + prompt_text = prompt_text.replace(" ", "") + return prompt_text, prompt_speech_16k + +class _Token2Wav_ASR: + """Wraps a single OmniSenseVoiceSmall model instance for Triton.""" + + def __init__(self, device_id: int): + self.asr_model = OmniSenseVoiceSmall("iic/SenseVoiceSmall", quantize=False, device_id=device_id) + self.dataset = load_dataset("yuekai/aishell", "test", trust_remote_code=True)["test"] + + # Make sure the CosyVoice2 decoder lives on the same GPU as the ASR model + # CosyVoice2 internally uses generic "cuda" device, so we first switch the + # current CUDA context to the desired card before the object is created. + # Afterwards, all parameters loaded with the generic "cuda" device will + # reside on this GPU. We keep the selected id in `self.device_id` and + # will set the context again for every forward call to avoid race + # conditions when several instances are used in the same process. + + self.device_id = device_id + + # Construct the TTS codec decoder under the correct CUDA device context + with torch.cuda.device(self.device_id): + self.codec_decoder = CosyVoice2( + "/workspace/CosyVoice2-0.5B", load_jit=True, load_trt=True, fp16=True + ) + @batch + def __call__(self, TOKENS: np.ndarray, TOKEN_LENS: np.ndarray, GT_TEXT: np.ndarray): + """ + WAV: np.ndarray, WAV_LENS: np.ndarray + LANGUAGE: np.ndarray, TEXTNORM: np.ndarray for backward compatibility, not used + See: https://github.com/modelscope/FunASR/tree/main/runtime/triton_gpu + """ + # Ensure the default CUDA device is set correctly for this invocation + torch.cuda.set_device(self.device_id) + + if self.device_id == 0: + print(f"device_id: {self.device_id}, TOKENS: {TOKENS.shape}, TOKEN_LENS: {TOKEN_LENS.shape}") + + tokens_list = [TOKENS[i, :TOKEN_LENS[i, 0]] for i in range(len(TOKENS))] + + # Decode ground-truth text strings (BYTES → str) + if GT_TEXT.ndim == 2: + gt_texts = [GT_TEXT[i, 0].decode("utf-8") for i in range(len(GT_TEXT))] + else: + gt_texts = [GT_TEXT[i].decode("utf-8") for i in range(len(GT_TEXT))] + + wavs = [] + for tokens in tokens_list: + prompt_text, prompt_speech_16k = get_random_prompt_from_dataset(self.dataset) + audio_tokens = torch.tensor(tokens, dtype=torch.long, device=self.asr_model.device).unsqueeze(0) + audio_hat = audio_decode_cosyvoice2( + audio_tokens, + prompt_text, + prompt_speech_16k, + self.codec_decoder, + ) + # resample to 16000 using soundfile + audio_hat = audio_hat.squeeze(0).float().cpu() + audio_hat = audio_hat.numpy() + num_samples = int(len(audio_hat) * (16000 / 24000)) + audio_hat = resample(audio_hat, num_samples) + wavs.append(audio_hat) + + results = self.asr_model.transcribe_single_batch( + wavs, + language="zh", + textnorm="woitn", + ) + texts = [result.text for result in results] + + # ---------------- Reward computation ---------------- + rewards = [] + for gt_text, hyp_text in zip(gt_texts, texts): + gt_norm = zh_tn_model.normalize(gt_text).lower() + hyp_norm = zh_tn_model.normalize(hyp_text).lower() + + gt_pinyin = lazy_pinyin( + gt_norm, + style=Style.TONE3, + tone_sandhi=True, + neutral_tone_with_five=True, + ) + hyp_pinyin = lazy_pinyin( + hyp_norm, + style=Style.TONE3, + tone_sandhi=True, + neutral_tone_with_five=True, + ) + + c = float(wer(" ".join(gt_pinyin), " ".join(hyp_pinyin))) + reward_val = 1.0 - np.tanh(3.0 * c) + reward_val = max(0.0, min(1.0, reward_val)) + rewards.append(reward_val) + print(f"gt_text: {gt_text}, hyp_text: {hyp_text}, reward_val: {reward_val}") + + transcripts = np.char.encode(np.array(texts).reshape(-1, 1), "utf-8") + rewards_arr = np.array(rewards, dtype=np.float32).reshape(-1, 1) + + + return {"REWARDS": rewards_arr, "TRANSCRIPTS": transcripts} + + +def _infer_function_factory(device_ids: List[int], model_name: str): + """Creates a list of inference functions, one for each requested device ID.""" + infer_funcs = [] + for device_id in device_ids: + if model_name == "sensevoice": + infer_funcs.append(_ASR_Server(device_id=device_id)) + else: + infer_funcs.append(_Token2Wav_ASR(device_id=device_id)) + return infer_funcs + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--max-batch-size", + type=int, + default=32, + help="Batch size of request.", + required=False, + ) + parser.add_argument( + "--verbose", + action="store_true", + default=False, + ) + parser.add_argument( + "--number-of-instances-per-device", + type=int, + default=1, + help="Number of model instances to load.", + required=False, + ) + parser.add_argument( + "--number-of-devices", + type=int, + default=8, + help="Number of devices to use.", + ) + parser.add_argument( + "--model-name", + type=str, + default="token2wav_asr", + choices=["token2wav_asr", "sensevoice"], + help="Model name.", + ) + + args = parser.parse_args() + + log_level = logging.DEBUG if args.verbose else logging.INFO + logging.basicConfig(level=log_level, format="%(asctime)s - %(levelname)s - %(name)s: %(message)s") + + triton_config = TritonConfig( + http_port=8000, + grpc_port=8001, + metrics_port=8002, + ) + + device_ids = [i for i in range(args.number_of_devices)] + device_ids = device_ids * args.number_of_instances_per_device + + with Triton(config=triton_config) as triton: + logger.info("Loading SenseVoice model on device ids: %s", device_ids) + if args.model_name == "sensevoice": + triton.bind( + model_name="sensevoice", + infer_func=_infer_function_factory(device_ids, args.model_name), + inputs=[ + Tensor(name="WAV", dtype=np.float32, shape=(-1,)), + Tensor(name="WAV_LENS", dtype=np.int32, shape=(-1,)), + Tensor(name="LANGUAGE", dtype=np.int32, shape=(-1,)), + Tensor(name="TEXT_NORM", dtype=np.int32, shape=(-1,)), + ], + outputs=[ + Tensor(name="TRANSCRIPTS", dtype=bytes, shape=(-1,)), + ], + config=ModelConfig( + max_batch_size=args.max_batch_size, + batcher=DynamicBatcher(max_queue_delay_microseconds=10000), # 10ms + ), + strict=True, + ) + else: + triton.bind( + model_name="token2wav_asr", + infer_func=_infer_function_factory(device_ids, args.model_name), + inputs=[ + Tensor(name="TOKENS", dtype=np.int32, shape=(-1,)), + Tensor(name="TOKEN_LENS", dtype=np.int32, shape=(-1,)), + Tensor(name="GT_TEXT", dtype=bytes, shape=(-1,)), + ], + outputs=[ + Tensor(name="REWARDS", dtype=np.float32, shape=(-1,)), + Tensor(name="TRANSCRIPTS", dtype=bytes, shape=(-1,)), + ], + config=ModelConfig( + max_batch_size=args.max_batch_size, + batcher=DynamicBatcher(max_queue_delay_microseconds=10000), # 10ms + ), + strict=True, + ) + logger.info("Serving inference") + triton.serve() + + +if __name__ == "__main__": + main()