GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Ubuntu:¿Dividir el audio en varias piezas en función de las marcas de tiempo de un archivo de texto con Sox o Ffmpeg?

Miré el siguiente enlace:Recortar archivo de audio usando tiempos de inicio y finalización

Pero esto no responde completamente a mi pregunta. Mi problema es:tengo un archivo de audio como abc.mp3 o abc.wav . También tengo un archivo de texto que contiene marcas de tiempo de inicio y fin:

0.0 1.0 silence  
1.0 5.0 music  
6.0 8.0 speech    

Quiero dividir el audio en tres partes usando Python y sox /ffmpeg , lo que da como resultado tres archivos de audio separados.

¿Cómo logro esto usando sox? o ffmpeg ?

Luego quiero calcular el MFCC correspondiente a esas porciones usando librosa .

Tengo Python 2.7 , ffmpeg y sox en una instalación de Ubuntu Linux 16.04.

Respuesta aceptada:

Acabo de probarlo rápidamente, muy poco en la forma de prueba, así que tal vez sea de ayuda. A continuación se basa en ffmpeg-python, pero no sería un desafío escribir con subprocess de todos modos.

Por el momento, el archivo de entrada de tiempo solo se trata como pares de tiempos, inicio y final, y luego un nombre de salida. Los nombres que faltan se reemplazan como linecount.wav

import ffmpeg
from sys import argv

""" split_wav `audio file` `time listing`

    `audio file` is any file known by local FFmpeg
    `time listing` is a file containing multiple lines of format:
        `start time` `end time` output name 

    times can be either MM:SS or S*
"""

_in_file = argv[1]

def make_time(elem):
    # allow user to enter times on CLI
    t = elem.split(':')
    try:
        # will fail if no ':' in time, otherwise add together for total seconds
        return int(t[0]) * 60 + float(t[1])
    except IndexError:
        return float(t[0])

def collect_from_file():
    """user can save times in a file, with start and end time on a line"""

    time_pairs = []
    with open(argv[2]) as in_times:
        for l, line in enumerate(in_times):
            tp = line.split()
            tp[0] = make_time(tp[0])
            tp[1] = make_time(tp[1]) - tp[0]
            # if no name given, append line count
            if len(tp) < 3:
                tp.append(str(l) + '.wav')
            time_pairs.append(tp)
    return time_pairs

def main():
    for i, tp in enumerate(collect_from_file()):
        # open a file, from `ss`, for duration `t`
        stream = ffmpeg.input(_in_file, ss=tp[0], t=tp[1])
        # output to named file
        stream = ffmpeg.output(stream, tp[2])
        # this was to make trial and error easier
        stream = ffmpeg.overwrite_output(stream)

        # and actually run
        ffmpeg.run(stream)

if __name__ == '__main__':
    main()

Ubuntu
  1. ¿Cómo analizar un segmento de un archivo de audio con Sox?

  2. ¿Instalar Ubuntu desde un archivo Iso en Windows?

  3. ¿Desinstalar Kubuntu de un arranque dual con Ubuntu?

  4. ffmpeg divide avi en fotogramas con velocidad de fotogramas conocida

  5. ¿Cómo dividir un archivo de texto en varios archivos *.txt?

Cómo manejar archivos con Scilab en Ubuntu 15.04

Cómo mostrar datos de un archivo de texto en Linux

Convierte texto a voz con eSpeak en Ubuntu

¿Cómo dividir un archivo Mp3?

¿Cómo hacer que el archivo de texto creado en Ubuntu sea compatible con el Bloc de notas de Windows?

Cómo transferir archivos de Ubuntu a Ipad Air 4 con una unidad flash USB