如何编辑音频以使它们具有相同的长度

信息处理 信号分析 声音的 语音处理 语音识别
2022-01-31 15:23:09

我有一个音频文件数据集,它们的长度相差几毫秒。有些比 1s 短一点,有些比 1s 长一点。它们都具有相同的采样率,即 20kHz,不同的是采样的数量。

有谁知道自动将它们转换为 20kHz 采样率的 1s 音频文件的方法?

编辑:我需要将音频转换为具有相同长度,以便我可以将它们输入到标准的全连接神经网络中。

我认为,如果音频长于 1 秒,则在开头和结尾剪切音频将是最好的解决方案。比如音频长1.1s,那我想把音频开头和结尾各剪5ms,转换成1s音频?如果数据更短,以某种方式在数据末尾添加一些“沉默”?

先感谢您!

3个回答

ImageMagick 是在命令行中编辑多个图像的好工具。感谢您的问题,我刚刚发现了SoX 或 Sound eXchange

SoX 是一个跨平台(Windows、Linux、MacOS X 等)命令行实用程序,可以将各种格式的计算机音频文件转换为其他格式。它还可以对这些声音文件应用各种效果,并且作为额外的奖励,SoX 可以在大多数平台上播放和录制音频文件。

它可以修剪、裁剪、剪切多个文件(也可以重新采样),例如:

对于较短的文件,一个选项是创建一个静音文件,发生它,然后再次裁剪,例如:Linux command to extend the duration of audio files

为了使您的音频 wav 文件更长,您可以在 linux 中使用 sox :

sox input.wav output.wav 修剪 0 00:01

这将占用 1 秒的音频输入并将其放入 output.wav。如果它短于 1 秒,它可能会起作用,但我不知道。

另一种解决方案是用 C/whatever 程序实际做你想做的事,这不会很难做到,但你可能不想那样做。

我猜 Sox 可能对您的问题有一个简单而有效的解决方案。

我用python编写了这段代码,它还没有优化,但它仍然对我很有效

from pydub import AudioSegment
from pydub.utils import mediainfo


in_wav = "input.wav"
out_wav = "output file"

with contextlib.closing(wave.open(in_wav,'r')) as f:
            frames = f.getnframes()
            rate = f.getframerate()
            duration = int(((frames / float(rate)))*1000) # input file duration
            
            if(duration < 1000):  #if its less then 1s
                newd=1000-duration
                if(newd%2==0):
                    pair=0
                else:
                    pair=1
                
                durbeg=(newd)/2+pair # the time of silence in the begging
                
                durend=(newd)/2 # the time of silence in the end
                
                
                # create silence audio segment of begging
                beg_sec_segment = AudioSegment.silent(duration=durbeg)  #duration in milliseconds
                # create of silence audio segment of end
                end_sec_segment = AudioSegment.silent(duration=durend)  #duration in milliseconds
                
                song = AudioSegment.from_wav(in_wav)
                
                
                #Add above two audio segments    
                final_song = beg_sec_segment + song + end_sec_segment
                
                final_song.export(out_wav, format="wav")