音频变速python版

音频变速

如何能在不改变音频其他特点的情况下,只改变语速呢?
有几个python的库可以实现该功能,下面一一介绍。

pydub库

首先,确保安装了pydub和ffmpeg。
下面是一个简单的Python脚本,展示如何改变音频的播放速度:

from pydub import AudioSegment
from pydub.playback import playdef change_speed(audio_file, speed=1.0):sound = AudioSegment.from_file(audio_file)# 增加速度sound_with_altered_speed = sound._spawn(sound.raw_data, overrides={"frame_rate": int(sound.frame_rate * speed)}).set_frame_rate(sound.frame_rate)return sound_with_altered_speed# 加载音频文件
audio_path = "your_audio_file.mp3"
# 改变速度,例如1.5倍速
altered_sound = change_speed(audio_path, speed=1.5)
# 播放修改后的音频
play(altered_sound)
# 导出音频
altered_sound.export("modified_audio.mp3", format="mp3")

change_speed函数接受原始音频文件路径和速度因子。通过修改帧率来改变速度。如果你想要加快速度,可以将速度因子设置为大于1的值;如果想要减慢速度,将其设置为小于1的值。

但是该方法在改变语音的同时,使得音调也发生改变。

librosa库

librosa主要用于音乐和音频分析。它支持音频的时间伸缩(即改变音频速度而不改变音调),并且提供了许多其他音频处理功能。

实现代码:

import librosa
import soundfile as sfaudio_path = 'your_audio_file.wav'
y, sr = librosa.load(audio_path, sr=None)  # sr=None 保持原始采样率# 变速处理,比如加速1.5倍
y_change = librosa.effects.time_stretch(y, 1.5)
#保存
sf.write('output_audio_file.wav', y_change, sr)

在改变音频速度的同时保持原有音调,librosa使用了时间拉伸算法(Time Stretching)。
librosa.effects.time_stretch函数是用于调整音频的播放速度,同时不改变音频的音高(音调)。
我们看下这个函数源码:

def time_stretch(y, rate, **kwargs):'''Time-stretch an audio series by a fixed rate.'''if rate <= 0:raise ParameterError('rate must be a positive number')# Construct the short-term Fourier transform (STFT)stft = core.stft(y, **kwargs)# Stretch by phase vocodingstft_stretch = core.phase_vocoder(stft, rate)# Predict the length of y_stretchlen_stretch = int(round(len(y)/rate))# Invert the STFTy_stretch = core.istft(stft_stretch, dtype=y.dtype, length=len_stretch, **kwargs)return y_stretch

可以看到,该函数主要包含三个步骤:
1.音频的频谱表示
首先,librosa.effects.time_stretch利用短时傅里叶变换(STFT)将音频信号从时间域转换到频域。这种转换将音频分解成其组成的频率成分,每个成分都有相应的幅度和相位。

2.相位估计(phase_vocoder)
在进行时间伸缩处理时,保持相位连续性是一个重要的挑战。librosa采用了相位估计技术来调整每个频率成分的相位,以保证在变速过程中音频信号的相位连续性。这是通过相位重构实现的,确保在变速后的音频中,所有频率成分的相位都能正确对齐。

3.相位恢复和重构,重建音频
处理相位信息时,使用相位展开技术,从原始音频中提取和修改相位信息,然后在处理过程中适当调整这些信息以匹配新的时间伸缩率。
最后,将处理过的频谱数据通过逆短时傅里叶变换(ISTFT)重新转换回时间域,生成最终的音频输出。在这一步中,经过调整的幅度和重构的相位信息被合成,以产生时间伸缩后的音频信号。

补充:相位声码器Phase vocoder
相位声码器(phase vocoder)是一种特殊的声码器,用于分析和修改音频信号的频谱相位。它是在数字信号处理中广泛使用的一种工具,特别适用于时间伸缩(改变音频速度而不改变音调)和音高移动(改变音调而不改变速度)。

相位声码器技术可以实现音频的时间伸缩。这一技术是基于频域处理,它可以调整音频的时长而不改变音高,主要依靠精确的相位处理。

先看看源码:

def phase_vocoder(D, rate, hop_length=None):"""Phase vocoder.  Given an STFT matrix D, speed up by a factor of `rate`Based on the implementation provided by [1]_... note:: This is a simplified implementation, intended primarily forreference and pedagogical purposes.  It makes no attempt tohandle transients, and is likely to produce many audibleartifacts.  For a higher quality implementation, we recommendthe RubberBand library [2]_ and its Python wrapper `pyrubberband`... [1] Ellis, D. P. W. "A phase vocoder in Matlab."Columbia University, 2002.http://www.ee.columbia.edu/~dpwe/resources/matlab/pvoc/.. [2] https://breakfastquay.com/rubberband/Parameters----------D : np.ndarray [shape=(d, t), dtype=complex]STFT matrixrate :  float > 0 [scalar]Speed-up factor: `rate > 1` is faster, `rate < 1` is slower.hop_length : int > 0 [scalar] or NoneThe number of samples between successive columns of `D`.If None, defaults to `n_fft/4 = (D.shape[0]-1)/2`Returns-------D_stretched : np.ndarray [shape=(d, t / rate), dtype=complex]time-stretched STFTSee Also--------pyrubberband"""n_fft = 2 * (D.shape[0] - 1)if hop_length is None:hop_length = int(n_fft // 4)time_steps = np.arange(0, D.shape[1], rate, dtype=np.float)# Create an empty output arrayd_stretch = np.zeros((D.shape[0], len(time_steps)), D.dtype, order='F')# Expected phase advance in each binphi_advance = np.linspace(0, np.pi * hop_length, D.shape[0])# Phase accumulator; initialize to the first samplephase_acc = np.angle(D[:, 0])# Pad 0 columns to simplify boundary logicD = np.pad(D, [(0, 0), (0, 2)], mode='constant')for (t, step) in enumerate(time_steps):columns = D[:, int(step):int(step + 2)]# Weighting for linear magnitude interpolationalpha = np.mod(step, 1.0)mag = ((1.0 - alpha) * np.abs(columns[:, 0])+ alpha * np.abs(columns[:, 1]))# Store to output arrayd_stretch[:, t] = mag * np.exp(1.j * phase_acc)# Compute phase advancedphase = (np.angle(columns[:, 1])- np.angle(columns[:, 0])- phi_advance)# Wrap to -pi:pi rangedphase = dphase - 2.0 * np.pi * np.round(dphase / (2.0 * np.pi))# Accumulate phasephase_acc += phi_advance + dphasereturn d_stretch

直接调用调用phase_vocoder来实现时间伸缩。这里是一个简单的示例:

import librosa# 加载音频数据
y, sr = librosa.load('audio_file.wav', sr=None)# 计算STFT
D = librosa.stft(y)# 应用相位声码器进行时间伸缩
D_stretched = librosa.core.phase_vocoder(D, rate=1.5)# 通过逆STFT重构音频
y_stretched = librosa.istft(D_stretched)

基本原理:
在这里插入图片描述

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

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

相关文章

韩顺平Java | C25 JDBC和连接池(上)

概述 JDBC概述&#xff1a;JDBC为访问不同数据库提供统一接口&#xff0c;为使用者屏蔽细节问题。Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 // 模拟代码 //JdbcInterface.java --Java规定的JDBC接口(方法) p…

redis的设计与实现(五)——独立功能

1. Redis的其他功能 redis 除了简单对对象的增删改查的功能之外&#xff0c;其实还有其他高级功能&#xff0c;了解这些内容有利于我们更灵活的使用 redis 完成我们的业务功能。 2. 发布与订阅 2.1. 基本概念 很多中间件都有发布与订阅功能&#xff0c;但是&#xff0c;作为一…

文献阅读:LESS: Selecting Influential Data for Targeted Instruction Tuning

文献阅读&#xff1a;LESS: Selecting Influential Data for Targeted Instruction Tuning 1. 文章简介2. 方法介绍 1. Overview2. 原理说明 1. SGD上的定义2. Adam上的定义 3. 具体实现 1. Overview1. LoRA使用2. 数据选择3. LESS-T 3. 实验考察 & 结论 1. 实验设计2. 主…

UE5 在骨骼动画模型上绘制贴图

参考&#xff1a;Unreal 5.1 - How to paint damage textures and other effects on skeletal meshes 针对模型&#xff0c;在运行状态下通过射线指定一定范围&#xff0c;添加材质效果。 核心思路 通过射线获取命中点&#xff0c;作为材质参数材质中&#xff0c;命中的世界…

DP练习_P1002 [NOIP2002 普及组] 过河卒_python_蓝桥杯

P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1.DFS做超时40分 n, m, x, y map(int,input().split())flag [[0]*(n10) for _ in range(m10)] maps [[0]*(n10) for _ in range(m10)] d [[2,1],[2,-1],[-2,1],[-2,-1],[1,2],[1,-2],[-1,2]…

matlab 安装 mingw64(6.3.0),OPENEXR

matlab安装openexr 1. matlab版本与对应的mingw版本选择2. mingw&#xff08;6.3.0&#xff09;下载地址&#xff1a;3. matlab2020a配置mingw&#xff08;6.3.0&#xff09;流程“4. matlab 安装openexr方法一&#xff1a;更新matlab版本方法二&#xff1a;其他博文方法方法三…

【算法刷题 | 二叉树 06】4.10( 路径总和、路径总和 || )

文章目录 13.路径总和13.1问题13.2解法一&#xff1a;递归13.2.1递归思路&#xff08;1&#xff09;确定递归函数参数以及返回值&#xff08;2&#xff09;确定终止条件&#xff08;3&#xff09;确定递归逻辑 13.2.2代码实现 14.路径总和 ||14.1问题14.2解法一&#xff1a;递归…

HarmonyOS鸿蒙端云一体化开发--适合小白体制

端云一体化 什么是“端”&#xff0c;什么是“云”&#xff1f; 答&#xff1a;“端“&#xff1a;手机APP端 “云”:后端服务端 什么是端云一体化&#xff1f; 端云一体化开发支持开发者在 DevEco Studio 内使用一种语言同时完成 HarmonyOS 应用的端侧与云侧开发。 …

探索NDVI:了解植被指数的意义与应用

随着科技的进步和遥感技术的发展&#xff0c;我们能够更深入地了解地球上的植被覆盖情况&#xff0c;而其中一项重要的工具就是NDVI&#xff08;Normalized Difference Vegetation Index&#xff0c;归一化植被指数&#xff09;。NDVI不仅仅是一个数值&#xff0c;更是一扇窥探…

Keil开启代码提示功能

本文介绍Keil5开启代码提示功能。 进入这个 如此设置&#xff1a; 有的电脑的左边是空白栏&#xff0c;没有设置选项。应该如何解决呢&#xff1f; 找到MDK525安装包&#xff0c;其他版本的 Keil5 应该也可以。 用你的解压软件把它打开&#xff1a; 解压后会多出这些文…

python之字符串操作

1、切片操作 跟列表的切片很相似 代码示例 str1 chengxianzi996 print(str1[0:2]) print(str1[:10]) 代码解释&#xff1a;第一行&#xff1a;创建了一个字符串对象&#xff08;其中单引号和双引号都可以创建字符串&#xff09; 第二行提取前两个字符并输出 第三行输出s…

Linux LVM磁盘扩容

1、查看磁盘情况 df -h df -h2、查看逻辑卷 lvdisplay lvdisplay3、查看逻辑组 vgdisplay vgdisplay4、查看物理卷 pvdisplay pvdisplay5、查看磁盘 fdisk -l fdisk -l6、磁盘分区fdisk /dev/磁盘名 # 上一步查看到的新硬盘路径 fdisk /dev/vdb7、格式化磁盘mkfs -t ext4…

梯度提升树(Gradient Boosting Trees)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个梯度提升树&#xff08;Gradient Boosting Trees&#xff09;模型程序,最后打印5个条件分别的影响力。 示例一 梯…

字节对编码 (BPE):提升语言处理的效率和有效性

原文地址&#xff1a;byte-pair-encoding-bpe-bridging-efficiency-and-effectiveness-in-language-processing 2024 年 4 月 12 日 介绍 在快速发展的自然语言处理 (NLP) 领域&#xff0c;对人类语言高效解析和理解的追求带来了重大创新。字节对编码&#xff08;BPE&#x…

C++ UML 类图介绍与设计

1 类图概述 UML(Unified Modeling Language)&#xff0c;即统一建模语言&#xff0c;是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。UML从目标系统的不同角度出发&#xff0c;定义了用例图、类图、对象图、状态图、活动图…

深拷贝总结

JSON.parse(JSON.stringify(obj)) 这行代码的运行过程&#xff0c;就是利用 JSON.stringify 将js对象序列化&#xff08;JSON字符串&#xff09;&#xff0c;再使用JSON.parse来反序列化&#xff08;还原&#xff09;js对象&#xff1b;序列化的作用是存储和传输。&#xff08…

亚马逊云科技官方重磅发布GenAI应用开发学习路线(全免费)

今天小李哥给大家分享的是亚马逊云科技&#xff08;AWS&#xff09;最近官方发布的GenAI应用开发最佳学习路线&#xff0c;不仅内容非常全面更主要的是全部免费&#xff01;大家动动小手就能成为GenAI开发大&#x1f42e;&#xff01; 1️⃣这个GenAI开发学习路线包括什么&…

遥感卫星:探索地球的科技之旅

遥感卫星是人类探索地球、理解地球、保护地球的重要工具&#xff0c;其发展历程承载了人类对地球的探索与认知的历程。从最初的概念到如今的高科技应用&#xff0c;遥感卫星技术的发展见证了人类科技的不断进步与创新。 初心萌芽&#xff1a; 遥感卫星的发展始于20世纪中叶&…

C语言高质量编程之assert()和const

目录 编程中常见的错误 assert() const 编程中常见的错误 在编程中我们通常会遇到三种错误形式&#xff0c;分别是&#xff1a;编译型错误&#xff0c;链接型错误&#xff0c;运行时错误。 编译型错误&#xff1a; 在编译阶段发生的错误&#xff0c;绝大多数情况是由语法错误…

利用Sentinel解决雪崩问题(二)隔离和降级

前言&#xff1a; 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩&#xff0c;就要靠线程隔离(舱壁模式)和熔断降级手段了&#xff0c;不管是线程隔离还是熔断降级&#xff0c;都是对客户端(调…