从声道中去除声音的算法

时间:2010-09-09 00:55:11

标签: algorithm audio mp3 signal-processing voice

我想从mp3音轨中删除人声。我搜索谷歌,并尝试了一些软件,但没有一个是令人信服的。我打算读取mp3文件,获取波形并删除超出指定限制的波形。

您对如何继续提出任何建议。

- 更新

我只想要能够读取mp3文件格式的代码。有没有软件?

4 个答案:

答案 0 :(得分:17)

这不是一个“算法”作为“技巧”,但它可以在代码中自动化。它主要用于人声居中的立体声音轨。如果人声居中,则它们在两个轨道中均匀显示。如果您反转其中一个轨道然后将它们合并在一起,则中心人声的波形会被取消并被虚拟删除。您可以使用大胆的大多数优秀音频编辑器手动执行此操作。它没有给你完美的结果,其余的音频也受到了影响,但它创造了很棒的卡拉OK曲目:))

答案 1 :(得分:10)

来源:http://www.cdf.utoronto.ca/~csc209h/summer/a2/a2.html,由Daniel Zingaro撰写。

  

声音是气压波。什么时候   产生声音,声波   由压缩组成(增加   在压力)和稀有   (压力下降)通过   空气。这类似于什么   如果你扔石头就会发生   池塘:水涨起来   重复浪潮。

     

当麦克风录制声音时,它   测量气压   并将其作为值返回。这些   值称为样本,可以   正面或负面对应   空气增加或减少   压力。每次气压   记录,我们正在抽样   声音。每个样本都记录声音   在瞬间;我们越快   样品,我们更准确   表示声音。该   采样率是指多少次   我们每秒采样声音。对于   例如,CD音质使用a   采样率为44100个样本   第二;抽取某人的声音   在VOIP会话中使用远   不到这个。采样率   11025(语音质量),22050和   44100(CD质量)很常见......

     

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

     

以下是[删除人声]算法的工作原理。

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

  •   
  • 接下来,将输入文件的其余部分视为一系列短路。采取   每双短裤左右   和计算组合=(左 - 右)   / 2.写两份合并到的   输出文件。

  •   
     

为什么会这样?

     

对于好奇,一个简短的解释   声音去除算法的用途   订购。正如你从中注意到的那样   算法,我们简单地减去   来自另一个的一个渠道(然后   除以2以保持音量   变得太大声了。那么为什么呢   从中减去左通道   右声道神奇地删除了人声?

     

当录制音乐时,它就是   有时是人声的情况   由单个麦克风录制,和   单个声道用于   两个频道的人声。另一个   歌曲中的乐器被录制   通过多个麦克风,使他们   两个声道都有不同的声音。   从另一个中减去一个通道   带走了所有的东西   这两个渠道之间的共同点   如果我们幸运的话,那意味着去除   人声。

     

当然,事情很少奏效。   试试你的声音去除器   badly-behaved wav file。当然,   人声消失了,但身体也消失了   音乐!显然,有些人   仪器也被记录下来   “居中”,以便将它们移除   与频道一起的人声   被减去。

答案 2 :(得分:5)

您可以使用pydub工具箱,有关详细信息,请参阅here,有关相关问题,另请参阅here。它依赖于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")

答案 3 :(得分:1)

超过指定限制?听起来像一个高通滤波器......如果你有acapella轨道和原始轨道,你可以使用相位取消。否则,除非它是一部60年代的老式音乐,直接在中间演唱,而其他所有音乐都被淘汰,我认为没有一种超级干净的方法可以消除人声。