整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

网站加速之网络加速

网站加速之网络加速



如上图,互联网企业的国内业务肯定部署在国内,出海业务则一般部署在海外;具体部署区域,则一般根据用户所在区域,选择就近的区域。

源站部署到不同区域,选择不同的机房,对于各地用户来说,会带来网络距离及网络线路质量的差异,从而对用户的访问响应时间也会产生一定差异。

网络距离长及网络线路质量差,则会给用户带来比较差的体验,具体情况概括如下:

  • 用户访问国内源站遇到的情况:
    • 内容分类:
    • 1、静态内容包括:静态网页(html、css、js、图片)、大文件、点播;
        • 静态内容访问慢,因为静态内容相对动态api接口请求的响应大小,一般大很多;
  • 2、动态接口请求响应慢
    • 原因:
  • 用户到源站网络距离远;
  • 用户到源站网络线路质量差;
  • 用户访问静态内容大,本身需要时间;
  • 源站负载大:因为源站带宽、源站硬件资源等受限
  • 用户访问国外源站遇到的情况,同用户访问国内源站遇到的情况外,还有其他特殊场景:
    • 区域跨度更大;
    • 网络距离更远;
    • 网络线路质量更差,不同区域访问还有可能有访问限制。

那么,下文介绍的就是我们常见的网络加速方法。

ps:因为是要介绍的技术是通用技术,各家公有云都有自己的产品,所以在下文的介绍中,我为了避免重复的画图及描述,引用了各家公有云的文档,在下文中有对应标示。




静态加速

静态加速,我们听过最多的就是CDN,而且一般用的是CDN的静态文件缓存加速功能。

CDN加速的核心就是就近访问缓存:

  • 让用户就近访问到性能最佳的边缘加速节点;
  • 相对于源站,边缘节点是部署在不同区域,离用户更近的镜像节点,可以缓存源站内容供用户访问。

CDN的加速原理(引用阿里云官网文档):

  • 如图:

  • 请求过程:
  • 1.当终端用户向www.aliyundoc.com下的指定资源发起请求时,首先向Local DNS(本地DNS)发起请求域名www.aliyundoc.com对应的IP。
  • 2.Local DNS检查缓存中是否有www.aliyundoc.com的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向网站授权DNS请求域名www.aliyundoc.com的解析记录。
  • 3.当网站授权DNS解析www.aliyundoc.com后,返回域名的CNAME www.aliyundoc.com.example.com。
  • 4.Local DNS向阿里云CDN的DNS调度系统请求域名www.aliyundoc.com.example.com的解析记录,阿里云CDN的DNS调度系统将为其分配最佳节点IP地址。
  • 5.Local DNS获取阿里云CDN的DNS调度系统返回的最佳节点IP地址。
  • 6.Local DNS将最佳节点IP地址返回给用户,用户获取到最佳节点IP地址。
  • 7.用户向最佳节点IP地址发起对该资源的访问请求。
  • 8.返回用户所需数据:
    • 如果该最佳节点已缓存该资源,则会将请求的资源直接返回给用户(步骤8),此时请求结束。
    • 如果该最佳节点未缓存该资源或者缓存的资源已经失效,则节点将会向源站发起对该资源的请求。获取源站资源后结合用户自定义配置的缓存策略,将资源缓存到CDN节点并返回给用户(步骤8),此时请求结束。

阿里云CDN产品架构图,其他公有云产品架构图差不多。

  • 链路质量系统
    • 链路质量探测系统会实时监测缓存系统中的所有节点和链路的实时负载以及健康状况,并将结果反馈给调度系统,调度系统根据用户请求中携带的IP地址解析用户的运营商和区域归属,然后综合链路质量信息为用户分配一个最佳接入节点。
  • 调度系统
    • 支持策略中心、DNS、HTTPDNS和302调度模式。当终端用户发起访问请求时,用户的访问请求会先进行域名DNS解析,然后通过阿里云CDN的调度系统处理用户的解析请求。
  • 缓存系统
    • 用户通过收到的最佳接入节点访问对应的缓存节点,如果节点已经缓存了用户请求的资源,会直接将资源返回给用户;如果L1(边缘节点)和L2(汇聚节点)节点都没有缓存用户请求的资源,此时会返回源站去获取资源并缓存到缓存系统,供后续用户访问,避免重复回源。分级缓存的部署架构可提高内容分发效率、降低回源带宽以及提升用户体验。
  • 支撑服务系统
    • 支撑服务系统包括天眼、数据智能和配置管理系统,分别具备了资源监测、数据分析和配置管理能力。
    • 资源监测:天眼可以对缓存系统上用户业务运行的状态进行监测。例如对CDN加速域名的QPS、带宽、HTTP状态码等常见指标的监控。
    • 数据分析:用户可以分析CDN加速域名的TOP URL、PV、UV等数据。
    • 配置管理:通过配置管理系统,用户可以配置缓存文件类型、缓存时去参数缓存等缓存规则,以提升缓存系统的运作效率。

节点分布(引用华为云官网文档)

  • 华为云国内节点:


  • 华为云国外节点:

cdn加速类型(引用华为云官网文档)

  • 网页加速
    • 网站的html、js、css、图片等静态资源加速。

大文件下载加速

  • APP更新,手游更新等,传统的下载网站类业务。

点播加速

  • 在线教育类网站、在线视频分享网站、互联网电视点播平台、音乐视频点播APP的音视频点播服务,会涉及音视频转码。




动态加速DCDN(Dynamic Route for Content Delivery Network)

web1.0时代,网站大部分是静态内容,所以最开始的静态加速就能满足需求;随着web2.0及移动互联网时代的到来,网站中的动态请求占比逐渐提升。
那如果动态内容请求慢,是否有加速的办法了?答案是有的,那就是动态加速。
如下图,因为动态内容如果加了缓存,那么用户访问到的就不是最新的内容;
所以动态请求一般不做缓存加速的方案,而是通过优化边缘节点到源站的回源链路的方式来加速;
cdn静态缓存加速的边缘节点一般是通过公网线路回源到源站;
动态加速网络会把动态加速网络中的所有边缘节点互联成一个私有网络;
动态加速就是用户就近访问到边缘节点后,通过这个私有网络,智能选择一条最优质量的线路回源,保证回源过程不会受到公网网络的不确定因素的影响的方式来进行动态请求的加速;同时这个私有网络也会进行一些长链接等协议优化的方式来加速。
ps:

  • 动态加速并不能解决因为物理距离增加的响应时间变长的问题。
  • 动态加速效果,需要业务自己实际对比测试,看满不满足业务需求。
  • 图片来自阿里云



全站加速(Whole Site Acceleration)

全站加速,其实就是同时具备静态加速和动态加速的能力。
CDN初代产品具有的能力就是静态加速,随着升级支持动态加速的功能,就变成了全站加速。
不同的云厂商产品规划不同,有些云厂商会把全站加速单独拿出来作为一个产品,有些云厂商则把全站加速集成到了CDN产品中。
全站加速的过程如下图:

  • 用户发起的请求如果是静态请求,则会遵循CDN静态加速的流程,主要是通过缓存来加速;
  • 用户发起的请求如果是动态请求,则会遵循动态加速的流程,主要是通过智能路由来加速。

ps:不同云厂商的动态加速计费方式和静态加速计费方式可能不一样,需要注意计费方式不同带来的成本不同的问题。

图片来自华为云:



全球加速(Global accelerator)

(引用aws官网文档)


全球加速核心和全站加速中的动态加速的原理类似,大概如下:

  • 把分布在全球的边缘节点组成一个云厂商的私有网络;
  • 用户会访问到就近的边缘节点;
  • 边缘节点会通过私有网络回源到源站;
  • 源站可以部署多个,部署到不同区域(region);
  • 回源可以根据策略回源到不同源站。
  • AnyCast IP可以绑定到不同区域的边缘节点。


应用场景(图片来自华为云):

  • 游戏业务

  • 跨国办公




总结

  1. 怎么选择加速产品?
  2. 看业务需求:是要对静态文件加速,还是要对动态接口加速,或者对静态文件和动态接口都加速?
  3. 静态文件加速选择CDN静态加速即可;
  4. 动态api加速选择动态加速DCDN,同时一般会启用静态加速,即开启全站加速;
  5. 动态api加速当然也可以选择全球加速(Global accelerator)。
  6. 使用加速产品的注意事项:
  7. 确认厂商的计费模式及价格;这个关系到我们的成本;
  8. 需要看厂商是自建CDN还是融合CDN?这个关系到厂商产品的性价比;
  9. 各家CDN厂商的节点分布情况以及是否能够提供节点清单?用来确认用户访问的节点是不是CDN厂商的节点?
  10. 确认使用加速产品前后的性能对比;可以使用RUM(真实用户http访问监控)数据做对比分析;
  11. 确认厂商对CDN边缘节点的健康检测及故障迁移能力;这个可能涉及到一种情况:我们的用户访问到了不能正常提供服务的CDN边缘节点,即用户此时不能正常访问;如果厂商不能快速检测到异常的CDN边缘节点并把流量切换到其他正常CDN边缘节点,就会影响我们业务的可用率;这种问题我们自己能否感知,取决于我们的RUM(真实用户http访问监控)的能力。
  12. 确认边缘节点的缓存策略;比如说http状态码404、502、503是否缓存?
  13. 确认边缘节点的回源策略;有些厂商的cdn静态加速是通过公网回源,有些厂商会通过厂商自己的私有优化的网络回源。
  14. 确认跨站请求配置、客户端ip透传配置;不同配置对业务有不同影响;
  15. 确认是否支持IP黑白名单功能;内部系统开启CDN加速,可能需要用到IP白名单来限制其他IP的访问;
  16. 确认是否部署CDN使用量实时监控;这个主要是避免异常的大流量或大带宽引起的异常费用;比如平常带宽1Gbps,突然涨到5Gbps甚至更大,那么费用也会对应增长。
  17. 选择什么加速产品以及选择哪家厂商可以根据自身业务的需求以及第2点中的注意事项(主要是各厂商的性价比)评估选择即可。




作者 | 邹永红 高级SRE专家

来源-微信公众号:微鲤技术团队

出处:https://mp.weixin.qq.com/s/mRshh-NjlkvsYd5f7dDPoA

. 使用内容分发网络 (CDN)

内容交付网络是分布在不同地理位置的一组 Web 服务器,这些服务器根据最终用户的位置向其提供 Web 内容。当您在单个服务器上托管网站时,所有用户请求都将发送到同一硬件。因此,处理每个请求所需的时间会增加。最重要的是,当用户物理上远离服务器时,加载时间会增加。使用 CDN,用户请求将重定向到最近的服务器。因此,内容可以更快地交付给用户,网站可以更快地工作。这是一种相当昂贵但非常有效地优化加载时间的方法。

2.将您的网站移动到更好的主机

有三种可能的托管类型:

共享主机

虚拟专用服务器(VPS)托管

专用服务器

世界各地最常用的托管类型是共享托管。这是在短时间内以低廉的费用使您的网站上线的最便宜的方式。选择快速Web主机以确保更好的优化至关重要。使用共享主机,您可以与也使用此服务器的其他站点共享 CPU、磁盘空间和 RAM。这就是共享主机不如VPS或专用服务器快的主要原因。

虚拟专用服务器和专用服务器要快得多。VPS使用多个服务器进行内容分发。拥有VPS,您可以与其他用户共享服务器,并拥有自己的虚拟服务器部分,您的配置不会影响其他客户端。如果您的网站具有平均流量,或者您的电子商务网站在某些时期具有流量高峰,则VPS将是您的最佳解决方案。

最昂贵的托管选项是使用专用服务器,该服务器可以是您自己的物理服务器。在这种情况下,您需要支付服务器租金并雇用系统管理员来维护它。

3.优化网站上图像的大小

每个人都喜欢引人注目的图像。在成功的电子商务网站的情况下,图像是至关重要的一部分。产品页面上的大量照片,图像,图形可以提高参与度。图像使用的消极方面是它们通常是大文件,会减慢网站的速度。

在不影响图像质量的情况下减小图像大小的最佳方法是使用ImageOptim,JPEGmini或Kraken等工具压缩图像。该过程可能需要一些时间,但这是值得的。减小图像大小的另一种方法是使用 HTML 响应式图像<机密>和<大小>属性,这些属性根据用户显示属性调整图像大小。

4. 减少插件数量

插件是每个网站的通用组件。它们添加了第三方建议的特定功能。不幸的是,安装的插件越多,运行它们所需的资源就越多。因此,网站运行速度较慢,并且还会出现安全问题。随着时间的流逝,插件的数量会增长,而其中一些插件可能不再使用。我们建议您检查已安装的所有插件并删除不必要的插件。首先,在您的页面上运行性能测试,以找出哪些插件正在减慢您的网站速度。网站速度不仅取决于安装插件的数量,还取决于它们的质量。尽量避免加载大量脚本和样式或生成大量数据库查询的插件。最好的解决方案是只保留必要的,并确保它们保持最新。

5. 尽量减少 JavaScript 和 CSS 文件的数量

如果您的网站包含大量JavaScript和CSS文件,则当您的网站访问者想要访问特定文件时,会导致大量HTTP请求。这些请求由访问者的浏览器单独处理,并减慢网站工作速度。如果你减少JavaScript和CSS文件的数量,这无疑会加快你的网站速度。尝试将所有JavaScript分组为一个,并对所有CSS文件进行分组。这将减少 HTTP 请求的总数。有很多工具可以快速缩小HTML,CSS和JavaScript文件。例如,您可以使用WillPeavy,Script Minifier或Grunt工具。

6. 使用网站缓存

如果有很多用户一次访问页面,服务器工作缓慢,需要更多时间才能将网页交付给每个用户。缓存是将网站的当前版本存储在主机上并显示此版本直到网站更新的过程。这意味着网页不会为每个用户一遍又一遍地呈现。缓存的网页不需要每次都发送数据库请求。

网站缓存的方法取决于开发网站的平台。例如,对于WordPress,您可以使用以下插件:W3 Total Cache或W3 Super Cache。如果您使用VPS或专用服务器,您还可以在常规设置下设置缓存。对于共享服务器,网站缓存通常不可用。

7. 实施 Gzip 压缩

Gzip压缩是减小文件大小的有效方法。它最大限度地减少了HTTP请求并减少了服务器响应时间。Gzip 在将文件发送到浏览器之前会压缩文件。在用户端,浏览器解压缩文件并显示内容。此方法可以处理您网站上的所有文件。您可以通过添加一些代码行或通过名为gzip的实用程序在您的网站上启用Gzip。

8. 内容管理系统中的数据库优化

数据库优化是提高性能的有效方法。如果您使用包含复杂插件的内容管理系统(CMS),则数据库大小会增加,您的网站运行速度会变慢。例如,WordPress CMS存储评论,博客文章和其他占用大量数据存储的信息。每个CMS都需要自己的优化措施,并且还具有许多特定的插件。例如,对于WordPress,您可以考虑WP-Optimize。

9. 减少网页字体的使用

网页字体在网站设计中变得非常流行。不幸的是,使用Web字体会对页面呈现的速度产生负面影响。Web 字体向外部资源添加额外的 HTTP 请求。以下措施将帮助您减少网页字体流量的大小:

使用现代格式WOFF2用于现代浏览器;

仅包括网站上使用的字符集;

仅选择所需的样式

10. 检测 404 错误

404 错误表示“找不到页面”。当页面的访问内容不再存在时,托管将向浏览器或搜索引擎提供此消息。为了检测和更正404错误,您可以使用错误检测工具和插件。正如我们所提到的,其他插件可能会对您的网站速度产生负面影响,因此我们建议您通过外部工具运行资源以进行错误检测。例如,Xenu的Link侦探,Google Webmaster Tools(GWT)和404 RedirectEd Plugin For WordPress。

检测到所有 404 错误后,您需要评估它们生成的流量。如果这些死链接不再带来任何访问,因此永远不会消耗您的服务器资源,那么您可以保持原样。如果这些页面仍然有一些流量,请考虑为外部链接设置重定向并修复内部链接的链接地址。

11. 减少重定向

网站重定向会创建额外的 HTTP 请求,从而对性能产生负面影响。我们建议将它们保持在最低限度或完全消除它们。首先,您应该通过运行站点扫描来识别页面上的所有重定向。您可以使用尖叫青蛙快速识别重定向。然后,您必须检查它们是否用于必要的目的,并仅保留关键目的。

想在网页中实现实时音频变声效果该如何实现呢,之前遇到这种处理音视频的需求,可能会想到需要借助C代码实现。但是现在随着浏览器性能的提升、web API的丰富,通过浏览器原生的API也可以操作音频数据实现很多复杂的效果,为web音频开发提供了更多的选择。下面介绍几种采用原生Web Audio API实现变声效果的过程中尝试的几种方案,感兴趣的同学一起来了解下吧。

说明:本文讨论范围为变声场景中的变速变调方案,有其它两种场景:变速不变调、变调不变速需求的同学请移步参考链接或其它方案

Web Audio API介绍

开始之前先简单了解下Web Audio APIWeb Audio API提供了一组在web上操作音频的API,可以使开发者自选音频数据来源,为音频添加效果,使声音可视化,为声音添加空间效果等功能。音频的输入流可以理解为一组buffer,来源可以是读取音频文件产生到内存中的AudioBufferSourceNode,也可以是来自HTML中audio标签的MediaElementAudioSourceNode,也可以是来自音频流(例如麦克风)的MediaStreamAudioSourceNode。例如,采集自己设备上的麦克风声音连接到扬声器:

// 创建音频上下文
const audioContext=new AudioContext();
// 获取设备麦克风流
stream=await navigator.mediaDevices
  .getUserMedia({ audio: true})
  .catch(function (error) {
    console.log(error);
  });
// 创建来自麦克风的流的声音源
const sourceNode=audioContext.createMediaStreamSource(stream);
// 将声音连接的扬声器
sourceNode.connect(audioContext.destination);

就可以对着麦克风说话听到自己的声音了。对上述来源数据流的处理被设计成一个个的节点(Node),具有模块化路由的特点,需要添加什么样的效果添加什么样的node,例如一个最常见的操作是通过把输入的采样数据放大来达到扩音器的作用(GainNode),示例代码:


// 创建音频上下文
const audioContext=new AudioContext();
// 创建一个增益Node
const gainNode=audioCtx.createGain();
// 获取设备麦克风流
stream=await navigator.mediaDevices
  .getUserMedia({ audio: true})
  .catch(function (error) {
    console.log(error);
  });
// 创建来自麦克风的流的声音源
const sourceNode=audioContext.createMediaStreamSource(stream);
// 将声音经过gainNode处理
sourceNode.connect(gainNode);
// 将声音连接的扬声器
gainNode.connect(audioContext.destination);
// 设置声音增益,放大声音
gainNode.gain.value=2.0;

以上只是连接了声音放大的node,如果想要增加其它效果,可以继续往上添加node连接connect,例如滤波器(BiquadFilterNode)、立体声控制(StereoPannerNode)、对信号进行扭曲(WaveShaperNode)等等。这种模块化设计提供了灵活的创建动态效果和复合音频的方法,是不是有种变魔法的感觉,哪里修改点哪里(添加Node)非常方便。例如,以下展示了一个利用 AudioContext 创建四项滤波器节点(Biquad filter node)的例子:

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

// 创建多个不同作用功能的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);

// 控制双二阶滤波器

biquadFilter.type="lowshelf";
biquadFilter.frequency.value=1000;
biquadFilter.gain.value=25;

可以看到为声音流添加处理效果就像穿项链一样,一个接一个,最后得到最终效果,实现效果可以参考官方样例voice-change-o-matic。一个简单而典型的 web audio 流程如下:

  1. 创建音频上下文
  2. 在音频上下文里创建源 — 例如, 振荡器,流
  3. 创建效果节点,例如混响、双二阶滤波器、平移、压缩
  4. 为音频选择一个目的地,例如你的系统扬声器
  5. 连接源到效果器,对目的地进行效果输出

变声效果实现

首先回顾一下声音的基础知识,声音是由物体振动产生的机械波,常接触到的有以下三个特性:

  • 频率:频率越大,音调越高;频率越小,音调越低。
  • 振幅:振幅越大,音量(响度)越大;振幅越小,音量越小。
  • 音色:即波形,听声辨人的主要依据

这里说的变声效果是改变声音的音调,变声效果根据不同的场景可以分为变速不变调、变调不变速以及变调又变速 3 种。变速是指把一个语音在时域上拉长或缩短,而声音的采样率、基频以及共振峰都没有发生变化。变调是指把语音的基因频率降低或升高,共振峰做出相应的改变,采样频率不变。各种方案应用场景如下:

  1. 变速不变调:各种各样的视频播放器中的 2 倍速,0.5 倍速播放就是应用的语音变速不变调原理;当然变速不变调还应用于网络电话 VOIP 中的应对网络抖动,简单的说,就是当网络不好的时候,播放端从网络中拉取到的数据少,缓存区的数据不够用,这个时候就使用缓存的数据播放的慢一点。反之,缓存区数据过多,就播放的快一点。这部分的实现可以参照 webrtc 的 netEQ 模块。平时在使用微信语音的时候应该能感受到网络特别卡时,为了保持语音连续,会故意慢放语音。
  2. 变调不变速:变调不变速主要应用在声效上,声音提高音调将男声变成女生,或则将女生变成男声;另外,变调不变速配合其他一些音效算法,如 EQ,混响,tremolo 和 vibrato 可以实现变声效果,比如 QQ 上的萝莉音,大叔音等。
  3. 变速变调:改变声音播放速率情况下,音调音色也会随着改变,例如玩过磁带的都知道,按快进功能会使声音变尖提高音调,慢放功能使声音变粗,降低音调。

前两种实现都要求对声音知识领域有更深的了解,声音时域、频域,信号的傅里叶变换变化都要去重新去复习一下,学习成本比较高,这里使用第3种方式,比较好接入。要改变声音的播放速率,Web Audio API中提供了AudioBufferSourceNodeplaybackRate属性,可以设置音频的播放速率,使用音频上下文AudioContext.createBufferSource获得实例,示例代码如下:

const play=()=> {
  const audioSrc=ref("src/assets/sample_orig.mp3")
  const url=audioSrc.value
  const request=new XMLHttpRequest()
  request.open('GET', url, true)
  request.responseType='arraybuffer'

  request.onload=function() {
    const audioData=request.response
    const audioCtx=new (window.AudioContext || window.webkitAudioContext)();
  
    audioCtx.decodeAudioData(audioData, (audioBuffer)=> {
      let source=audioCtx.createBufferSource();
      source.buffer=audioBuffer;
      // 改变声音播放速率,2倍播放
      source.playbackRate.value=2;
      source.connect(audioCtx.destination);
      source.start(0);
    });
  }
  request.send()
}

可以调整source.playbackRate.value的值来改变音调,大于1提高音调,小于1降低音调。

虽然实现了变声效果,但是这种方式只适合播放音频文件,或者能获取到完整音频流的情况,对于获取麦克风这种持续输入的声音流并不适用,类似的还有SoundTouchJS,它是某大佬实现的SoundTouch的JS版本,使用也是要获取完整音频的数据流,作者也做了相应的解释,参考链接

如何处理麦克风获取的实时音频流呢,这里可以借助Web Audio API中的ScriptProcessorNode,它允许使用 JavaScript 生成、处理、分析音频。处理流程图如下:

利用它将实时音频流数据处理一下,得到慢放或加速的声音流数据。示例代码如下:

const audioprocess=async ()=> {
  const audioContext=new AudioContext();

  // 采集麦克风输入声音流
  let stream=await navigator.mediaDevices
    .getUserMedia({ audio: true})
    .catch(function (error) {
      console.log(error);
    });

  const sourceNode=audioContext.createMediaStreamSource(stream);

  const processor=audioContext.createScriptProcessor(4096, 1, 1);
  processor.onaudioprocess=async event=> {
    // 处理回调中拿到输入声音数据
    const inputBuffer=event.inputBuffer;
    // 创建新的输出源
    const outputSource=audioContext.createMediaStreamDestination();
    const audioBuffer=audioContext.createBufferSource();
    audioBuffer.buffer=inputBuffer;
    // 设置声音加粗,慢放0.7倍
    audioBuffer.playbackRate.value=0.7
    audioBuffer.connect(outputSource);
    audioBuffer.start();

    // 返回新的 MediaStream
    const newStream=outputSource.stream;
    const node=audioContext.createMediaStreamSource(newStream)
    // 连接到扬声器播放
    node.connect(audioContext.destination)
  };
  // 添加处理节点
  sourceNode.connect(processor);
  processor.connect(audioContext.destination)
}

另外,还有一个利用Google开源jungle实现的改变音调的库,并且还有各种混响效果,音频可视化等炫酷功能,也是使用的Web Audio API实现,github链接地址放在这里了,有兴趣也可以体验下,画面长这样

总结

以上就是对Web Audio API的简单介绍和使用的分析,以及采用Web Audio API实现声音简单变声效果的几种实现,大家有哪些更好的实现方案欢迎评论区一起交流!

参考

https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API

https://github.com/cwilso/Audio-Input-Effects

https://mdn.github.io/voice-change-o-matic/

https://github.com/cutterbl/SoundTouchJS

https://cloud.tencent.com/developer/news/818606

https://zhuanlan.zhihu.com/p/110278983

https://www.nxrte.com/jishu/3146.html

作者:付晓方

来源:微信公众号:奇舞精选

出处:https://mp.weixin.qq.com/s/MuBqhyDUWbqU9p8e9LhdlQ