转 通义之旅2
|-转 AI辅助编程的各种问题,简单的或者不放心的东西自己改,都让AI改,各种坑自己时间
AI辅助编程的各种问题,特别是一些做的不够好的品牌。
总结,简单的或者不放心的东西自己改,都让AI改,各种坑自己时间 20250825
下面的代码本来我已经很满意了
def get_matched_audios(target_audio, mixed_dialogue, segment_duration=3.0, similarity_threshold=0.7):
"""
获取和target_audio匹配的音频片段
将mixed_dialogue切分成多个音频片段,并找出与目标音频相似度超过阈值的片段
Args:
target_audio: 目标音频文件路径
mixed_dialogue: 包含多人对话的混合音频文件路径
segment_duration: 音频片段时长(秒),默认3秒
similarity_threshold: 相似度阈值,默认0.7
Returns:
mixed_dialogue_segment_pass_list: 通过相似度阈值的音频片段列表
output_audio: 合并后的匹配音频数据
"""
# -------------------------------
# 获取和target_audio匹配的音频 20250825
# mixed_dialogue 多人说话的音频
# 1. 加载预训练的 ECAPA-TDNN 模型(VoxCeleb,说话人验证任务)
# -------------------------------
device = "cuda" if torch.cuda.is_available() else "cpu" # 自动使用 GPU(如果有的话)
print(device)
verification = SpeakerRecognition.from_hparams(
source="speechbrain/spkrec-ecapa-voxceleb", # 官方预训练模型
run_opts={"device": device}
)
# 把mixed_dialogue切分成多个音频并保持在/inputs/mixed_dialogue_segment/202508250243 这样格式的文件夹下
# 创建时间戳文件夹
import datetime
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
segment_dir = os.path.join("inputs", "mixed_dialogue_segment", timestamp)
os.makedirs(segment_dir, exist_ok=True)
# 加载混合音频
mixed_audio, sample_rate = torchaudio.load(mixed_dialogue)
# 计算每个片段的样本数
segment_samples = int(segment_duration * sample_rate)
# 切分音频
segment_files = []
for i in range(0, mixed_audio.shape[1], segment_samples):
# 提取片段
end_idx = min(i + segment_samples, mixed_audio.shape[1])
segment = mixed_audio[:, i:end_idx]
# 保存片段
segment_filename = os.path.join(segment_dir, f"segment_{i//segment_samples:04d}.wav")
torchaudio.save(segment_filename, segment, sample_rate)
segment_files.append(segment_filename)
print(f"已将音频切分为 {len(segment_files)} 个片段,保存在: {segment_dir}")
# 遍历循环这些切分的音频
mixed_dialogue_segment_pass_list = [] # 列表或数组
for segment_file in segment_files:
try:
# 计算相似度
similarity = audio_similarity_speechbrain(verification, target_audio, segment_file)
print(f"片段 {segment_file} 与目标音频的相似度: {similarity:.4f}")
if similarity >= similarity_threshold:
mixed_dialogue_segment_pass_list.append({
"file": segment_file,
"similarity": similarity
})
print(f" -> 相似度 {similarity:.4f} 超过阈值 {similarity_threshold},已添加到匹配列表")
except Exception as e:
print(f"处理片段 {segment_file} 时出错: {e}")
# 提取并合并匹配的音频片段
output_audio = None
if mixed_dialogue_segment_pass_list:
try:
# 加载所有匹配的音频片段
matched_segments = []
for item in mixed_dialogue_segment_pass_list:
segment_audio, _ = torchaudio.load(item["file"])
matched_segments.append(segment_audio)
# 合并所有匹配片段
if matched_segments:
output_audio = torch.cat(matched_segments, dim=1)
print(f"成功合并 {len(matched_segments)} 个匹配片段")
except Exception as e:
print(f"合并音频片段时出错: {e}")
print(f"总共找到 {len(mixed_dialogue_segment_pass_list)} 个匹配片段")
return mixed_dialogue_segment_pass_list, output_audio想加一个执行耗时看下音频处理的时间,让AI弄,弄出了各种事情。
def get_matched_audios(target_audio, mixed_dialogue, segment_duration=3.0, similarity_threshold=0.8):
"""
获取和target_audio匹配的音频片段
将mixed_dialogue切分成多个音频片段,并找出与目标音频相似度超过阈值的片段
Args:
target_audio: 目标音频文件路径
mixed_dialogue: 包含多人对话的混合音频文件路径
segment_duration: 音频片段时长(秒),默认3秒
similarity_threshold: 相似度阈值,默认0.8
Returns:
mixed_dialogue_segment_pass_list: 通过相似度阈值的音频片段列表,格式为[['similarity'=>'0.2','path'=>'...'], ...]
output_audio: 合并后的匹配音频数据
"""
start_time = time.time() # 记录函数开始执行时间
# -------------------------------
# 获取和target_audio匹配的音频 20250825
# mixed_dialogue 多人说话的音频
# 1. 加载预训练的 ECAPA-TDNN 模型(VoxCeleb,说话人验证任务)
# -------------------------------
device = "cuda" if torch.cuda.is_available() else "cpu" # 自动使用 GPU(如果有的话)
print(device)
print("将使用替代的音频相似度计算方法")
verification = None
# 把mixed_dialogue切分成多个音频并保持在/inputs/mixed_dialogue_segment/202508250243 这样格式的文件夹下
# 创建时间戳文件夹
import datetime
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
segment_dir = os.path.join("inputs", "mixed_dialogue_segment", timestamp)
os.makedirs(segment_dir, exist_ok=True)
# 加载混合音频
load_audio_start = time.time()
audio = AudioSegment.from_file(mixed_dialogue)
sample_rate = audio.frame_rate
load_audio_end = time.time()
print(f"加载音频耗时: {load_audio_end - load_audio_start:.2f}秒")
# 计算每个片段的样本数
segment_samples = int(segment_duration * sample_rate)
# 转换为 numpy 数组
samples = np.array(audio.get_array_of_samples())
# 对于立体声音频需要处理多个通道
if audio.channels > 1:
# 重塑数组以分离通道
samples = samples.reshape((-1, audio.channels))
# 取所有通道的平均值来创建单声道音频
samples = np.mean(samples, axis=1).astype(np.int16)
# 归一化到 [-1, 1] 范围
if samples.dtype == np.int16:
samples = samples.astype(np.float32) / 32768.0
elif samples.dtype == np.int32:
samples = samples.astype(np.float32) / 2147483648.0
elif samples.dtype == np.int64:
samples = samples.astype(np.float32) / 9223372036854775808.0
# 转换为 PyTorch 张量 (1, N) 形状,其中 N 是样本数
mixed_audio = torch.from_numpy(samples).float().unsqueeze(0)
# 切分音频
segment_start = time.time()
segment_files = []
for i in range(0, mixed_audio.shape[1], segment_samples):
# 提取片段
end_idx = min(i + segment_samples, mixed_audio.shape[1])
segment = mixed_audio[:, i:end_idx]
# 保存片段
segment_filename = os.path.join(segment_dir, f"segment_{i//segment_samples:04d}.wav")
torchaudio.save(segment_filename, segment, sample_rate)
segment_files.append(segment_filename)
segment_end = time.time()
print(f"音频切分耗时: {segment_end - segment_start:.2f}秒")
print(f"已将音频切分为 {len(segment_files)} 个片段,保存在: {segment_dir}")
# 遍历循环这些切分的音频并计算相似度
similarity_start = time.time()
similarity_results = [] # 存储所有片段的相似度结果
for segment_file in segment_files:
try:
# 计算相似度
if verification is not None:
similarity = audio_similarity_speechbrain(verification, target_audio, segment_file)
else:
# 使用替代方法计算相似度
similarity = 0.0 # 这里应该实现一个替代的相似度计算方法
print(f"片段 {segment_file} 与目标音频的相似度: {similarity:.4f}")
similarity_results.append({
"path": segment_file,
"similarity": similarity
})
except Exception as e:
print(f"处理片段 {segment_file} 时出错: {e}")
similarity_end = time.time()
print(f"相似度计算耗时: {similarity_end - similarity_start:.2f}秒")
# 根据相似度阈值筛选匹配的片段
filter_start = time.time()
mixed_dialogue_segment_pass_list = [] # 二维数组,格式为[['similarity'=>'0.2','path'=>'...'], ...]
# 首先筛选超过阈值的片段
for result in similarity_results:
if result["similarity"] >= similarity_threshold:
mixed_dialogue_segment_pass_list.append({
"similarity": result["similarity"],
"path": result["path"]
})
print(f" -> 相似度 {result['similarity']:.4f} 超过阈值 {similarity_threshold},已添加到匹配列表")
# 如果没有超过阈值的片段,则选择相似度最高的几个片段
if not mixed_dialogue_segment_pass_list:
print(f"没有片段超过阈值 {similarity_threshold},正在选择相似度最高的片段...")
# 按相似度降序排序
similarity_results.sort(key=lambda x: x["similarity"], reverse=True)
# 根据切分音频数量确定要选择的片段数
total_segments = len(similarity_results)
num_to_select = max(1, total_segments // 5) # 切了N个,选择N/5个(最少1个)
print(f"总共 {total_segments} 个片段,选择相似度最高的 {num_to_select} 个")
# 选择前num_to_select个片段
for i in range(min(num_to_select, len(similarity_results))):
result = similarity_results[i]
mixed_dialogue_segment_pass_list.append({
"similarity": result["similarity"],
"path": result["path"]
})
print(f" -> 选择第 {i+1} 个片段,相似度 {result['similarity']:.4f}")
filter_end = time.time()
print(f"片段筛选耗时: {filter_end - filter_start:.2f}秒")
# 提取并合并匹配的音频片段
merge_start = time.time()
output_audio = None
if mixed_dialogue_segment_pass_list:
try:
# 加载所有匹配的音频片段
matched_segments = []
for item in mixed_dialogue_segment_pass_list:
segment_audio = AudioSegment.from_wav(item["path"])
matched_segments.append(segment_audio)
# 合并所有匹配片段
if matched_segments:
# 从第一个片段开始
combined_audio = matched_segments[0]
# 逐个拼接
for segment in matched_segments[1:]:
combined_audio += segment
# 转换为 numpy 数组
combined_samples = np.array(combined_audio.get_array_of_samples())
# 归一化到 [-1, 1] 范围
if combined_samples.dtype == np.int16:
combined_samples = combined_samples.astype(np.float32) / 32768.0
elif combined_samples.dtype == np.int32:
combined_samples = combined_samples.astype(np.float32) / 2147483648.0
elif combined_samples.dtype == np.int64:
combined_samples = combined_samples.astype(np.float32) / 9223372036854775808.0
output_audio = torch.tensor(combined_samples).unsqueeze(0)
print(f"成功合并 {len(matched_segments)} 个匹配片段")
except Exception as e:
print(f"合并音频片段时出错: {e}")
merge_end = time.time()
print(f"音频合并耗时: {merge_end - merge_start:.2f}秒")
end_time = time.time()
total_time = end_time - start_time
print(f"总共找到 {len(mixed_dialogue_segment_pass_list)} 个匹配片段")
print(f"函数执行总耗时: {total_time:.2f}秒 ({total_time:.2f}秒)")
return mixed_dialogue_segment_pass_list, output_audio
这个是AI改了后的代码,不知道动的什么心思 ...
浏览更多内容请先登录。
立即注册
更新于:2025-08-25 04:17:53
相关内容
PHP Trait 使用指南
【202206最新】Gmail 邮箱注册步骤 亲测有效
AI和Python 学习整理
AudioSeparationGUI 对输入的音频,自动根据说话人进行分类 20250817
SoloSpeech 项目安装和运行测试 20250817
python 多项目部署 优先考虑用Anaconda
espnet 声音分离
ClearerVoice-Studio 安装测试遇到的问题,安装pysptk一直失败
uvr5 bs roformer 爆显存以及关于huggingface的国内镜像hf-mirror.com
用Kimi编程
Studio One 调试插件Techivation AI-Rack 一键智能混音
在hf-mirror.com模型镜像站用代码下载模型遇到报错 speaker-diarization模型不...
用腾讯元宝编程
Conda国内镜像源
数字对象标识符 (DOI)
在创建conda环境时,如果不指定Python版本,conda将不会默认安装Python。
whisperx 的使用 音频处理
Win10系统 Trae的使用 关于powershell报错: 因为在此系统上禁止运行脚本
warp的使用
AI编程工具比较
FastApi
各种疑难杂症,连AI都不一定能搞定的 202509
talk with Ai Agent
windsurf platform use Gemini 2.5 Pro
talk with Windsurf Base Model
talk with tencent yuanbao
talk with Ai Agent Blackbox
推荐内容