”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何使用 Python 降低歌曲的音调

如何使用 Python 降低歌曲的音调

发布于2024-10-31
浏览:473

How to Down-Pitch A Song Using Python

如果您曾经想改变歌曲的音调而不改变其速度,那么这篇博文适合您。变调是音乐家、DJ 和音频工程师的常见任务。在本教程中,我们将探索如何使用 Python 和 pydub 库降低歌曲的音调,并将此过程自动应用于文件夹中的多首歌曲。

为什么要进行变调?

在音乐中,变调意味着改变歌曲的音调(升高或降低)而不加快或减慢它的速度。这对于:

很有用
  • 将一首歌曲的调与另一首曲目匹配

  • 将歌曲移调至不同调的乐器

  • 创建混音或混搭

您需要的工具

我们将使用Python库pydub来操作音频文件。您可以使用 pip 安装它:

pip install pydub

此外,pydub 需要 ffmpeg 来处理 MP3 等音频文件。您可以通过终端安装ffmpeg:

sudo apt install ffmpeg

变调分步指南

现在让我们深入研究自动为文件夹中的多首歌曲进行变调的 Python 脚本。该脚本循环遍历歌曲文件夹中的文件,将它们调低半音(半音 = -1),并将新文件保存到输出文件夹中。

守则

import os
from pydub import AudioSegment

# Function to shift pitch down
def pitch_shift(audio, semitones):
    # Adjust sample rate to shift pitch
    new_sample_rate = int(audio.frame_rate * (2.0 ** (semitones / 12.0)))
    return audio._spawn(audio.raw_data, overrides={'frame_rate': new_sample_rate}).set_frame_rate(audio.frame_rate)

# Input and output folders
input_folder = './songs'
output_folder = './output'

# Ensure the output folder exists
os.makedirs(output_folder, exist_ok=True)

# Loop through all files in the songs folder
for filename in os.listdir(input_folder):
    # Check if the file is an audio file (e.g., mp3 or wav)
    if filename.endswith(".mp3") or filename.endswith(".wav"):
        # Construct the full file path
        input_path = os.path.join(input_folder, filename)
        output_path = os.path.join(output_folder, filename)

        # Load the audio file
        audio = AudioSegment.from_file(input_path)

        # Shift pitch down by a half-step (semitone = -1)
        shifted_audio = pitch_shift(audio, -1)

        # Export the pitch-shifted audio to the output folder
        shifted_audio.export(output_path, format="mp3")
        print(f"Processed and saved: {output_path}")

解释

  1. 导入库:
    我们导入 os 来处理文件目录,并从 pydub 导入 AudioSegment 来操作音频文件。

  2. 变调功能:
    itch_shift 函数调整音频的采样率。当我们改变采样率时,音调就会改变。在这种情况下,我们使用以下公式计算新的采样率,将音高降低一个半音:

    new_sample_rate = int(audio.frame_rate * (2.0 ** (半音 / 12.0)))

  3. 输入和输出文件夹:
    我们定义将读取音频文件并保存变调版本的文件夹。如果输出文件夹不存在,则会创建该文件夹。

  4. 循环播放歌曲:
    使用 os.listdir(),我们循环遍历歌曲文件夹中的每个文件。该脚本在处理文件之前会检查该文件是否是音频文件(.mp3 或 .wav)。对于每个文件:

    • 它加载音频。
    • 应用pitch_shift功能,将音高降低半步。
    • 移调后的音频将导出到输出文件夹。
  5. 导出和反馈:
    处理完成后,变调后的歌曲将保存在输出文件夹中,并打印一条确认消息。

运行脚本

确保歌曲文件夹中有音频文件,然后运行脚本:

python -m pitch_down.py

移调后的文件将保存在输出文件夹中。

定制化

您可以轻松地将此脚本修改为:

  • 通过传递正值来提高音频的音调(例如,pitch_shift(audio, 1) 表示升高半步)。

  • 通过在条件检查中添加其他扩展名(例如 .ogg 或 .flac)来处理不同的文件格式。

  • 通过调整半音参数来移动不同数量的半音。

结论

该脚本是一种使用 Python 对多个音频文件进行音高转换的简单而强大的方法。使用 pydub 和 ffmpeg,您可以批量操作音频文件,使音乐家、制作人或任何使用音频的人员更轻松地完成音调校正或音频准备等任务。

请随意尝试此脚本,看看如何使其适应您的需求。快乐编码!

版本声明 本文转载于:https://dev.to/highcenburg/how-to-down-pitch-a-song-using-python-1opc?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-05-02
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-05-02
  • 在Java中如何高效匹配多行文本的正则表达式技巧
    在Java中如何高效匹配多行文本的正则表达式技巧
    在尝试在Java中使用JAVA中的正则表达式匹配多行文本时,使用多行文本匹配的正则表达式来使用某些考虑。模式.multiniline修饰符和(?m)速记似乎可以呈现出意外的结果。要理解行为,必须阐明修饰符的目的是必不可少的。 pattern.multiniline(?m)使锚点 ^(线的启动)和$...
    编程 发布于2025-05-02
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-05-02
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的python功能eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-05-02
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-05-02
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-02
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-05-02
  • PHP阵列键值异常:了解07和08的好奇情况
    PHP阵列键值异常:了解07和08的好奇情况
    PHP数组键值问题,使用07&08 在给定数月的数组中,键值07和08呈现令人困惑的行为时,就会出现一个不寻常的问题。运行print_r($月份)返回意外结果:键“ 07”丢失,而键“ 08”分配给了9月的值。此问题源于PHP对领先零的解释。当一个数字带有0(例如07或08)的前缀时,PHP将...
    编程 发布于2025-05-02
  • PHP与C++函数重载处理的区别
    PHP与C++函数重载处理的区别
    作为经验丰富的C开发人员脱离谜题,您可能会遇到功能超载的概念。这个概念虽然在C中普遍,但在PHP中构成了独特的挑战。让我们深入研究PHP功能过载的复杂性,并探索其提供的可能性。在PHP中理解php的方法在PHP中,函数超载的概念(如C等语言)不存在。函数签名仅由其名称定义,而与他们的参数列表无关。...
    编程 发布于2025-05-02
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-05-02
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-05-02
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-05-02
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-05-02
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-05-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3