音频变速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,一经查实,立即删除!

相关文章

跨域问题 及 解决

跨域&#xff08;Cross-Origin Resource Sharing&#xff0c;CORS&#xff09;是由浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;引起的&#xff0c;同源策略是浏览器最基本的安全机制之一&#xff0c;用于防止恶意网站通过脚本等方式访问用户的私密信息。同源策…

代码随想录算法训练营第三十五天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯、62.不同路径

文档链接&#xff1a;https://programmercarl.com/ LeetCode509.斐波那契数 题目链接&#xff1a;https://leetcode.cn/problems/fibonacci-number/ 思路&#xff1a; 动规五部曲&#xff1a; 这里我们要用一个一维dp数组来保存递归的结果 1.确定dp数组以及下标的含义 d…

数据结构与算法的经典问题 — 背包问题

数据结构与算法 数据结构与算法是计算机科学中的两个核心概念&#xff0c;它们在软件开发和问题解决中起着至关重要的作用。 数据结构 数据结构是计算机中存储、组织和管理数据的方式&#xff0c;它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场…

【LeetCode热题100】【回溯】组合总和

题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 要找一个和的所有组合&#xff0c;可以从每个数开始深度遍历&#xff0c;在包括自己本身下累加求和&#xff0c;不管行不行都回退状态 优化&#xff1a;每个数从本身开始深度遍历&#xff0c;因为前…

Leetcode 528 按权重随机选择

题目信息 LeetoCode地址: . - 力扣&#xff08;LeetCode&#xff09; 题目理解 想象题目提供的w数组里是很多根长短不一的棍子&#xff0c;然后我们将其按顺序排列成一条线。 然后我们扔一个沙包&#xff0c;砸中哪一根棍子&#xff0c;就代表命中了那根棍子代表的数字。很…

MYSQL索引失效精讲

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小周同志&#xff0c;25届双非校招生Java选手&#xff0c;很高兴认识大家 &#x1f4d5;学习出处&#xff1a;本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 &#x1f525;如果感觉博主的文章还不错的话…

韩顺平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;作为一…

2023 E3 算法题第一题 (Difference Letter Count)

题的内容 Task 1 You are given a string letters made of N English letters. Count the number of different letters that appear in both uppercase and lowercase where all lowercase occurrences of the given letter appear before any uppercase occurrence. For exam…

在加载插件“sudoers_policy”时在 /etc/sudo.conf 第 19 行出错 的解决办法

背景 出现这个错误提示表明在加载sudoers_policy插件时遇到了问题&#xff0c;具体是在/etc/sudo.conf文件的第19行出现了错误&#xff0c;并且/usr/libexec/sudo/sudoers.so文件的所有权不正确&#xff0c;它必须属于用户ID为0的用户&#xff08;即root用户&#xff09; 解决…

文献阅读: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…