Calculate wav metadata

This commit is contained in:
Brandon Thomas
2022-12-11 21:35:09 -05:00
parent 1220c7c0cd
commit 0b9b7f7c4d
3 changed files with 57 additions and 3 deletions
+5
View File
@@ -8,3 +8,8 @@ __pycache__/
*.swo *.swo
*.swp *.swp
*~ *~
# Default output files
output.wav
metadata.json
+45 -3
View File
@@ -3,7 +3,11 @@
import IPython.display as display import IPython.display as display
import argparse import argparse
import importlib.util import importlib.util
import soundfile as sf import json
import magic
import os
import soundfile
import subprocess
import sys import sys
import sys import sys
import torch import torch
@@ -29,7 +33,8 @@ parser = argparse.ArgumentParser()
parser.add_argument('--acoustic_model_filename', type=str, required=True) parser.add_argument('--acoustic_model_filename', type=str, required=True)
parser.add_argument('--hifigan_model_filename', type=str, required=True) parser.add_argument('--hifigan_model_filename', type=str, required=True)
parser.add_argument('--source_audio_filename', type=str, required=True) parser.add_argument('--source_audio_filename', type=str, required=True)
parser.add_argument('--output_audio_filename', type=str, required=True) parser.add_argument('--output_audio_filename', type=str, default='output.wav')
parser.add_argument('--output_metadata_filename', type=str, default='metadata.json')
args = parser.parse_args() args = parser.parse_args()
print('\n'.join(f'[arg] {k} = {v}' for k, v in vars(args).items())) print('\n'.join(f'[arg] {k} = {v}' for k, v in vars(args).items()))
@@ -115,8 +120,43 @@ def do_voice_conversion(hubert, acoustic, hifigan, audio_source):
end = time() end = time()
print(f"time for wavform {end-start}") print(f"time for wavform {end-start}")
return target return target
# =========================================== # ===========================================
def save_output_audio(audio_data, output_audio_filename):
soundfile.write(args.output_audio_filename, audio_data.squeeze().cpu(), samplerate=16000)
def save_metadata(audio_filename, output_metadata_filename):
# Run ffmpeg's ffprobe
command = [
"ffprobe",
"-loglevel", "quiet",
"-print_format", "json",
"-show_format",
"-show_streams",
audio_filename
]
pipe = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out, err = pipe.communicate()
ffmpeg_metadata = json.loads(out)
# Collect metadata
print(ffmpeg_metadata)
mime_type = magic.from_file(audio_filename, mime=True)
file_size_bytes = os.path.getsize(audio_filename)
duration_millis = int(float(ffmpeg_metadata['format']['duration']) * 1000)
metadata = {
'duration_millis': duration_millis,
'mimetype': mime_type,
'file_size_bytes': file_size_bytes,
}
with open(output_metadata_filename, 'w') as json_file:
json.dump(metadata, json_file)
hubert = torch.hub.load("bshall/hubert:main", "hubert_soft").cuda() hubert = torch.hub.load("bshall/hubert:main", "hubert_soft").cuda()
acoustic = load_acoustic_model(args.acoustic_model_filename) acoustic = load_acoustic_model(args.acoustic_model_filename)
@@ -125,4 +165,6 @@ hifigan = load_hifigan_model(args.hifigan_model_filename)
source_audio = load_wav_data(args.source_audio_filename) source_audio = load_wav_data(args.source_audio_filename)
target_audio = do_voice_conversion(hubert, acoustic, hifigan, source_audio) target_audio = do_voice_conversion(hubert, acoustic, hifigan, source_audio)
sf.write(args.output_audio_filename, target_audio.squeeze().cpu(), samplerate=16000) save_output_audio(target_audio, args.output_audio_filename)
save_metadata(args.output_audio_filename, args.output_metadata_filename)
+7
View File
@@ -1,5 +1,6 @@
asttokens==2.2.1 asttokens==2.2.1
backcall==0.2.0 backcall==0.2.0
beautifulsoup4==4.11.1
certifi==2022.12.7 certifi==2022.12.7
cffi==1.15.1 cffi==1.15.1
charset-normalizer==2.1.1 charset-normalizer==2.1.1
@@ -7,7 +8,9 @@ contourpy==1.0.6
cycler==0.11.0 cycler==0.11.0
decorator==5.1.1 decorator==5.1.1
executing==1.2.0 executing==1.2.0
filelock==3.8.2
fonttools==4.38.0 fonttools==4.38.0
gdown==4.6.0
idna==3.4 idna==3.4
ipython==8.7.0 ipython==8.7.0
jedi==0.18.2 jedi==0.18.2
@@ -27,18 +30,22 @@ pure-eval==0.2.2
pycparser==2.21 pycparser==2.21
Pygments==2.13.0 Pygments==2.13.0
pyparsing==3.0.9 pyparsing==3.0.9
PySocks==1.7.1
python-dateutil==2.8.2 python-dateutil==2.8.2
python-magic==0.4.27
requests==2.28.1 requests==2.28.1
scikit-learn==1.1.3 scikit-learn==1.1.3
scipy==1.9.3 scipy==1.9.3
six==1.16.0 six==1.16.0
sklearn==0.0.post1 sklearn==0.0.post1
soundfile==0.11.0 soundfile==0.11.0
soupsieve==2.3.2.post1
stack-data==0.6.2 stack-data==0.6.2
threadpoolctl==3.1.0 threadpoolctl==3.1.0
torch==1.13.0+cu116 torch==1.13.0+cu116
torchaudio==0.13.0+cu116 torchaudio==0.13.0+cu116
torchvision==0.14.0+cu116 torchvision==0.14.0+cu116
tqdm==4.64.1
traitlets==5.6.0 traitlets==5.6.0
typing_extensions==4.4.0 typing_extensions==4.4.0
urllib3==1.26.13 urllib3==1.26.13