SongPrep / run_vllm.py
root
change to song prep
de9e682
Raw
History Blame Contribute Delete
3.74 kB
import os
import argparse
import torch
import torchaudio
from tqdm import tqdm
from vllm.v1.engine.processor import Processor
from vllm.engine.llm_engine import LLMEngine
# Bypass checkout
Processor._validate_model_input = lambda *args, **kwargs: None
LLMEngine._validate_token_prompt = lambda *args, **kwargs: None
from vllm import __version__ as vllm_version
from vllm import LLM, SamplingParams
from megatron.tokenizer import build_tokenizer
from mucodec.generate_1rvq import Tango
class Args:
def __init__(self):
pass
class vllmInf:
def __init__(self, model_path, vocal_file, tokenizer="Qwen2Tokenizer", extra_vocab_size=16384):
args = Args()
args.vocab_file = vocal_file
args.load = model_path
args.extra_vocab_size = extra_vocab_size
args.patch_tokenizer_type = tokenizer
self.tokenizer = build_tokenizer(args)
self.text_offset = len(self.tokenizer.tokenizer.get_vocab())
self.max_tokens = 8192
self.llm = LLM(
model=model_path,
trust_remote_code=True,
max_model_len=self.max_tokens,
dtype="bfloat16",
)
def run(self, audios: list[list[int]]):
batch_token_ids = []
max_tokens = self.max_tokens
for audio in audios:
audio = audio + self.text_offset
sentence_ids = [self.tokenizer.sep_token_id] + audio.tolist() + [self.tokenizer.tokenizer.sep_token_id]
max_tokens = min(max_tokens, self.max_tokens - len(sentence_ids))
batch_token_ids.append(sentence_ids)
sampling_params = SamplingParams(
n=1,
max_tokens=max_tokens,
top_p=0.1,
temperature=0.1
)
if vllm_version == "0.8.5":
outputs = self.llm.generate(
prompt_token_ids=batch_token_ids,
sampling_params=sampling_params
)
else:
inputs = [
{"prompt_token_ids": token_ids}
for token_ids in batch_token_ids
]
outputs = self.llm.generate(
prompts=inputs,
sampling_params=sampling_params
)
lyrics = []
for output in outputs:
generate_ids = output.outputs[0].token_ids
lyrics.append(self.tokenizer.detokenize(generate_ids))
return lyrics
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='')
parser.add_argument("-i", dest="input_dir")
parser.add_argument("-q", dest="qwen_ckpt", default="SongPrep-7B/")
parser.add_argument("-c", dest="codec_ckpt", default="SongPrep-7B/mucodec.safetensors")
args = parser.parse_args()
vocal_file = "conf/vocab_type.yaml"
qwen_path = args.qwen_ckpt
codec_path = args.codec_ckpt
input_dir = args.input_dir
# codec
input_audio_paths = []
input_audios = []
tango = Tango(model_path=codec_path)
for audio_path in tqdm(os.listdir(input_dir)):
if not audio_path.endswith(".wav"):
continue
src_wave, fs = torchaudio.load(os.path.join(input_dir, audio_path))
if (fs != 48000):
src_wave = torchaudio.functional.resample(src_wave, fs, 48000)
code = tango.sound2code(src_wave)
input_audios.append(code[0][0].cpu().numpy())
input_audio_paths.append(audio_path)
del tango
torch.cuda.empty_cache()
# batch transcription
vllm_inf = vllmInf(qwen_path, vocal_file)
lyrics = vllm_inf.run(input_audios)
# display
for audio_path, lyric in zip(input_audio_paths, lyrics):
print(f"====={audio_path}=====")
print(lyric)
print("\n")