Spaces:
Sleeping
Sleeping
| """Vocal chunks module.""" | |
| import os | |
| import re | |
| import wave | |
| from modules.console_colors import ULTRASINGER_HEAD | |
| from modules.os_helper import create_folder | |
| from modules.Ultrastar.ultrastar_converter import ( | |
| get_end_time_from_ultrastar, | |
| get_start_time_from_ultrastar, | |
| ) | |
| from modules.Ultrastar.ultrastar_txt import UltrastarTxtValue | |
| class AudioManipulation: | |
| """Docstring""" | |
| def export_chunks_from_transcribed_data( | |
| audio_filename: str, transcribed_data: [], output_folder_name: str | |
| ) -> None: | |
| """Export transcribed_data as vocal chunks wav files""" | |
| print( | |
| f"{ULTRASINGER_HEAD} Export transcribed data as vocal chunks wav files" | |
| ) | |
| wave_file = wave.open(audio_filename, "rb") | |
| sample_rate, n_channels = wave_file.getparams()[2], wave_file.getparams()[0] | |
| for i, data in enumerate(transcribed_data): | |
| start_byte = int(data.start * sample_rate * n_channels) | |
| end_byte = int(data.end * sample_rate * n_channels) | |
| chunk = get_chunk(end_byte, start_byte, wave_file) | |
| export_chunk_to_wav_file( | |
| chunk, output_folder_name, i, data.word, wave_file | |
| ) | |
| wave_file.close() | |
| def export_chunks_from_ultrastar_data( | |
| audio_filename: str, ultrastar_data: UltrastarTxtValue, folder_name: str | |
| ) -> None: | |
| """Export ultrastar data as vocal chunks wav files""" | |
| print(f"{ULTRASINGER_HEAD} Export Ultrastar data as vocal chunks wav files") | |
| create_folder(folder_name) | |
| wave_file = wave.open(audio_filename, "rb") | |
| sample_rate, n_channels = wave_file.getparams()[2], wave_file.getparams()[0] | |
| for i, word in enumerate(ultrastar_data.words): | |
| start_time = get_start_time_from_ultrastar(ultrastar_data, i) | |
| end_time = get_end_time_from_ultrastar(ultrastar_data, i) | |
| start_byte = int(start_time * sample_rate * n_channels) | |
| end_byte = int(end_time * sample_rate * n_channels) | |
| chunk = get_chunk(end_byte, start_byte, wave_file) | |
| export_chunk_to_wav_file( | |
| chunk, folder_name, i, word, wave_file | |
| ) | |
| def export_chunk_to_wav_file(chunk, folder_name: str, i: int, word: str, wave_file) -> None: | |
| """Export vocal chunks to wav file""" | |
| clean_word = re.sub("[^A-Za-z0-9]+", "", word) | |
| # todo: Progress? | |
| # print(f"{str(i)} {clean_word}") | |
| with wave.open( | |
| os.path.join(folder_name, f"chunk_{i}_{clean_word}.wav"), "wb" | |
| ) as chunk_file: | |
| chunk_file.setparams(wave_file.getparams()) | |
| chunk_file.writeframes(chunk) | |
| def get_chunk(end_byte: int, start_byte: int, wave_file): | |
| """ | |
| Gets the chunk from wave file. | |
| Returns chunk as n frames of audio, as a bytes object. | |
| """ | |
| # todo: get out of position error message | |
| wave_file.setpos(start_byte) # ({:.2f}) | |
| chunk = wave_file.readframes(end_byte - start_byte) | |
| return chunk | |