去除音轨中人声的算法

19

我想从mp3音轨中去除人声。我在谷歌上搜索并尝试了几款软件,但没有一个令人信服的。我计划读取mp3文件,获取波形,并去除超过指定限制的波形。

您有任何关于如何进行的建议吗?

-- 更新

我只需要能够读取mp3文件格式的代码。有这样的软件吗?


这将非常酷......你已经尝试过哪些软件了? - sholsapp
Audacity,Wavosaur和Extra Boy Pro - Boolean
Librosa可以进行人声分离。 - emallove
4个回答

17

这不算是一个“算法”,更像是一个“技巧”,但它可以在代码中自动化实现。它主要适用于声道中人声居中的立体声曲目。如果人声位于中心,则两个声道中都会表现出来。如果你反转其中一个声道,然后将它们合并在一起,中心人声的波形会相互抵消,几乎被移除。你可以使用大多数好的音频编辑器(如Audacity)手动完成这个过程。它不会给您完美的结果,其他音频也会稍微受到影响,但它非常适合卡拉OK轨道 :)


4
这被称为相位抵消,其主要缺点是生成的音轨是单声道的。 - arul
“其余的音频也会受到一些影响”——这种幸运的情况很少见。最有可能的情况是剩下的声音很少,而且听起来也很不对劲。然而,如果有超过立体声源(5.1等),通常可以做得更好。但这也并不简单。 - Display Name

10

来源:http://www.cdf.utoronto.ca/~csc209h/summer/a2/a2.html,作者:Daniel Zingaro。

声音是空气压力的波动。当声音产生时,由压缩(增加压力)和稀疏(降低压力)组成的声波通过空气传播。这与你将石头扔入池塘时发生的情况类似:水面上下起伏形成周期性波浪。

当麦克风记录声音时,它会测量空气压力并将其作为一个值返回。这些值称为样本,可以是正数或负数,对应于空气压力的增加或减少。每次记录空气压力时,我们都在取样声音。每个样本在时间上记录了声音的瞬间;我们采样得越快,就越准确地表示声音。采样率指的是我们每秒采样声音的次数。例如,CD音质使用每秒44100个样本的采样率;用于VOIP会话中的语音采样远远少于此。常见的采样率为11025(语音质量)、22050和44100(CD音质)...

对于单声道的声音(只有一个声道),样本只是表示在取样点处空气中压缩量的正数或负数整数。对于立体声声音(我们在此任务中使用的声音),一个样本实际上由两个整数值组成:一个用于左扬声器,一个用于右扬声器...

以下是去除人声算法的工作原理。

  • 将输入文件的前44个字节逐字复制到输出文件中。这44个字节包含重要的标头信息,不应更改。

  • 接下来,将输入文件的其余部分视为shorts序列。对于每个左右两个shorts,计算combined = (left - right) / 2。将combined的两份副本写入输出文件。

  • 为什么会生效?

    对于好奇的人,需要简要解释一下消除人声的算法。从算法中可以看出,我们只是减去一个通道的声音(然后除以2以保持音量不要太大)。那么为什么从右声道减去左声道会奇迹般地消除人声呢?

    当音乐被录制时,有时候人声是由单个麦克风录制的,并且这个单独的人声轨道用于两个声道的人声。歌曲中的其他乐器是由多个麦克风录制的,所以它们在两个声道中听起来不同。从一个声道中减去另一个声道会消除这两个声道之间“共同”的所有内容,如果我们很幸运,就意味着删除了人声。

    当然,事情很少有这么顺利。请尝试对此进行人声去除:badly-behaved wav file。确实,人声消失了,但音乐的主体也被削弱了!显然,一些乐器也采用了“中心”录制方式,这样在减去通道时会将它们与人声一起删除。


不,我只是听了这门课,所以我不必做。看起来链接不再有效了... - Daniel
1
WAV文件是具有一个或多个WAVE部分的RIFF文件。以这种方式修改文件可能会破坏具有多个WAVE部分的文件,并且还会覆盖其他部分,例如INFO和ID3标签。 - meklarian
我尝试使用WAV文件,但输出的WAV文件似乎已经损坏了。当我尝试用VLC打开输出的WAV文件时,会出现以下错误: wav demux error: cannot peek wav demux error: cannot find 'data' chunk wav demux error: An error occurred during wav demuxing ps demux error: cannot peek mpgv demux error: cannot peek mjpeg demux error: cannot peek ps demux error: cannot peek core input error: no suitable demux module for file/any:///home/srinivas/workspace/Extract%20Vocals/output.wav 有什么建议吗? - Srinivas
1
链接失效了! - Hardik

5
您可以使用pydub工具箱,详情请参见这里,还可以参见这里的相关问题。它依赖于FFmpeg,可以读取任何文件格式。
然后您可以执行以下操作:
from pydub import AudioSegment
from pydub.playback import play

# read in audio file and get the two mono tracks
sound_stereo = AudioSegment.from_file(myAudioFile, format="mp3")
sound_monoL = sound_stereo.split_to_mono()[0]
sound_monoR = sound_stereo.split_to_mono()[1]

# Invert phase of the Right audio file
sound_monoR_inv = sound_monoR.invert_phase()

# Merge two L and R_inv files, this cancels out the centers
sound_CentersOut = sound_monoL.overlay(sound_monoR_inv)

# Export merged audio file
fh = sound_CentersOut.export(myAudioFile_CentersOut, format="mp3")

我该如何从原始数据中移除centersOut的结果? - Akshay Hazari

1

超过指定限制?听起来像是高通滤波器...如果你有原声音轨和原始音轨,你可以使用相位抵消。否则,除非它是一个60年代旧曲,其中人声直接在中间,其他所有声音都被硬混音,否则我认为没有一种非常干净的方法可以去除人声。


1
你知道有什么方法可以分离输入声音中的不同声音吗?我的意思是,例如算法给我们100种不同的发现声音,并留下找到特定声音的任务由我们来移除。 - ConductedClever
@ConductedClever: https://en.wikipedia.org/wiki/Independent_component_analysis - user
或者更一般地说,https://zh.wikipedia.org/wiki/%E7%9B%B2%E5%8D%95%E5%A4%84%E7%90%86。 - user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接