音频如何分割成两段音频?这些实用方法值得收藏
Posted 玥茜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音频如何分割成两段音频?这些实用方法值得收藏相关的知识,希望对你有一定的参考价值。
有些时候,我们从网上下载的音频素材可能会出现体积较大、播放时间长等情况,而我们却只需要其中的一小段。这个时候我们就需要借助一些音频分割软件来将重要的音频片段提取出来,从而有助于缩小音频文件的占比以及存储。那么如何如何分割音频呢?一起来看看吧!
方法一:借助“配音工厂”来实现音频分割的操作。
软件介绍:
听到这个名字,就可以清楚的知道这是一款智能的配音APP,采用AI智能技术,一键配音,但今天我们主要讲的是它的“分割音频”功能,可以帮助我们提取音频中重要的部分,方便我们储存以及传输。
具体操作步骤如下:
步骤一:打开APP,选择“应用”中的“音频编辑”功能。
步骤二:选择“分割音频”工具。
步骤三:导入一段需要分割的音频,接着根据自己的需要拖动下方进度条进行分割,调整以后点击“分割”就完成操作了。
除了以上这个功能外,它还拥有提取伴奏、压缩音频、录音翻译等多种实用的功能,基本上可以满足大家的需求,大家可以自行体验一下啦!
方法二:借助“录音机”来实现音频分割的操作。
软件介绍:
这是每部手机自带的应用,平常我们会使用它来进行录音的操作,但是你们有没有发现,它还可以帮助我们对音频进行分割,一起来看看是如何操作的吧!
具体操作步骤如下:
步骤一:首先打开“录音机”,点开一段录音,再点击下方的“编辑”工具。
步骤二:进入页面以后,根据自己的需求拉动红色的进度条,然后再点击“裁剪”就完成了。
方法三:借助“录音转文字助手”来实现音频分割的操作。
软件介绍:
不要看到名字就以为它是一款录音转文字的软件,其实在这款APP中,还具有许多的音频编辑工具,比如:音频分割,一起来看看该如何操作吧!
具体操作步骤如下:
步骤一:打开APP,选择“工具”中的“音频分割”功能。
步骤二:上传一段音频文件,接着拖动上方的音频进度条,随后点击“开始分割”就好了。
好啦,今天关于“如何分割音频”的方法就分享到这里了。希望能对大家有所帮助,如果觉得不错的话,也可以将它分享给身边的其它小伙伴。
使用静音检测分割音频文件
【中文标题】使用静音检测分割音频文件【英文标题】:Split audio files using silence detection 【发布时间】:2018-01-13 14:01:27 【问题描述】:我有 200 多个 MP3 文件,我需要使用静音检测来拆分每个文件。我尝试了 Audacity 和 WavePad,但它们没有批处理,并且一个一个制作它们非常慢。
场景如下:
分割曲目,同时静音 2 秒或更长时间 然后在这些曲目的开头和结尾添加 0.5 s 并保存为 .mp3 比特率 192 立体声 标准化音量以确保所有文件的音量和质量都相同我试过 FFmpeg 但没有成功。
【问题讨论】:
看看How can I split a mp3 file?。 我已经成功使用了mp3DirectCut。话虽如此,*** 是一个编程问答网站。它不是请求软件或其他场外资源推荐的网站。 【参考方案1】:您可以尝试使用它在静音时拆分音频,而无需探索静音阈值的可能性
def split(filepath):
sound = AudioSegment.from_wav(filepath)
dBFS = sound.dBFS
chunks = split_on_silence(sound,
min_silence_len = 500,
silence_thresh = dBFS-16,
keep_silence = 250 //optional
)
注意,使用后silence_thresh值不需要调整。
另外,如果你想通过设置音频块的最小长度来分割音频,你可以在上面提到的代码之后添加这个。
target_length = 25 * 1000 //setting minimum length of each chunk to 25 seconds
output_chunks = [chunks[0]]
for chunk in chunks[1:]:
if len(output_chunks[-1]) < target_length:
output_chunks[-1] += chunk
else:
# if the last output chunk is longer than the target length,
# we can start a new one
output_chunks.append(chunk)
现在我们使用 output_chunks 进行进一步处理
【讨论】:
只是 FWIW,你能删除未使用的file
参数到 split
吗?这将节省其他人一分钟皱眉,想知道这是否在某个地方使用过。感谢您的帖子!【参考方案2】:
测试了所有这些解决方案,但没有一个对我有用,我找到了一个对我有用且速度相对较快的解决方案。
先决条件:
-
它适用于
ffmpeg
它基于本文 (https://***.com/a/37573133/2747626) 中 Vincent Berthiaume 的代码
它需要numpy
(尽管它不需要太多来自 numpy 的解决方案,没有numpy
的解决方案可能相对容易编写并进一步提高速度)
操作模式,原理:
-
这里提供的解决方案是基于 AI 的,或者非常慢,或者将整个音频加载到内存中,这对我的目的来说是不可行的(我想将巴赫的所有勃兰登堡协奏曲的录音分割成特定的歌曲, 2 LP 时长 2 小时,@ 44 kHz 16 位立体声,内存为 1.4 GB,速度非常慢)。从一开始,当我偶然发现这篇文章时,我就告诉自己必须有一个简单的方法,因为这只是一个阈值过滤操作,不需要太多开销,一次可以在一小块音频上完成。几个月后,我偶然发现了https://***.com/a/37573133/2747626,这让我产生了相对高效地完成音频分割的想法。
命令行参数提供源 mp3(或任何 ffmpeg 可以读取的内容)、静音持续时间和噪声阈值。对于我的巴赫 LP 录音,1 秒 0.01 的全振幅就可以了。
它让
ffmpeg
将输入转换为无损的 16 位 22kHz PCM 并通过subprocess.Popen
将其传回,其优势在于ffmpeg
的速度非常快,而且在不占用太多内存的小块中。
回到python,最后一个和最后一个缓冲区的2个临时numpy
数组被连接起来,并检查它们是否超过给定的阈值。如果他们不这样做,则意味着有一段沉默,并且(我天真地承认)只需计算“沉默”的时间。如果时间至少与给定的分钟一样长。沉默持续时间,(再次天真地)将当前间隔的中间作为分裂时刻。
该程序实际上并没有对源文件做任何事情,而是创建一个可以运行的批处理文件,告诉ffmpeg
获取由这些“静音”限定的段并将它们保存到单独的文件中。
然后,用户可以运行输出批处理文件,可能会过滤一些重复的带有微小静音块的微小间隔,以防歌曲之间出现长时间的停顿。
此解决方案既有效又快速(此线程中的其他解决方案均不适合我)。
小代码:
import subprocess as sp
import sys
import numpy
FFMPEG_BIN = "ffmpeg.exe"
print 'ASplit.py <src.mp3> <silence duration in seconds> <threshold amplitude 0.0 .. 1.0>'
src = sys.argv[1]
dur = float(sys.argv[2])
thr = int(float(sys.argv[3]) * 65535)
f = open('%s-out.bat' % src, 'wb')
tmprate = 22050
len2 = dur * tmprate
buflen = int(len2 * 2)
# t * rate * 16 bits
oarr = numpy.arange(1, dtype='int16')
# just a dummy array for the first chunk
command = [ FFMPEG_BIN,
'-i', src,
'-f', 's16le',
'-acodec', 'pcm_s16le',
'-ar', str(tmprate), # ouput sampling rate
'-ac', '1', # '1' for mono
'-'] # - output to stdout
pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=10**8)
tf = True
pos = 0
opos = 0
part = 0
while tf :
raw = pipe.stdout.read(buflen)
if raw == '' :
tf = False
break
arr = numpy.fromstring(raw, dtype = "int16")
rng = numpy.concatenate([oarr, arr])
mx = numpy.amax(rng)
if mx <= thr :
# the peak in this range is less than the threshold value
trng = (rng <= thr) * 1
# effectively a pass filter with all samples <= thr set to 0 and > thr set to 1
sm = numpy.sum(trng)
# i.e. simply (naively) check how many 1's there were
if sm >= len2 :
part += 1
apos = pos + dur * 0.5
print mx, sm, len2, apos
f.write('ffmpeg -i "%s" -ss %f -to %f -c copy -y "%s-p%04d.mp3"\r\n' % (src, opos, apos, src, part))
opos = apos
pos += dur
oarr = arr
part += 1
f.write('ffmpeg -i "%s" -ss %f -to %f -c copy -y "%s-p%04d.mp3"\r\n' % (src, opos, pos, src, part))
f.close()
【讨论】:
非常感谢!读取原始文件后,我可以使用***.com/questions/24885092/… 找到静音 你如何争辩这在某种程度上是高性能的?并且不会将所有音频文件加载到内存中? 好吧,我没有整理出精确的结果表(我很着急),但是我在这里遇到的基于 AI 和pydub
的解决方案将整个音频加载到内存中ONCE 这意味着我的长音频文件需要 2 GB 的数据,并且需要很长时间才能解码 mp3。我提供的解决方案非常快(在我的设置中),一次只加载一小部分音频,@Curcuma_
嘿,它不适合我给出这个错误 - drive.google.com/file/d/1VelQaA_hHoeyaBuB5WTNFRIQDPBH2lIs/… 你能在这里帮我吗,或者如果你有时间更新你的答案中的工作代码
问题是 numpy.fromstring 很久以前就被弃用了,因为我猜它在我的笔记本电脑上显示了这个错误。【参考方案3】:
我发现pydub 是最简单的工具,可以以简单的方式和紧凑的代码进行这种音频处理。
你可以安装pydub
pip install pydub
如果需要,您可能需要安装 ffmpeg/avlib。详情请见this link。
这是一个可以满足您要求的 sn-p。 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 chunk0.mp3.".format(i))
normalized_chunk.export(
".//chunk0.mp3".format(i),
bitrate = "192k",
format = "mp3"
)
如果您的原始音频是立体声(2 声道),那么您的块也将是立体声。 您可以像这样检查原始音频:
>>> song.channels
2
【讨论】:
请注意,split_on_silence()
具有 keep_silence=100
,其中已包含 200 毫秒的被检测为静默的时间(开始时为 100 毫秒)。您可以在开始和结束时仅添加 400 毫秒的静音,或者执行 keep_silence=500
以使用文件中的静音并避免添加您自己的静音。
请注意,此库不支持流式传输。即,它将尝试将整个声音文件加载到内存中。在 32 位系统中大文件的情况下,可能会抛出内存错误。不过,还有其他库需要考虑,例如 pyAudioAnalysis。此外,检测静音也很棘手,尤其是当它不是完全没有声音并且很难调整参数时。
@Anil_M 如何调整 min_silence_len 和 quiet_thresh?
@AadityaUra - 答案有示例 min_silence_len /silence_threshold 值。您将需要尝试不同的值,看看哪种组合适合您的要求。
应该可以,试试song= AudioSegment.from_file("your_mp4_audio.mp4", "mp4")
以上是关于音频如何分割成两段音频?这些实用方法值得收藏的主要内容,如果未能解决你的问题,请参考以下文章