当前位置: 首页 > 面试题库 >

使用静音检测拆分音频文件

狄宗清
2023-03-14
问题内容

我有200多个MP3文件,我需要使用静音检测来拆分其中的每个文件。我尝试了Audacity和WavePad,但它们没有批处理过程,将它们一一制作很慢。

场景如下:

  • 分割曲目,而静音2秒或更长时间
  • 然后在这些音轨的开头和结尾添加0.5 s并将其另存为.mp3
  • BitRate 192立体声
  • 标准化卷以确保所有文件的卷和质量相同

我尝试了FFmpeg,但没有成功。


问题答案:

我发现pydub是用简单的方法和紧凑的代码来进行这种音频处理的最简单工具。

您可以安装pydub与

pip install pydub

如果需要,您可能需要安装ffmpeg / avlib。有关更多详细信息,请参见此链接。

这是您所要求的代码片段。某些参数(例如silence_threshold和)target_dBFS可能需要进行调整以符合您的要求。总体而言,mp3尽管我必须尝试为设置不同的值,但我仍然能够拆分文件silence_threshold

片段

# Import the AudioSegment class for processing audio and the 
# split_on_silence function for separating out silent chunks.
from pydub import AudioSegment
from pydub.silence import split_on_silence

# Define a function to normalize a chunk to a target amplitude.
def match_target_amplitude(aChunk, target_dBFS):
    ''' Normalize given audio chunk '''
    change_in_dBFS = target_dBFS - aChunk.dBFS
    return aChunk.apply_gain(change_in_dBFS)

# Load your audio.
song = AudioSegment.from_mp3("your_audio.mp3")

# Split track where the silence is 2 seconds or more and get chunks using 
# the imported function.
chunks = split_on_silence (
    # Use the loaded audio.
    song, 
    # Specify that a silent chunk must be at least 2 seconds or 2000 ms long.
    min_silence_len = 2000,
    # Consider a chunk silent if it's quieter than -16 dBFS.
    # (You may want to adjust this parameter.)
    silence_thresh = -16
)

# Process each chunk with your parameters
for i, chunk in enumerate(chunks):
    # Create a silence chunk that's 0.5 seconds (or 500 ms) long for padding.
    silence_chunk = AudioSegment.silent(duration=500)

    # Add the padding chunk to beginning and end of the entire chunk.
    audio_chunk = silence_chunk + chunk + silence_chunk

    # Normalize the entire chunk.
    normalized_chunk = match_target_amplitude(audio_chunk, -20.0)

    # Export the audio chunk with new bitrate.
    print("Exporting chunk{0}.mp3.".format(i))
    normalized_chunk.export(
        ".//chunk{0}.mp3".format(i),
        bitrate = "192k",
        format = "mp3"
    )

如果您的原始音频是立体声(2声道),则您的块也将是立体声。您可以像这样检查原始音频:

>>> song.channels
2


 类似资料:
  • 我对ffmpeg相当陌生,我正试图用另一个文件替换第一个音频文件的一部分。第二个文件可能太短,因此应该存在某种循环。 经过一些研究,我提出了以下命令参数,只要我只做一次替换,它就会给出输出。但我想做多个替换。我做错了什么有什么帮助吗?也非常欢迎对工作方式提出任何建议/意见。 (以下命令中的任何错别字都可以忽略,我通过脚本生成命令,为了便于使用,我简化了名称。) 作品(更换1件):

  • 我正尝试使用以下命令与最新的ffmpeg构建从我的.mp3文件中删除静默: 但是,会产生以下输出: 感谢任何帮助!

  • 我正在尝试实现自动录音功能,类似于Talking Tom应用程序。我使用以下代码读取音频记录器的输入并分析缓冲区: 现在,我能够检测来自录音机的语音输入,并可以分析音频缓冲区。 缓冲区转换为浮点值,如果增加一定量,则假定背景中存在一些声音并开始录制。但问题是应用程序开始录制所有背景噪音,包括风扇/交流管道声音。 有人能帮我分析一下只检测人声的缓冲区吗?或者有没有其他方法可以从录音机输入中检测人声?

  • 问题内容: 在Java中开始录制操作时,如何检测静音?什么是PCM数据?如何在Java中计算PCM数据? 我找到了解决方案: 问题答案: 在Java中开始录制操作时,如何检测静音? 计算一组声音帧的dB或RMS值,并确定将其视为“静音”的级别。 什么是PCM数据? 数据是在脉冲编码调制格式。 如何在Java中计算PCM数据? 我不明白这个问题。但是,猜测它与标记有关,我有一些坏消息。从理论上讲,这

  • 问题内容: 我正在设计一个简单的调谐器,所以我的目标是显示音符名称(A,B,F#)以及理论声音和实际输入之间的 距离( 以分为单位)。 我是音频和信号处理的新手,所以我做了一些研究,发现 了一个 叫做快速傅立叶变换 的东西 ,它可以分析字节并给我频率。另外,我发现了一些Java库,例如通用数学和JTransforms,所以我不会自己编写硬代码。 我相信就这样,因为每个范围的频率都可以以相同的气质直

  • 需要您的帮助,我检查音频流是否当您按下按钮或当程序启动的时刻,当您按下按钮,音频流是不可用的,然后没有发生,音乐没有播放,没有任何响应从程序没有我想让您认识到如何这样的响应尽可能做吗?