Merge pull request #1734 from mozilla/issue1726

Fixed #1726 (Imported 8khz training audio compromised by unfiltered upsampling)
This commit is contained in:
Kelly Davis 2018-11-17 21:52:38 +01:00 committed by GitHub
commit ccd75f2a1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 20 deletions

View File

@ -16,8 +16,8 @@ import os
import pandas
import subprocess
import unicodedata
import wave
import audioop
import librosa
import resampy
from util.text import validate_label
@ -142,7 +142,7 @@ def _split_wav_and_sentences(data_dir, trans_data, original_data, converted_data
print("splitting {} according to {}".format(wav_files, trans_file))
origAudios = [wave.open(wav_file, "r") for wav_file in wav_files]
origAudios = [librosa.load(wav_file, sr=None, mono=False) for wav_file in wav_files]
# Loop over segments and split wav_file for each segment
for segment in segments:
@ -160,26 +160,20 @@ def _split_wav_and_sentences(data_dir, trans_data, original_data, converted_data
if transcript != None:
files.append((os.path.abspath(new_wav_file), new_wav_filesize, transcript))
# Close origAudios
for origAudio in origAudios:
origAudio.close()
return pandas.DataFrame(data=files, columns=["wav_filename", "wav_filesize", "transcript"])
def _split_audio(origAudio, start_time, stop_time):
audioData, frameRate = origAudio
nChannels = len(audioData.shape)
startIndex = int(start_time * frameRate)
stopIndex = int(stop_time * frameRate)
return audioData[startIndex: stopIndex] if 1 == nChannels else audioData[:, startIndex: stopIndex]
def _split_and_resample_wav(origAudio, start_time, stop_time, new_wav_file):
nChannels = origAudio.getnchannels()
sampleWidth = origAudio.getsampwidth()
frameRate = origAudio.getframerate()
origAudio.setpos(int(start_time * frameRate))
chunkData = origAudio.readframes(int((stop_time - start_time) * frameRate))
# by doubling the frame-rate we effectively go from 8 kHz to 16 kHz
chunkData, _ = audioop.ratecv(chunkData, sampleWidth, nChannels, frameRate, 2 * frameRate, None)
chunkAudio = wave.open(new_wav_file, "w")
chunkAudio.setnchannels(nChannels)
chunkAudio.setsampwidth(sampleWidth)
chunkAudio.setframerate(2 * frameRate)
chunkAudio.writeframes(chunkData)
chunkAudio.close()
frameRate = origAudio[1]
chunkData = _split_audio(origAudio, start_time, stop_time)
chunkData = resampy.resample(chunkData, frameRate, 16000)
librosa.output.write_wav(new_wav_file, chunkData, 16000)
def _split_sets(filelist):
# We initially split the entire set into 80% train and 20% test, then

View File

@ -15,3 +15,5 @@ requests
tables
attrdict
setuptools
librosa
resampy