zsy814's picture
Initial EchoLoc code release
d8bfe4a verified
Raw
History Blame Contribute Delete
9.46 kB
# with open('/workspace/echoloc/codes/tts_outputs/susc/persona/cosyvoice2/celsds_full_fixlr1e5_best/info.tsv', 'r', errors='replace') as f: # 使用二进制模式读取文件
# for line in f.readlines():
# print(line)
# from funasr import AutoModel
# model = AutoModel(model="/workspace/echoloc/modelscope/iic/speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/")
# est_txt = model.generate(input=r"/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/zero-shot-ref.wav",
# batch_size_s=300,
# hotword='魔搭', disable_pbar=True)[0]
# """
# {'key': 'zero-shot-ref', 'text': '笔 记 它 只 是 一 个 工 具 就 是 最 终 的 目 的 是 吸 收 这 些 知 识', 'timestamp': [[190, 270], [270, 450], [450, 590], [590, 690], [690, 810], [810, 890], [890, 970], [970, 1150], [1150, 1390], [1410, 1570], [1570, 1810], [1890, 2030], [2030, 2210], [2210, 2370], [2370, 2510], [2510, 2750], [2750, 2970], [2970, 3150], [3150, 3390], [3410, 3510], [3510, 3710], [3710, 3930], [3930, 4105]]}
# """
# print(est_txt)
# import csv
# src_audio_paths = [
# "/workspace/echoloc/dataset/EMOGEN/test_prompt/gens/context_en/tp/temp_signal/2_0.wav",
# "/workspace/echoloc/dataset/EMOGEN/test_prompt/gens/context_en/tp/temp_signal/2_1.wav",
# "/workspace/echoloc/dataset/EMOGEN/test_prompt/gens/context_en/tp/temp_signal/2_2.wav"
# ]
# tgt_audio_paths = [
# "/workspace/echoloc/dataset/EMOGEN/test_prompt/gens/context_en/tp/temp_signal/1_0.wav",
# "/workspace/echoloc/dataset/EMOGEN/test_prompt/gens/context_en/tp/temp_signal/1_1.wav",
# "/workspace/echoloc/dataset/EMOGEN/test_prompt/gens/context_en/tp/temp_signal/1_2.wav"
# ]
# output_tsv_path = "/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/infer/evaluate/auto_pcp.tsv"
# # 写入 TSV 文件
# with open(output_tsv_path, mode="w", newline="", encoding="utf-8") as f:
# writer = csv.writer(f, delimiter="\t")
# writer.writerow(["src_audio", "tgt_audio"]) # 写入表头
# for src, tgt in zip(src_audio_paths, tgt_audio_paths):
# writer.writerow([src, tgt])
# import librosa
# import numpy as np
# import numpy.polynomial.polynomial as poly
# import onnxruntime as ort
# import soundfile as sf
# from requests import session
# from tqdm import tqdm
# p808_onnx_sess = ort.InferenceSession(r"/workspace/echoloc/codes/fairseq_ecvc/examples/reconstruct_dhubert/evaluate/ecvc/model_v8.onnx", providers=["CUDAExecutionProvider"])
# import torch
# torch.backends.cudnn.allow_tf32 = True
# torch.backends.cuda.matmul.allow_tf32 = True
# import whisperx
# import gc
# from jiwer import wer
# import torchaudio
# device = "cuda"
# audio_file = "/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/1_0.wav"
# batch_size = 16 # reduce if low on GPU mem
# compute_type = "float16" # change to "int8" if low on GPU mem (may reduce accuracy)
# def load_wav(wav, target_sr):
# speech, sample_rate = torchaudio.load(wav)
# speech = speech.mean(dim=0, keepdim=True)
# if sample_rate != target_sr:
# assert sample_rate > target_sr, 'wav sample rate {} must be greater than {}'.format(sample_rate, target_sr)
# speech = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=target_sr)(speech)
# return speech
# def wer_and_align(refs, inp_path,
# asr_model, align_model, metadata, batch_size=1):
# """
# 根据 refs 内容,从 ASR 输出中找出 WER 最匹配片段(不重叠)并返回时间戳和片段音频。
# """
# inp_wav = load_wav(inp_path, target_sr=16000)[0].numpy()
# result = asr_model.transcribe(inp_wav, batch_size=batch_size)
# result = whisperx.align(result["segments"], align_model, metadata, inp_wav, device, return_char_alignments=False)["segments"]
# # 展开所有 word
# result_words = []
# for seg in result:
# result_words.extend(seg["words"])
# words = [w["word"] for w in result_words]
# used_range = [False] * len(words)
# results = []
# segments = []
# inp_wav_np = inp_wav.flatten()
# for ref in refs:
# ref_words = ref.strip().split()
# ref_len = len(ref_words)
# best_score = float("inf")
# best_start = -1
# best_end = -1
# best_text = ""
# for start in range(len(words)):
# for end in range(start + 1, min(len(words) + 1, start + ref_len + 10)):
# if any(used_range[start:end]):
# continue
# hyp_words = [result_words[i]["word"] for i in range(start, end)]
# score = wer(" ".join(ref_words), " ".join(hyp_words))
# if score < best_score:
# best_score = score
# best_start = start
# best_end = end
# best_text = " ".join(hyp_words)
# if best_start != -1:
# for i in range(best_start, best_end):
# used_range[i] = True
# start_time = result_words[best_start]["start"]
# end_time = result_words[best_end - 1]["end"]
# results.append({
# "ref": ref,
# "match": best_text,
# "start_time": start_time,
# "end_time": end_time,
# "wer_score": best_score
# })
# segments.append(
# inp_wav_np[int(start_time * 16000): int(end_time * 16000)]
# )
# # 用于整体评估
# est_txt = " ".join(words)
# cer_score = wer(" ".join(refs), est_txt)
# return results, segments, cer_score, inp_wav_np
# # 1. Transcribe with original whisper (batched)
# model = whisperx.load_model("large-v2", device, compute_type=compute_type)
# # 2. Align whisper output
# model_a, metadata = whisperx.load_align_model(language_code="en", device=device)
# refs = ["That joke really , didn't it?", "Let's try something something different, shall we?"]
# results, segments, cer_score, inp_wav_np = wer_and_align(
# refs, audio_file, model, model_a, metadata, batch_size=1
# )
# print(results)
# import pathlib
# import csv
# from collections import defaultdict
# import numpy as np
# input_file=r"/workspace/echoloc/dataset/EMOGEN/test_prompt/gens/context_zh/tp/eval4autopcp.tsv"
# input_file = pathlib.Path(input_file).resolve()
# input_flag_file = input_file.parent / "eval4autopcp_flag.tsv"
# output_file = input_file.parent / "output.txt"
# with open(input_file, mode="r", encoding="utf-8") as f:
# with open(input_flag_file, mode="r", encoding="utf-8") as flag_f:
# flags = [line for line in flag_f.readlines() if len(line)>2]
# print(len(flags))
# reader = csv.DictReader(f, delimiter="\t")
# # 1. 创建一个 flag -> scores 列表的映射
# flag2scores = defaultdict(list)
# for idx, flag in enumerate(flags):
# flag2scores[flag].append(2.0)
# # 2. 对每个 flag 求平均
# flag2mean = {flag: np.mean(slist) for flag, slist in flag2scores.items()}
# seen = set()
# deduped_flags = []
# for flag in flags:
# if flag not in seen:
# deduped_flags.append(flag)
# seen.add(flag)
# print(f"去重后flags数量: {len(deduped_flags)}")
# # 构建最终 merged_scores
# merged_scores = [flag2mean[flag] for flag in deduped_flags]
# print(len(merged_scores))
import os
import librosa
import soundfile as sf
from audiotsm import wsola
from audiotsm.io.wav import WavReader, WavWriter
import subprocess
def ensure_wav_mono_sr(input_path, output_path, target_sr=22050):
y, sr = librosa.load(input_path, sr=target_sr, mono=True)
sf.write(output_path, y, target_sr)
return output_path
def run_wsola(input_path, output_path, speed):
with WavReader(input_path) as reader:
with WavWriter(output_path, reader.channels, reader.samplerate) as writer:
tsm = wsola(reader.channels, speed=speed)
tsm.run(reader, writer)
def run_phase_vocoder(input_path, output_path, speed):
y, sr = librosa.load(input_path, sr=None)
y_stretch = librosa.effects.time_stretch(y, rate=speed)
sf.write(output_path, y_stretch, sr)
def run_sox(input_path, output_path, speed):
tempo = str(speed)
subprocess.run(["sox", input_path, output_path, "tempo", tempo], check=True)
def test_all_methods(input_wav, speed):
clean_input = "/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/temp.wav"
ensure_wav_mono_sr(input_wav, clean_input)
run_wsola(clean_input, f"/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/output_wsola_{speed}x.wav", speed)
run_phase_vocoder(clean_input, f"/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/output_phase_{speed}x.wav", speed)
run_sox(clean_input, f"/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/output_sox_{speed}x.wav", speed)
print(f"✅ All methods processed for speed: {speed}x")
# 🧪 举例测试
if __name__ == "__main__":
test_all_methods("/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/zero-shot-ref.wav", 0.5) # 变慢
test_all_methods("/workspace/echoloc/codes/fairseq_ecvc/examples/celsds/temp_outputs/zero-shot-ref.wav", 2.0) # 变快