语音分离:使用短时能量提取主声源

语音分离模型:mossfomer2

  • 计算短时能量
def compute_short_time_energy(audio: np.ndarray, frame_size: int, hop_size: int) -> np.ndarray:"""计算音频信号的短时能量+ 将音频分为若干帧,每一帧长度为 frame_size, 帧与帧之间以 hop_size 的步长滑动。+ 每一帧的能量定义为该帧所有采样点的平方和。Args:audio (array): 1D音频序列frame_size (int): 帧长: 多少秒内的采样点数hop_size (int): 帧移: 多少秒内的采样点数Returns:array: 能量数组,每个元素对应一帧的能量"""num_frames = int(np.ceil((len(audio) - frame_size) / hop_size)) + 1energy = np.zeros(num_frames)for i in range(num_frames):start = i * hop_sizeend = min(start + frame_size, len(audio))frame = audio[start:end]energy[i] = np.sum(frame ** 2)return energy
  • 主声源提取
def segment_audio(audio, sr, energy, threshold):"""利用短时能量定位音频中的主声源区域Args:audio (array): 1D音频序列sr (int): 采样率energy (array): 每帧的短时能量数组threshold (float): 能量阈值,低于该值认为振幅较低Returns:list: 列表,每个元组包含 (开始时间, 结束时间, 主声源片段, 短时能量值)"""segments = []acc_energy = []in_segment = Falsestart_frame = Nonelast_active_frame = None# 遍历每一帧能量,检测连续区域for i, e in enumerate(energy):if e >= threshold:# 当前帧能量达到阈值,若尚未进入段则记录起始帧if not in_segment:in_segment = Truestart_frame = ilast_active_frame = i  # 更新最后一次达到阈值的帧acc_energy.append(e)else:# 当前帧能量低于阈值且之前处于主声源区域,完成一次分段if in_segment:start_sample = start_frame * hop_size# 以最后一次能量达到阈值的帧末尾作为结束位置end_sample = min(last_active_frame * hop_size + frame_size, len(audio))segments.append((start_sample / sr, end_sample / sr, audio[start_sample:end_sample], np.mean(acc_energy)))in_segment = Falsestart_frame = Nonelast_active_frame = None# 若音频结束时仍在主声源区域,则补全该段if in_segment:start_sample = start_frame * hop_sizeend_sample = len(audio)segments.append((start_sample / sr, end_sample / sr, audio[start_sample:end_sample]))return segmentsdef save_segments(segments, sr, output_dir="segments"):"""保存检测到的主声源片段为独立的音频文件,并合并保存所有片段Args:segments (list): 分段结果列表,每个元组为 (开始时间, 结束时间, 主声源片段)sr (int): 采样率output_dir (str, optional): 保存的目录(默认保存到 "segments" 文件夹)"""if not os.path.exists(output_dir):os.makedirs(output_dir)merged_audio_list = [seg[-2] for seg in segments]# 合并所有片段并保存为一个文件if merged_audio_list:merged_audio = np.concatenate(merged_audio_list)merged_file = os.path.join(output_dir, "merged_segments.wav")sf.write(merged_file, merged_audio, sr)print(f"已保存合并文件:{merged_file}")
 # audio_file = "/home/wangguisen/projects/voice_separation/output/单轨音频/普通单轨音频_5_spk0.wav"audio_file = "/home/wangguisen/projects/voice_separation/2-.wav"audio, sr = sf.read(audio_file)# 参数设置:例如帧长20ms,帧移10msframe_size = int(0.02 * sr)  # 20ms 对应的采样点数hop_size = int(0.01 * sr)    # 10ms 对应的采样点数print("[DEBUG] frame_size: ", frame_size)print("[DEBUG] hop_size: ", hop_size)# 设置能量阈值(根据实际情况调整),低于此值认为振幅较低threshold = 0.001# 计算短时能量energy = compute_short_time_energy(audio, frame_size, hop_size)# 利用短时能量分段定位主声源segments = segment_audio(audio, sr, energy, threshold)# 输出检测到的主声源区间print("检测到的主声源区间:")for seg in segments:start, end, _, e = segprint(f"开始时间: {start:.3f} s, 结束时间: {end:.3f} s, 短时能量值: {e: .3f}")# 保存每段主声源到独立文件,并合并保存所有片段save_segments(segments, sr, output_dir="segments")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VUE】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期:就是…

SyntaxError: Unexpected keyword ‘else‘

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

Spring Boot静态资源访问顺序

在 Spring Boot 中,static 和 public 目录都用于存放静态资源(如 HTML、CSS、JavaScript、图片等文件),但它们在使用上有一些细微的区别。以下是它们的详细对比: 1. 默认优先级 Spring Boot 会按照以下优先级加载静态…

windows 平台如何点击网页上的url ,会打开远程桌面连接服务器

你可以使用自定义协议方案(Protocol Scheme)实现网页上点击URL后自动启动远程桌面连接(mstsc),参考你提供的C代码思路,如下实现: 第一步:注册自定义协议 使用类似openmstsc://协议…

UniApp 运行的微信小程序如何进行深度优化

UniApp 运行的微信小程序如何进行深度优化 目录 引言性能优化 1. 减少包体积2. 优化页面加载速度3. 减少 setData 调用4. 使用分包加载 代码优化 1. 减少不必要的代码2. 使用条件编译3. 优化图片资源 用户体验优化 1. 优化交互体验2. 预加载数据3. 使用骨架屏 调试与监控 1. …

ESP32S3N16R8驱动ST7701S屏幕(vscode+PlatfoemIO)

1.开发板配置 本人开发板使用ESP32S3-wroom1-n16r8最小系统板 由于基于vscode与PlatformIO框架开发,无espidf框架,因此无法直接烧录程序,配置开发板参数如下: 在platformio.ini文件中,配置使用esp32-s3-devkitc-1开发…

ASP.NET 微服务网关 Ocelot+Consul+Skywalking

ASP.NET 微服务网关 OcelotConsulSkywalking APIGateWaySample简介网关相关技术核心其它 请求处理流程环境搭建代码运行效果图 APIGateWaySample Ocelot Consul Skywalking 简介 系统设计图 网关 API网关(Gateway)是一个服务器,是系统…

频谱分析仪的使用

频谱分析仪设置带宽的方式: 可以利用同轴线缆来制作近场探头: 区别dB和dBm两个单位: 无线电波的发射功率是指在给定频段范围内的能量,通常有两种衡量 或测量标准:   1、功率(W):相…

【数据分析】转录组基因表达的KEGG通路富集分析教程

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍差异分析(limma)KEGG富集分析(enrichKEGG)可视化加载R包数据下载导入数据基因差异分析火山图KEGG通路富集分析可视化通路结果另一个案例总结系统信息参考介绍 KEGG富集分析,可…

关于sqlalchemy的使用

关于sqlalchemy的使用 说明一、sqlachemy总体使用思路二、安装与创建库、连结库三、创建表、增加数据四、查询记录五、更新或删除六、关联表定义 说明 本教程所需软件及库python3.10、sqlalchemy安装与创建库、连结库创建表、增加数据查询记录 一、sqlachemy总体使用思路 在…

在 IntelliJ IDEA 中使用 JUnit 进行单元测试

1. 介绍 JUnit JUnit 是 Java 语言中最流行的单元测试框架之一。它基于 xUnit 设计模式,支持 测试自动化、断言(Assertions)和测试生命周期管理,是 Java 开发中进行 TDD(测试驱动开发) 的重要工具。 JUni…

单片机的发展

一、引言 单片机自诞生以来,经历了四十多年的风风雨雨,从最初的工业控制逐步扩展到家电、通信、智能家居等各个领域。其发展过程就像是一场精彩的冒险,每一次技术的革新都像是在未知的海域中开辟新的航线。 二、单片机的发展历程 &#xff…

常见的博弈模型有哪些

常见的博弈模型有哪些 目录 常见的博弈模型有哪些**1. 重复博弈(Repeated Game)****2. 进化博弈论(Evolutionary Game Theory)****3. 机制设计(Mechanism Design)****4. 微分博弈(Differential Game)****5. 贝叶斯博弈(Bayesian Game)****6. 合作博弈(Cooperative G…

【MySQL-数据类型】数据类型分类+数值类型+文本、二进制类型+String类型

一、数据类型分类 二、数值类型 1.bit类型 测试环境ubuntu 基本语法: bit[(M)]:位字段类型,M表示每个值的位数,范围从1~64;如果M被忽略,默认为1举例: create table testBit(id i…

golang从入门到做牛马:第一篇-我与golang的缘分,go语言简介

还记得2018年的夏天,刚毕业的我不知道该做些什么,于是自学了一周的go语言,想要找一份go语言工作的代码,当时的go还没有go mod来管理依赖包,在北京找了一个月的工作,找到了一个小公司做了后端开发,当然使用go语言开发,带着兴奋劲,年轻身体也好,边努力学习,边工作。 时…

【数据库】MySQL常见聚合查询详解

在数据库操作中,聚合查询是非常重要的一部分。通过聚合查询,我们可以对数据进行汇总、统计和分析。MySQL提供了丰富的聚合函数来满足不同的需求。本文将详细介绍MySQL中常见的40个聚合函数及其使用场景,并通过8个的案例展示它们的用法。 一、…

调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)

文章目录 调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)一、交互流程二、数据流程三、架构分类四、开源产品4.1 AutoCoder(知识库变体)4.2 FastGPT(…

【Vue CLI脚手架开发】——6.scoped样式

文章目录 一、scoped是什么二、应用案例1.使用代码2.原理3父组件App未添加scoped影响 一、scoped是什么 我们知道vue为了防止css样式污染&#xff0c;在每个组件中提供了 scoped属性进行限定css作用域&#xff1b;当<style>标签有 scoped 属性时&#xff0c;它的 CSS 只…

高精算法的用法及其优势

高精度问题是指当数据的位数非常大&#xff08;超出标准数据类型的范围&#xff09;时&#xff0c;如何进行计算和存储的问题。常见场景包括大整数的加、减、乘、除、取模等操作。以下是解决高精度问题的常用方法与技巧&#xff1a; 一、数据存储 数组存储 用整型数组存储&am…

VM+CentOS虚拟机

关于VMCentOS虚拟机的配置和使用&#xff0c;可以参考以下博客中的详细教程&#xff1a; **一、VMCentOS虚拟机配置** 1. **虚拟机网络配置** - 在VMware中&#xff0c;点击“编辑”→“虚拟网络编辑器”&#xff0c;选择VMnet8并进行相关设置。 - 子网IP可以改成如192.168.1…