Skip to content

Instantly share code, notes, and snippets.

@portableant
Created May 19, 2020 11:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save portableant/95ce00ccc8f0cf797f366864034b1887 to your computer and use it in GitHub Desktop.
Save portableant/95ce00ccc8f0cf797f366864034b1887 to your computer and use it in GitHub Desktop.
#!/usr/bin/python
## Split audio files into chunks
## Daniel Pett 1/5/2020
__author__ = 'portableant'
## Tested on Python 2.7.16 - yes I know I need to upgrade.
import argparse
import os
import speech_recognition as sr
import csv
from csv import writer
from pydub import AudioSegment
from pydub.utils import which
AudioSegment.converter = which("ffmpeg")
from pydub.utils import make_chunks
r = sr.Recognizer()
parser = argparse.ArgumentParser(description='A script for splitting audio files into segments')
parser.add_argument('-m,', '--mp3', help='The MP3 convert folder', required=True)
parser.add_argument('-l', '--length', help='Length of chunk', required=True)
# An example would be --length 10000
# Parse arguments
args = parser.parse_args()
path = args.path
mp3 = args.mp3
destination = args.destination
length = args.length
chwav = '/Users/danielpett/Documents/githubProjects/fitz-transcribe-nile/chunk-wav/'
chmp3 = '/Users/danielpett/Documents/githubProjects/fitz-transcribe-nile/chunk-mp3/'
# Chunk mp3 files and convert to wav
for file in os.listdir(mp3):
print('Now processing: ' + file)
myaudio = AudioSegment.from_file(os.path.join(mp3,file), "mp3")
# Make chunks of length specified
chunk_length_ms = length
chunks = make_chunks(myaudio, int(length))
for i, chunk in enumerate(chunks):
processedFileName = os.path.splitext(file)[0]
chunk_name_mp3 = processedFileName + "_Chunk{0}.mp3".format(i)
print("Now exporting: " , chunk_name_mp3)
print(os.path.join(chmp3,chunk_name_mp3))
chunk.export(os.path.join(chmp3,chunk_name_mp3), format="mp3")
chunk_name_wav = processedFileName + "_Chunk{0}.wav".format(i)
print("Now exporting: " , chunk_name_wav)
chunk.export(os.path.join(chwav,chunk_name_wav), format="wav")
# Create the csv file for Pybossa import
transcriptions = []
for file in os.listdir(chwav):
print('Now processing: ' + file)
if file.endswith('.wav'):
print("Source file " + file)
sourceFile = os.path.join(chwav,file)
audio = AudioSegment.from_file(sourceFile)
duration = audio.duration_seconds
if(duration > 1):
with sr.AudioFile(sourceFile) as source:
# listen for the data (load audio to memory)
audio_data = r.record(source)
# recognize (convert from speech to text)
text = r.recognize_google(audio_data)
print('Output for ' + file + ': ' + text)
extension = '.mp3'
basefile = os.path.splitext(file)[0] + extension
print(basefile)
mp3file = os.path.join('https://fitz-audio-guide-micropasts.s3.eu-west-2.amazonaws.com/',basefile)
transcriptions.append([mp3file,text])
print(transcriptions)
csvOutput = '/Users/danielpett/Documents/githubProjects/fitz-transcribe-nile/csv/transcriptions.csv'
file_exists = os.path.isfile(csvOutput)
with open (csvOutput, 'w') as csvfile:
writer = csv.writer(csvfile , lineterminator='\n')
writer.writerow(['track','currentTranscription'])
for tup in transcriptions:
writer.writerow(tup)
print('Good job my friend!')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment