2010-09-09 9 views
13

Quiero eliminar las voces de las pistas de sonido mp3. Busqué en Google y probé algunos softwares, pero ninguno de ellos es convincente. Estoy planeando leer el archivo mp3, obtener una forma de onda y eliminar la forma de onda que está por encima de un límite especificado.Algoritmo para eliminar la voz de la pista de sonido

tiene alguna sugerencia sobre cómo proceder.

- Actualización

sólo quiero código que puede leer el formato de archivo mp3. ¿Hay algún software?

+0

Esto sería muy bien ... lo softwares han intentado ya? – sholsapp

+0

audacity, wavosaur y extra boy pro – Boolean

Respuesta

14

Esto no es tanto un "algoritmo" como un "truco", sino que podría ser automático en el código. Funciona principalmente para pistas estéreo con las voces centradas. Si las voces están centradas, se manifiestan por igual en ambas pistas. Si invierte una de las pistas y luego las fusiona nuevamente, las formas de onda de las voces centrales se cancelan y se eliminan virtualmente. Puede hacerlo manualmente con la mayoría de los buenos editores de audio como audacity. No le da resultados perfectos y el resto del audio también sufre un poco, pero hace excelentes pistas de karaoke :)

+4

Se llama cancelación de fase, la principal desventaja es que la pista producida es mono – arul

+0

> "el resto del audio también sufre un poco": este escenario de suerte es raro. el caso más probable es que queda poco sonido y también suena muy mal. sin embargo, generalmente se puede hacer algo mejor si uno tiene una fuente más que estéreo (5.1, etc.). pero tampoco es tan simple –

0

¿Sobre un límite especificado? suena como un filtro de paso alto ... Podría usar la cancelación de fase si tuviera la pista de acapella junto con el original. De lo contrario, a menos que sea una pista antigua de la década de los 60 que tenga voces directamente en el medio y todo lo demás sea difícil, no creo que haya una forma súper limpia de eliminar las voces.

+1

¿Hay alguna manera que conozcas para separar los diferentes sonidos del sonido de entrada? me refiero, por ejemplo, a que el algoritmo nos da, por ejemplo, 100 sonidos encontrados diferentes y deja que nos sean eliminados los sonidos específicos. – ConductedClever

+0

@ConductedClever: https://en.wikipedia.org/wiki/Independent_component_analysis – user

+0

O, más en general, https://en.wikipedia.org/wiki/Blind_signal_separation – user

8

Fuente: http://www.cdf.utoronto.ca/~csc209h/summer/a2/a2.html, escrita por Daniel Zingaro.

Sounds are waves of air pressure. When a sound is generated, a sound wave consisting of compressions (increases in pressure) and rarefactions (decreases in pressure) moves through the air. This is similar to what happens if you throw a stone into a pond: the water rises and falls in a repeating wave.

When a microphone records sound, it takes a measure of the air pressure and returns it as a value. These values are called samples and can be positive or negative corresponding to increases or decreases in air pressure. Each time the air pressure is recorded, we are sampling the sound. Each sample records the sound at an instant in time; the faster we sample, the more accurate is our representation of the sound. The sampling rate refers to how many times per second we sample the sound. For example, CD-quality sound uses a sampling rate of 44100 samples per second; sampling someone's voice for use in a VOIP conversation uses far less than this. Sampling rates of 11025 (voice quality), 22050, and 44100 (CD quality) are common...

For mono sounds (those with one sound channel), a sample is simply a positive or negative integer that represents the amount of compression in the air at the point the sample was taken. For stereo sounds (which we use in this assignment), a sample is actually made up of two integer values: one for the left speaker and one for the right...

Here's how the algorithm [to remove vocals] works.

  • Copy the first 44 bytes verbatim from the input file to the output file. Those 44 bytes contain important header information that should not be modified.

  • Next, treat the rest of the input file as a sequence of shorts. Take each pair of shorts left and right, and compute combined = (left - right) /2. Write two copies of combined to the output file.

Why Does This Work?

For the curious, a brief explanation of the vocal-removal algorithm is in order. As you noticed from the algorithm, we are simply subtracting one channel from the other (and then dividing by 2 to keep the volume from getting too loud). So why does subtracting the left channel from the right channel magically remove vocals?

When music is recorded, it is sometimes the case that vocals are recorded by a single microphone, and that single vocal track is used for the vocals in both channels. The other instruments in the song are recorded by multiple microphones, so that they sound different in both channels. Subtracting one channel from the other takes away everything that is ``in common'' between those two channels which, if we're lucky, means removing the vocals.

Of course, things rarely work so well. Try your vocal remover on this badly-behaved wav file . Sure, the vocals are gone, but so is the body of the music! Apparently, some of the instruments were also recorded "centred", so that they are removed along with the vocals when channels are subtracted.

+0

¿Has probado esto? – ConductedClever

+0

Nah, solo audité la clase, así que no tuve que hacerlo. Parece que el enlace ya no funciona ... – Daniel

+1

Los archivos WAV son archivos RIFF con una o más secciones WAVE. Modificar el archivo de esta manera puede romper archivos con múltiples secciones WAVE y también afectará a otras partes, como las etiquetas INFO e ID3. – meklarian

4

Puede utilizar la caja de herramientas pydub, ver here para más detalles, véase también here para la pregunta relacionada. Es dependiente de FFmpeg y puede leer cualquier formato de archivo

A continuación, puede hacer lo siguiente:

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") 
+0

¿Cómo elimino los centersOut resultantes del original? –

Cuestiones relacionadas