当前位置: 首页 > news >正文

js -音频变音(听不出说话的人是谁)

学习参考来源:
https://zhuanlan.zhihu.com/p/634848804
https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API

实际效果:
http://www.qingkong.zone/laboratory?type=audio-confusion

前言

本文内容可结合上面学习参考来源,结合学习。
之前我遇到的需求主要是对人声进行变音处理,以确保无法通过声音识别出是谁说的这个话,保护隐私。通过Web Audio API即可实现该变声效果。

1. 获取Audio上下文

const audioCtx = new (window.AudioContext || window.webkitAudioContext)();

2. 用 audioCtx 与音频源做关联

各个音频源关联方法:

(1) 与audio,vidio标签 或 Audio实例

const audio = new Audio()
const sourceNode = audioCtx.createMediaElementSource(audio)

(2) 获取麦克风

const stream = await navigator.mediaDevices.getUserMedia({ audio: true}).catch(function (error) {console.log(error);});
const sourceNode = audioCtx.createMediaStreamSource(stream)

(3) 使用 缓冲器

const loadAudioBuffer = async (url) => {const response = await fetch(url);const arrayBuffer = await response.arrayBuffer();return await audioCtx.decodeAudioData(arrayBuffer);
}
// 获取 audioBuffer
loadAudioBuffer(props.url).then((audioBuffer) => {audioCtx.audioBuffer = audioBuffer;
}).catch((error) => {console.error("Failed to load audio buffer:", error);
});// 创建缓冲区
const bufferNode = audioCtx.createBufferSource()

需要注意:缓冲区只能播放一次,所以创建缓冲区逻辑要与播放逻辑放在一起

3. 使用缓冲区后,改写原有音频播放、暂停

声音流添加处理效果就像穿项链一样,一个接一个(引自学习参考来源1)

// 创建多个不同作用功能的node节点
var analyser = audioCtx.createAnalyser();
var distortion = audioCtx.createWaveShaper();
var gainNode = audioCtx.createGain();
var biquadFilter = audioCtx.createBiquadFilter();
var convolver = audioCtx.createConvolver();// 将所有节点连接在一起source = audioCtx.createMediaStreamSource(stream);
source.connect(analyser);
analyser.connect(distortion);
distortion.connect(biquadFilter);
biquadFilter.connect(convolver);
convolver.connect(gainNode);
gainNode.connect(audioCtx.destination);

上述代码是帮助你理解 AudioContext 的处理节点如何添加,不是实现代码。
audioCtx.destination 是 AudioContext 的输出源

播放

  if (flag) {// 创建缓冲区bufferNode = audioCtx.createBufferSource()bufferNode.buffer = audioCtx.audioBuffer;bufferNode.playbackRate.value = umlautValue;// 用于修改音量gainNode = audioCtx.createGain();bufferNode.connect(gainNode);gainNode.connect(audioCtx.destination);gainNode.gain.value = audioData.volume / 100;bufferNode.startTime = audioCtx.currentTime - audioData.currentTime;bufferNode.start(0, audioData.currentTime);bufferNode.onended = () => {audioData.status = "play";cancelAnimationFrame(animationFrameId);};} else {audio.play()}

暂停

  if (flag) {bufferNode.stop();audioData.currentTime = audioCtx.currentTime - bufferNode.startTime;cancelAnimationFrame(animationFrameId);} else {audio.pause()}

4. 使用 requestAnimationFrame 代替 timeupdate 获取实时信息

const updateCurrentTime = () => {if (bufferNode && bufferNode.playbackState === bufferNode.PLAYING_STATE) {audioData.currentTime = audioCtx.currentTime - bufferNode.startTime;audioData.currentValue = audioData.currentTime / audioData.duration * 100 * umlautValue;audioData.currentFormat = `${moment.utc(audioData.currentTime * 1000 * umlautValue).format("mm:ss")} / ${moment.utc(audioData.duration * 1000).format("mm:ss")}`;}animationFrameId = requestAnimationFrame(updateCurrentTime);
}

在需要关闭的地方

cancelAnimationFrame(animationFrameId);

5. 音频变音核心逻辑

本文走的是 变速变调 的路子,改变声音播放速率情况下,音调音色也会随着改变,例如玩过磁带的都知道,按快进功能会使声音变尖提高音调,慢放功能使声音变粗,降低音调。

为了让音频进度条与 加速或减速 的速率保持一致,需创建个变量做统一管理

const umlautValue = 1.5

6. 结尾

在销毁前记得销毁这些节点

  if (bufferNode) {bufferNode.stop();}if (gainNode) {gainNode.disconnect();}cancelAnimationFrame(animationFrameId);

喜欢的话不妨点个小小的赞与关注,您的赞与关注将是我源源不断的前进动力。

相关文章:

js -音频变音(听不出说话的人是谁)

学习参考来源: https://zhuanlan.zhihu.com/p/634848804 https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API 实际效果: http://www.qingkong.zone/laboratory?typeaudio-confusion 前言 本文内容可结合上面学习参考来源,结合…...

鸿蒙UI(ArkUI-方舟UI框架)

参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能&#xff…...

常见的http状态码 + ResponseEntity

常见的http状态码 ResponseStatus(HttpStatus.CREATED) 是 Spring Framework 中的注解,用于指定 HTTP 响应状态码。 1. 基本说明 HttpStatus.CREATED 对应 HTTP 状态码 201表示请求成功且创建了新的资源通常用于 POST 请求的处理方法上 2. 使用场景和示例 基本…...

pikachu - Cross-Site Scripting(XSS)

pikachu - Cross-Site Scripting(XSS) 声明! 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人无关,切勿触碰法律底线,否则后果自负&#x…...

操作系统之文件系统的基本概念

目录 用户和磁盘视角的文件 文件控制块(FCB)和索引结点(inode) 文件的操作 创建文件(create系统调用) 写文件(write系统调用) 读文件(read系统调用) 重…...

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践

引言 在 Android 开发中,AlarmManager 是一个非常重要的系统服务,用于设置定时任务或者周期性任务。无论是设置一个闹钟,还是定时进行数据同步,AlarmManager 都是不可或缺的工具之一。然而,随着 Android 系统的不断演…...

西电-算法分析-研究生课程复习笔记

24年秋的应该是张老师最后一次用卷面考试,他说以后这节课的期末考试都是在OJ上刷题了张老师上课还挺有意思的,上完之后能学会独立地思考算法设计问题了。整节课都在强调规模压缩这个概念,考试也是考个人对这些的理解,还挺好玩的哈…...

编译时找不到需要的库,如何在PyCharm中为你的项目添加需要的库

丰富的库支持是 Python 语言的一大特点,但是在使用 PyCharm 进行Python 代码编译的时候,遇到一些需要使用到的库提示不能解析时,该如何添加呢? 比如下图所示的代码,可以看到需要使用 selenium、b4、jieba 这些库&…...

ip addr 命令给Linux网络接口配置多个IP地址值

问一下Chatgpt 怎么使用ip addr 命令给Linux网络接口配置多个IP地址值 根据Chatgpt的提示执行了命令,命令执行成功,看下执行结果。 ifconfig 命令查看接口IP地址 ip addr show 命令查看接口IP地址...

C#语言的数据库编程

C#语言的数据库编程 在现代软件开发中,数据库是不可或缺的一部分。无论是企业级应用还是个人项目,数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言,广泛应用于Windows平台的开发,尤其是在构建与数…...

时频分析之S变换

S变换的提出 1996年,由R.G Stockwell 提出了S变换,和其他时频分析工具一样,通过S变换,我们可以同时从时域以及频域观察一个信号的能量分布。S变换融合了短时傅里叶变换和小波变换的优点。关于S变换,最早发表于TSP上的…...

第二十八周学习周报

目录 摘要Abstract1 GFPGAN1.1 总体结构1.2 实验研究1.3 代码分析 总结 摘要 本周主要的学习内容是GFPGAN模型。GFPGAN是一种基于生成对抗网络(GAN)的模型,其利用封装在预训练的人脸GAN中的丰富多样的先验进行人脸图像的修复。这种生成面部先验(GFP&…...

SurfaceFlinger MessageQueue原理

SurfaceFlinger MessageQueue 有2个作用: 处理SurfaceFlinger INVALIDATE、REFRESH事件管理SurfaceFlinger主线程挂起和恢复 SurfaceFlinger::run() { while (true) { mEventQueue->waitMessage(); } } waitMessage {do {IPCThreadState::self()->flushComm…...

component-动态控制 div width 的值 根据传入的变量决定width的值 vue

1.实现 根据参数的值&#xff0c;div显示不同的长度 <div class"node-line" :style"lineProgress"></div> <script>export default {name: "trainSummaryInfo",data(){return{linePercentage:200,}},computed:{lineProgress…...

C#中的常用集合

目录 一、动态数组ArrayList 二、List 三、栈&#xff08;Stack&#xff09; 四、队列&#xff08;Queue&#xff09; 五、字典&#xff08;Dictionary&#xff09;,int> 一、动态数组ArrayList ArrayList 是 C# 中提供的一种动态数组类&#xff0c;位于命名空间 Syste…...

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时&#xff0c;主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2&#xff09;数据库主键的种子值设置的多少 3、解决问题 1&#xff09;数据库主键设置的时自增 3&#xff09;种子值是1 所以排查是数据库的问题 4、继…...

晨辉面试抽签和评分管理系统之一:考生信息管理和编排

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

【MySQL】MVCC详解, 图文并茂简单易懂

欢迎来到啊妮莫的学习小屋 祝读本文的朋友都天天开心呀 目录 MVCC简介快照读与当前读快照读当前读 隔离级别隐藏字段和Undo Log版本链✨MVCC原理--ReadView✨ReadView简介设计思路适用隔离级别重要内容 ReadView规则MVCC整体流程 不同隔离级别下的MVCC读已提交可重复读 总结 M…...

中国数字化发展的问题与机会

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能,如智能化推荐、…...

【ROS2】☆ launch之Python

☆重点 ROS1和ROS2其中一个很大区别之一就是launch的编写方式。在ROS1中采用xml格式编写launch&#xff0c;而ROS2保留了XML 格式launch&#xff0c;还另外引入了Python和YAML 编写方式。选择哪种编写取决于每位开发人员的爱好&#xff0c;但是ROS2官方推荐使用Python方式编写…...

从零到精通:MySQL多平台安装全攻略

1. MySQL安装前的准备工作 第一次接触MySQL安装的朋友可能会被各种术语吓到&#xff0c;但其实只要掌握几个核心概念&#xff0c;后面的操作就会顺利很多。我刚开始接触数据库时也走过不少弯路&#xff0c;今天就把这些经验总结成小白也能看懂的操作指南。 MySQL本质上就是一个…...

西门子S7-1200的PID三兄弟:PID_Compact、PID_3Step、PID_Temp到底该怎么选?看完这篇不再纠结

西门子S7-1200 PID三兄弟实战选型指南&#xff1a;从原理到场景化决策 在工业自动化领域&#xff0c;温度、压力和流量等过程变量的精确控制始终是核心挑战。西门子S7-1200 PLC提供的三种PID控制指令——PID_Compact、PID_3Step和PID_Temp&#xff0c;就像三位各有所长的技术专…...

STM32定时器级联功能实战:如何构建64位定时器

1. 为什么需要64位定时器&#xff1f; 在嵌入式开发中&#xff0c;32位定时器对于大多数应用场景已经足够用了。比如一个72MHz的STM32&#xff0c;32位定时器最大能计时的时长大约是59.6秒&#xff08;2^32/72MHz&#xff09;。但在一些特殊场景下&#xff0c;比如需要记录设备…...

【深度解析】二维半导体晶体管:突破摩尔定律的下一代集成电路核心

1. 二维半导体晶体管的崛起&#xff1a;摩尔定律的终结者&#xff1f; 当硅基芯片的制程工艺逼近1纳米物理极限时&#xff0c;整个集成电路行业都在寻找"后硅时代"的突破口。我第一次在实验室见到二硫化钼&#xff08;MoS2&#xff09;晶体管时&#xff0c;那片厚度不…...

迎战2026知网最严查重:零成本脱“AI味”!10款免费工具硬核排雷红黑榜

四月一到&#xff0c;查重和AIGC检测成了两座大山。 自己熬夜敲的字被判AI生成&#xff0c;或者润色后满篇通红&#xff0c;这绝望感谁懂&#xff1f; 为了搞定论文降aigc这个大坑&#xff0c;我拿手头几篇废稿&#xff0c;去市面上热门的10款降ai率工具滚了一圈。今天这篇吐…...

Music Tag Web:3大核心能力重塑你的音乐库管理体验

Music Tag Web&#xff1a;3大核心能力重塑你的音乐库管理体验 【免费下载链接】music-tag-web 音乐标签编辑器&#xff0c;可编辑本地音乐文件的元数据&#xff08;Editable local music file metadata.&#xff09; 项目地址: https://gitcode.com/gh_mirrors/mu/music-tag…...

Django 与 FastAPI 架构对比:学习路径指南

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

HiFloat8:高性能训练之路

Float8单数据格式FP8/HiF8训练算法介绍Float8混合精度训练策略随着预训练模型&#xff08;尤其是基于Transformer架构的大语言模型&#xff09;参数规模突破千亿级&#xff0c;训练过程面临愈发严重的算力和内存瓶颈&#xff0c;成本极高。在此背景下&#xff0c;8位浮点逐渐成…...

Whisper JAX终极错误排查手册:10个常见问题与快速解决方案 ⚡️

Whisper JAX终极错误排查手册&#xff1a;10个常见问题与快速解决方案 ⚡️ 【免费下载链接】whisper-jax JAX implementation of OpenAIs Whisper model for up to 70x speed-up on TPU. 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-jax Whisper JAX是基于JA…...

Python+百度OCR实战:5分钟搞定批量图片经纬度提取(附完整代码)

Python百度OCR实战&#xff1a;5分钟搞定批量图片经纬度提取&#xff08;附完整代码&#xff09; 当你面对数百张带有经纬度水印的野外考察照片时&#xff0c;是否曾为手动记录坐标而抓狂&#xff1f;去年参与某生态调查项目时&#xff0c;团队摄影师每天传回300张带坐标水印的…...