根据音频中的不同讲述人声音进行分离音频 | 基于ai的说话人声音分离项目

0.研究背景

在实际的开发中可能会遇到这样的问题,老板让你把音频中的每个讲话人的声音分离成不同的音频片段。你可以使用au等专业的音频处理软件手动分离。但是这样效率太慢了,现在ai这么发达,我们能否借助ai之力来分离一条音频中的不同的说话人呢?答案是肯定可以的。
这里将利用声纹识别加上语音识别来对音频中不同的说话人进行语者分离。

1.技术选择

市面上开源的声纹识别和语音识别项目有很多,比如funasr,cam++就是两个不错的选择,并且funasr是国内大厂阿里巴巴旗下开源的一个集成了ASR和标点符号预测,声纹识别,声纹对比等众多模型的一个工具框架。那么本次项目就是基于funasr进行编程开发的。

2.项目源码

项目已经开源到我的代码仓库中,大家可以访问https://github.com/lukeewin/AudioSeparationGUI
如果国内的小伙伴们不方便访问github那么也可以访问gitee,https://gitee.com/lukeewin/AudioSeparationGUI

3.项目功能

改项目支持对音频中每个说话人进行分离,不限制说话人数量,比如你的音频中存在10个说话人,也是可以进行分离的。
同时改项目还支持对分离后的音频,把相同的说话人讲的声音合并在一个音频文件中。
除了支持音频的分离外,该项目还支持分隔视频片段,通过声音驱动分隔视频,形成视频片段。

4.项目部分核心功能代码

这里这粘贴部分核心功能代码,如果需要看详细代码,可以到上面提到的代码仓库中下载。

def trans():if len(selected_file_list) != 0 and save_path.get() != '' and save_path.get() is not None:for audio in selected_file_list:if os.path.exists(audio):audio_name = os.path.splitext(os.path.basename(audio))[0]_, audio_extension = os.path.splitext(audio)show_info_label.config(text=f'正在执行中,请勿关闭程序。{audio}')speaker_audios = {}  # 每个说话人作为 key,value 为列表,列表中为当前说话人对应的每个音频片段# 音频预处理try:audio_bytes, _ = (ffmpeg.input(audio, threads=0, hwaccel='cuda').output("-", format="wav", acodec="pcm_s16le", ac=1, ar=16000).run(cmd=["ffmpeg", "-nostdin"], capture_stdout=True, capture_stderr=True))res = model.generate(input=audio_bytes, batch_size_s=300, is_final=True, sentence_timestamp=True)rec_result = res[0]asr_result_text = rec_result['text']if asr_result_text != '':sentences = []for sentence in rec_result["sentence_info"]:start = to_date(sentence["start"])end = to_date(sentence["end"])if sentences and sentence["spk"] == sentences[-1]["spk"]:sentences[-1]["text"] += "" + sentence["text"]sentences[-1]["end"] = endelse:sentences.append({"text": sentence["text"], "start": start, "end": end, "spk": sentence["spk"]})# 剪切音频或视频片段i = 0for stn in sentences:stn_txt = stn['text']start = stn['start']end = stn['end']# tmp_start = to_milliseconds(start)# tmp_end = to_milliseconds(end)# duration = round((tmp_end - tmp_start) / 1000, 3)spk = stn['spk']# 根据文件名和 spk 创建目录date = datetime.now().strftime("%Y-%m-%d")final_save_path = os.path.join(save_path.get(), date, audio_name, str(spk))os.makedirs(final_save_path, exist_ok=True)# 获取音视频后缀file_ext = os.path.splitext(audio)[-1]final_save_file = os.path.join(final_save_path, str(i)+file_ext)spk_txt_path = os.path.join(save_path.get(), date, audio_name)spk_txt_file = os.path.join(spk_txt_path, f'spk{spk}.txt')spk_txt_queue.put({'spk_txt_file': spk_txt_file, 'spk_txt': stn_txt, 'start': start, 'end': end})i += 1try:if file_ext in support_audio_format:(ffmpeg.input(audio, threads=0, ss=start, to=end, hwaccel='cuda').output(final_save_file).run(cmd=["ffmpeg", "-nostdin"], overwrite_output=True, capture_stdout=True,capture_stderr=True))elif file_ext in support_video_format:final_save_file = os.path.join(final_save_path, str(i)+'.mp4')(ffmpeg.input(audio, threads=0, ss=start, to=end, hwaccel='cuda').output(final_save_file, vcodec='libx264', crf=23, acodec='aac', ab='128k').run(cmd=["ffmpeg", "-nostdin"], overwrite_output=True, capture_stdout=True,capture_stderr=True))else:print(f'{audio}不支持')except ffmpeg.Error as e:print(f"剪切音频发生错误,错误信息:{e}")# 记录说话人和对应的音频片段,用于合并音频片段if spk not in speaker_audios:speaker_audios[spk] = []  # 列表中存储音频片段speaker_audios[spk].append({'file': final_save_file, 'audio_name': audio_name})ret = {"text": asr_result_text, "sentences": sentences}print(f'{audio} 切分完成')result_queue.put(f'{audio} 切分完成')show_info_label.config(text=f'{audio} 切分完成')print(f'转写结果:{ret}')# 存入合并队列audio_concat_queue.put(speaker_audios)else:print("没有转写结果")except Exception as e:print(f"转写异常:{e}")else:print("输入的文件不存在")messagebox.showinfo("提醒", "输入的文件不存在")else:print("没有填写输入输出")messagebox.showinfo("提醒", "没有填写选择文件或保存路径")

5.运行效果

在这里插入图片描述

6.其它

该项目使用Python开发,这里推荐Python版本为3.8,同时该项目中还依赖于ffmpeg,因此你需要提前安装好ffmpeg,并且配置好环境变量,这里需要注意,安装的路径中不要出现中文或者空格或者特殊字符。
如果你是小白,不懂如何运行这个项目,你也可以点击这里。

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

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

相关文章

一台服务器将docker image打包去另一天服务器安装这个镜像

一台服务器将docker image打到去另一天服务器安装这个镜像 1. 打包2.另一台服务器执行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一台服务器执行 docke…

STM32-心知天气项目

一、项目需求 使用 ESP8266 通过 HTTP 获取天气数据(心知天气),并显示在 OLED 屏幕上。 按键 1 :循环切换今天 / 明天 / 后天天气数据; 按键 2 :更新天气。 二、项目框图 三、cjson作用 https://gi…

自由学习记录(37)

课 对于这一方面,先把课都过一遍吧,尽量快的摸清楚底 软件工程 没有复杂的逻辑推理,概念性和理论很强,所以靠记 ------ 数据:是使程序能够适当处理信息的数据结构 程序:是能够完成预定功能和性能的可执行…

Docker仿真宇树狗GO1

1. 启动容器 docker run -it --rm humble_suo bash2. 安装Go1 的仿真包 apt update apt install -y git cmake build-essential git clone https://github.com/unitreerobotics/unitree_ros.git cd unitree_ros colcon build source install/setup.bash3. 启动仿真环境 ros2…

《游戏人工智能编程 案例精粹》阅读心得

最近读完了这本《游戏人工智能编程 案例精粹》,感觉获益匪浅,在对游戏人工智能的设计上有了更深的感悟。 这本书既适合初学者学习,因为次书会从最基础的数学物理公式推导一步一步介绍到完整的人工智能开发;同时也适合进阶程序员&a…

黑马点评_商品信息缓存模块

保证缓存不要有空档期 删除后马上要写入中间不能插入任何阶段(如查询数据库) 对于单体系统1,将缓存与数据库操作放在同一个事务中(当前项目就是一个单体项目,所以选择这种方式) 对于分布式系统2,利用TCC(Tr…

OnlyOffice:前端编辑器与后端API实现高效办公

OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…

面阵工业相机提高餐饮业生产效率

餐饮行业是一个快节奏、高要求的领域,该领域对生产过程中每一个阶段的效率和准确性都有很高的要求。在食品加工、包装、质量控制和库存管理等不同生产阶段实现生产效率的优化是取得成功的关键步骤。面阵工业相机能够一次性捕捉对象的二维区域图像,并支持…

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能

现场可以通过手机或者pad实时拍照上传到大屏幕的照片墙现场大屏电子照片墙功能,每个人都可以通过手机实时拍照上传到大屏幕上,同时还可以发布留言内容,屏幕上会同步滚动播放展示所有人的照片和留言。相比校传统的照片直播功能更加灵活方便,而…

【多线程】线程安全

目录 一、初识线程安全 什么是线程安全问题 理解线程不安全的原因 原因总结 二、解决线程不安全 加锁🔐 锁对象 synchronized几种使用方式 死锁🔏 死锁的三个场景 (1)一个线程针对一把锁连续加锁两次 (2)两个线程两把锁 (3)N个线程M个锁 如…

传统文旅+AI构建数字文旅新生态

传统文旅AI构建数字文旅新生态 前言: 当前许多旅游景区在旅游管理和旅游基础设施配套上都下足了功夫,在一定程度上也给旅客和消费者带来了舒适的体验感。但是针对于我们游客而言,似乎只有欣赏沿途风景、了解景区历史文化、拍照打卡和品尝特色…

VSCode - VSCode 切换自动换行

VSCode 自动换行 1、基本介绍 在 VSCode 中,启用自动换行可以让长行代码自动折行显示,避免水平滚动条频繁使用,提升代码阅读体验 如果禁用自动换行,长行代码就需要手动结合水平滚动条来阅读 2、演示 启用自动换行 禁用自动换…

解锁音频新境界:LALAL.AI 与 Audo Studio 深度解析

在音频处理的世界里,噪音常常是困扰我们的一大难题。无论是专业的音频工作者,还是普通的音频爱好者,都渴望拥有一款强大的工具来解决这个问题。今天,就为大家介绍两款来自 AI 工具导航(AIDH.NET)的 AI 语音…

线上死锁问题排查和处理

Java 死锁排查 通过 jps jstack 来定位和排查 如果线程长时间处于阻塞,就需要考虑是否是死锁了。 模拟死锁 public class DeadlockDemo {private static final Object lock1 new Object();private static final Object lock2 new Object();public static vo…

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…

MT7628基于原厂的SDK包, 修改ra1网卡的MAC方法。

1、在/etc/config/wireless文件添加多个WIFI网卡的方法。 2、修改WIFI驱动,在src/embedded/ap/ap.c文件里面,从系统文件信息来修改ra1网卡的MAC内容,添加红色部分源代码。 RTMP_IO_WRITE32(pAd, RMAC_RMACDR, Value); if (idx > 0) …

brew Nushell mac升级版本

运行命令: brew upgrade nushell 国内更新比较慢建议架个梯子。 如果没有更新则先更新一下brew brew update 更新后看下版本是否死最新的了

windows怎样查看系统信息(处理器等)

首先打开命令行工具 win R 输入 cmd, 输入 msinfo32 ,然后回车 这个页面就可以看到 电脑的锐龙版就是 AMD 芯片 酷睿版就是 intel 芯片

mysql之Innodb数据页

Innodb数据页结构 InnoDB数据页结构一、数据页基础概念二、数据页核心结构1. 头部控制区2. 数据存储区3. 尾部与目录区 三、关键机制详解1. 记录链表与删除优化2. 页目录与二分查找3. 空间复用与碎片管理4. 数据页的合并与分裂 四、应用与性能影响1. 索引效率2. 插入优化3. 事务…

1200沿指令和取反指令的应用。

以下是关于西门子S7-1200 PLC中沿指令(边沿检测指令)和取反指令的详细解析及应用示例,结合其工作原理、编程方法和典型场景: 一、沿指令(边沿检测指令) 1. 功能说明 沿指令用于检测信号状态的变化&#x…