tchamna's picture
Add application file
575071f
Raw
History Blame Contribute Delete
18.8 kB
# -*- coding: utf-8 -*-
"""Fuction_Audio_Processing_combine_files.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1TKJBO1bX2CGo6awtPhr6KE2bBMUGlYrs
"""
# Ru a Pytho Script in Google Colab
# # python "/content/class_audio_processing_for_aglc_alphet_phonetic_langues_africaines_tonal_languages (2).py"
# !python /content/class_audio_processing_for_aglc_alphet_phonetic_langues_africaines_tonal_languages.py
"""# Install libraries"""
# pip install natsort
# pip install pydub
"""The code defines a function named **get_audio** that takes in three parameters: **audio_path**, **ext** and **check_subfolders**. It imports the necessary modules such as os and glob. The function searches for audio files in a directory specified by the **audio_path** parameter and returns two lists; the first list containing the absolute path of the audio files and the second list containing the relative path of the audio files. The function has an optional parameter **ext** that takes a list of audio file extensions to be searched for, and **check_subfolders** is another optional parameter that specifies whether to search for audio files recursively in subfolders or not.
# get_audio() Functions
"""
from posix import mkdir
audio_path1 = "/content/drive/MyDrive/Resulam/Mbú'ŋwɑ̀'nì/test_audio/Language1/"
audio_path2 = "/content/drive/MyDrive/Resulam/Mbú'ŋwɑ̀'nì/test_audio/Language2/"
import os
# Define the path where the "result" directory should be created
result_path = audio_path2 + "result/"
# G:\.shortcut-targets-by-id\1kt35DKTNYSvIP56JDRN5ukyvOBlyXEwi\Mbú'ŋwɑ̀'nì\test_audio\Laguage2
import glob
import os
from natsort import natsorted
directory_path1 = audio_path1 +"*mp3" # Update with the actual directory path and file extension
directory_path2 = audio_path2 +"*mp3" # Update with the actual directory path and file extension
# Use glob to get the file names in the directory
file_names1 = glob.glob(directory_path1)
file_names2 = glob.glob(directory_path2)
# Sort the file names based on the Windows initial key
sorted_file_names1 = natsorted(file_names1, key=lambda x: x.lower())
sorted_file_names2 = natsorted(file_names2, key=lambda x: x.lower())
# Print the sorted file names
for file_name in sorted_file_names1:
print(file_name)
class AGLC:
# global len_chuck
def __init__(self,audio_path):
self.vow_map = {'à': 'à', 'á': 'á', 'ā': 'ā', 'ǎ': 'ǎ', 'â': 'â', 'è': 'è', 'é': 'é', 'ē': 'ē', 'ě': 'ě', 'ê': 'ê', 'ì': 'ì', 'í': 'í', 'ī': 'ī', 'ǐ': 'ǐ', 'î': 'î', 'ò': 'ò', 'ó': 'ó', 'ō': 'ō', 'ǒ': 'ǒ', 'ô': 'ô', 'ù': 'ù', 'ú': 'ú', 'ū': 'ū', 'ǔ': 'ǔ', 'û': 'û'}
self.audio_path = audio_path
# self.speed = play_speed
# self.input = input
def vowel_mapping(self,s):
output = ""
for char in s:
if char in self.vow_map:
output += self.vow_map[char]
else:
output += char
return output
def get_audio_files_dictionary(self,list_of_audio_files_including_extension):
"""
The function takes a list of audio files including extensions as input: ['a1.mp3','a2.mp3']
It creates:
- a dictionary where the keys are the audio file names without extensions, and the values are
the audio file names including extensions.
- a new dictionary where the keys are combinations of two audio file names separated by a space
and the values are lists of the corresponding audio file names including extensions.
'a1 a2': ['a1.mp3', 'a2.mp3']
The combinations are formed by iterating over the sorted list of audio file names and adding all pairs of
names that come after the current name in the sorted list.
Finally, the function returns the new dictionary.
"""
import os
list_of_audio_files_including_extension_base = [ os.path.basename(i) for i in list_of_audio_files_including_extension]
audio_files_no_ext = [i.split(".")[0] for i in list_of_audio_files_including_extension_base]
audio_files_dict = dict(zip(audio_files_no_ext, list_of_audio_files_including_extension))
new_dict = {}
sorted_list = sorted(list(audio_files_dict))
for i, val in enumerate(sorted_list):
for j in range(i,len(sorted_list)):
val_j = sorted_list[j]
new_dict[f"{val} {val_j}"] = [audio_files_dict[val], audio_files_dict[val_j]]
return new_dict
# Define a function to normalize a chunk to a target amplitude.
def match_target_amplitude(self,aChunk, target_dBFS):
''' Normalize given audio chunk
The code normalizes an audio chunk to a target amplitude level given as `target_dBFS`.
It calculates the change in decibels (dBFS) required to achieve the target amplitude level and applies it to the input audio chunk.'''
change_in_dBFS = target_dBFS - aChunk.dBFS
return aChunk.apply_gain(change_in_dBFS)
def get_audio(self,audio_path, ext = ["*.mp3", "*.wav", "*.ogg", "*.flac"],check_subfolders=False):
"""
The code defines a function named get_audio that takes in three parameters:
audio_path, ext and check_subfolders. It imports the necessary modules such as os and glob.
The function searches for audio files in a directory specified by the audio_path parameter and returns two lists;
the first list containing the absolute path of the audio files and the second list containing the relative path of the audio files.
The function has an optional parameter ext that takes a list of audio file extensions to be searched for, and check_subfolders
is another optional parameter that specifies whether to search for audio files recursively in subfolders or not.
"""
import os
import glob
# List of audio file extensions to search for
# AUDIO_EXTENSIONS = ext
# Directory to search for audio files
directory = audio_path # Replace with the path to your directory
if check_subfolders == False:
# Search for audio files using glob
audio_files = []
for extension in ext:
audio_files.extend(glob.glob(directory + "*" + extension, recursive=check_subfolders))
else:
# Search for audio files using glob
audio_files = []
for extension in ext:
audio_files.extend(glob.glob(directory + "/**/" + extension, recursive=check_subfolders))
audio_base_names = [os.path.basename(i) for i in audio_files]
return audio_files, audio_base_names
# define function to play audio given input string and list of audio files
def play_audio(self,input_string_space_separated, list_of_audio_files_including_extension):
# import required module
from pydub import AudioSegment
# create dictionary of audio files and their corresponding inputs
files = self.get_audio_files_dictionary(list_of_audio_files_including_extension)
# if the input is not in the dictionary, try reversing the input and checking again
if input_string_space_separated not in files:
input_string_space_separated = " ".join(input_string_space_separated.split()[::-1])
# print("...........",files[input_string_space_separated])
invert_dict = {}
invert_dict[input_string_space_separated] = files[input_string_space_separated][::-1]
files.update(invert_dict)
# create a silent audio segment for a 2 second pause between audio files
silence = AudioSegment.silent(duration=2000)
# get the list of audio files corresponding to the input string
audio_files = files.get(input_string_space_separated)
# print(audio_files)
# raise an error if the input string is invalid
if audio_files is None:
raise ValueError("Invalid input string value")
# create an empty audio segment to add the audio files to
combined_audio = AudioSegment.empty()
# loop through the list of audio files and add each one to the combined audio segment
for filename in audio_files:
audio_segment = AudioSegment.from_file(f"{filename}")
combined_audio += audio_segment + silence
# return the combined audio segment
return combined_audio
def play_audio_with_various_space_between_chunks(self,song, min_cut_silence_len = 1.5, silence_padding_duration = 2.5):
"""
The function takes an audio file and an optional silence duration as input and plays the audio with various spaces between each chunk.
The pydub library is used to split the audio file into chunks where there is silence for a specified duration determined by min_cut_silence_len
and then each chunk is padded with silence of duration silence_padding_duration.
For example, if min_cut_silence_len = 1.5, silence_padding_duration = 2.5
The function then normalizes each chunk and exports them as separate audio files in the mp3 format.
Finally, the function returns the entire audio file with the various spaces between each chunk as an AudioSegment object.
"""
# Import the AudioSegment class for processing audio and the
# split_on_silence function for separating out silent chunks.
from pydub import AudioSegment
from pydub.silence import split_on_silence
import os
# Load your audio.
# song = AudioSegment.from_mp3(audio_file_path)
# Split track where the silence is 2 seconds or more and get chunks using
# the imported function.
chunks = split_on_silence (
# Use the loaded audio.
song,
# Specify that a silent chunk must be at least 2 seconds or 2000 ms long.
# min_silence_len = 2000,
min_silence_len = int(min_cut_silence_len*1000),
# Consider a chunk silent if it's quieter than -16 dBFS.
# (You may want to adjust this parameter.)
silence_thresh = -50
)
silence_duration = int(silence_padding_duration*1000)
audio_chunk = AudioSegment.silent(duration=1000)
silence_chunk = AudioSegment.silent(duration=silence_duration)
# Process each chunk with your parameters
for i, chunk in enumerate(chunks):
# Create a silence chunk that's 0.5 seconds (or 500 ms) long for padding.
# print(i, len(chunks))
# Add the padding chunk to beginning and end of the entire chunk.
if i < len(chunks)-1:
audio_chunk += chunk + silence_chunk
if i == len(chunks)-1:
audio_chunk += chunk
# Normalize the entire chunk.
normalized_chunk = self.match_target_amplitude(audio_chunk, -20.0)
# Export the audio chunk with new bitrate.
# print(i)
# print(f"Exporting chunk{i}.mp3.")
# normalized_chunk.export(
# # ".//chunk{0}.mp3".format(i),
# f"_part{i}.mp3",
# bitrate = "192k",
# format = "mp3"
# )
return audio_chunk, len(chunks)
def play_audio_combine(self,input, speed = 2):
audio_files = self.get_audio(self.audio_path, ext = ["*.mp3", "*.wav", "*.ogg", "*.flac"])
list_of_audio_files_including_extension = audio_files[0]
# get_audio_files_dictionary(list_of_audio_files_including_extension)
in_ = self.vowel_mapping(input)
audio_result = self.play_audio(in_,list_of_audio_files_including_extension)
audio_result_modified = self.play_audio_with_various_space_between_chunks(audio_result, silence_padding_duration = float(speed))
return audio_result_modified
def main_func(self,audio_path1, audio_path2,result_path):
import os
from pydub import AudioSegment
from natsort import natsorted
from os.path import basename
silent_end = AudioSegment.silent(duration=1000)
silent_begin = AudioSegment.silent(duration=3000)
audio_files_plus_ext1, audio_files1 = self.get_audio(audio_path1, ext = ["*.mp3", "*.wav", "*.ogg", "*.flac"],check_subfolders=False)
audio_files_plus_ext2, audio_files2 = self.get_audio(audio_path2, ext = ["*.mp3", "*.wav", "*.ogg", "*.flac"],check_subfolders=False)
# Sort the file names alphabtically
sorted_audio_file_names1 = natsorted(audio_files1, key=lambda x: x.lower())
sorted_audio_file_names2 = natsorted(audio_files2, key=lambda x: x.lower())
sorted_audio_file_names_ext1 = natsorted(audio_files_plus_ext1, key=lambda x: x.lower())
sorted_audio_file_names_ext2 = natsorted(audio_files_plus_ext2, key=lambda x: x.lower())
# Using a dictionary to map indices to filenames for faster lookup
file_dict2 = { ''.join(filter(str.isdigit, basename(path))): basename(path) for path in sorted_audio_file_names_ext1 }
# Create the mapping in a more efficient way
mapping_fast = { basename(path1): file_dict2.get(''.join(filter(str.isdigit, basename(path1))), None)
for path1 in sorted_audio_file_names_ext2 if ''.join(filter(str.isdigit, basename(path1))) in file_dict2 }
audio_path1_ = [audio_path1 + i for i in mapping_fast.values()]
audio_path2_ = [audio_path2+i for i in mapping_fast.keys()]
silent_2s = AudioSegment.silent(duration=2000)
song = silent_2s
padding_duration = 3
for i in range (0,len(audio_path2_)):
# i = 1
song_name = os.path.basename(audio_path1_[i]).split("_")[0] + "_" + os.path.basename(audio_path2_[i])
print(song_name)
song_1 = AudioSegment.from_mp3(audio_path1_[i])
song_2 = AudioSegment.from_mp3(audio_path2_[i])
song_out, number_of_chunks = self.play_audio_with_various_space_between_chunks(song_2, min_cut_silence_len = 1.2, silence_padding_duration = padding_duration)
print("number_of_chunks:",number_of_chunks)
if number_of_chunks == 1:
songi = song_1 + silent_begin + song_2 + silent_begin + song_2
else:
songi = song_1 + silent_begin + song_2
songi.export(
# ".//chunk{0}.mp3".format(i),
result_path+"/"+song_name,
bitrate = "192k",
format = "mp3"
);
songi
audio_files_plus_ext, audio_files = self.get_audio(result_path, ext = ["*.mp3", "*.wav", "*.ogg", "*.flac"],check_subfolders=False)
# Sort the file names alphabtically
audio_files = natsorted(audio_files, key=lambda x: x.lower())
audio_files_plus_ext = natsorted(audio_files_plus_ext, key=lambda x: x.lower())
song = silent_begin
for i in range (0,len(audio_files_plus_ext)):
# i = 1
song_name = os.path.basename(audio_files_plus_ext[i])
print(song_name)
# song_name = f"{audio_path}reworked/pp_"+song_name
song_i = AudioSegment.from_mp3(audio_files_plus_ext[i])
# song += song_i+silent_end+flip_page_sound+silent_begin
song += song_i
song_name = f"{result_path}1_CombineAudio.mp3"
song.export(
# ".//chunk{0}.mp3".format(i),
song_name,
bitrate = "192k",
format = "mp3"
);
# audio_path1 = "/content/drive/MyDrive/Resulam/Mbú'ŋwɑ̀'nì/test_audio/Language1/"
# audio_path2 = "/content/drive/MyDrive/Resulam/Mbú'ŋwɑ̀'nì/test_audio/Language2/"
# result_path = "/content/drive/MyDrive/Resulam/Mbú'ŋwɑ̀'nì/test_audio/res/"
#
# # player_yoruba = AGLC(audio_path_yoruba)
def main(audio_path1, audio_path2,result_path):
player = AGLC(audio_path1)
player.main_func(audio_path1, audio_path2,result_path)
def normalize_audio_for_ACX_Amazon(song):
desired_sample_rate = 44100 # Replace this with your desired sample rate
song = song.set_frame_rate(desired_sample_rate)
desired_dBFS = -20 # Target volume level in dBFS
current_dBFS = song.dBFS
gain_needed = desired_dBFS - current_dBFS
song_with_desired_volume = song.apply_gain(gain_needed)
# song_with_desired_volume.export("/content/output.mp3", format="mp3", bitrate="192000")
return song_with_desired_volume
"""# Build Interface With Gradio"""
import gradio as gr
iface = gr.Interface(fn=main,
inputs=[gr.Textbox(label="Laguage1 Path: "),
gr.Textbox(value=1, label="Laguage2 Path: "),
gr.Textbox(label="Results Path: ")],
outputs="audio",
title="Combine Audios")
# iface.launch(share=True,debug=True)
iface.launch(debug=True)
# pip install transformers
demo = gr.Blocks()
with demo:
input_func1 = gr.Audio(type="filepath")
output_func1 = gr.Textbox()
output_func2 = gr.Label()
b1 = gr.Button("Recognize Speech")
b2 = gr.Button("Classify Sentiment")
b1.click(Func1, inputs=input_func1, outputs=output_func1)
b2.click(Func2, inputs=output_func1, outputs=output_func2)
demo.launch(share=True)
# get_audio(audio_path, ext = ["*.mp3", "*.wav", "*.ogg", "*.flac"],check_subfolders=False):
# return audio_files, audio_base_names
# def get_audio_files_dictionary(list_of_audio_files_including_extension):
# return new_dict
# play_audio(input_string_space_separated, list_of_audio_files_including_extension):
# return combined_audio
# play_audio_with_various_space_between_chunks(song, silence_duration = .5):
# return audio_chunk
# list_of_audio_files_including_extension = get_audio()[0]
# audio_result = play_audio("bǎ bá",list_of_audio_files_including_extension)
# audio_result_modified = play_audio_with_various_space_between_chunks(audio_result, silence_duration = .2)
# gr.Textbox(value=1, label="Duration in seconds"),
# inputs=[gr.Textbox(label="words: Example: ǎ bà"),
# gr.Textbox(value=1, label="Duration in seconds"),
# gr.Textbox(label="Path")],
def func1(x):
x = float(x)
return x**2
def func2(y):
y = float(y)
return y**2
def func3(a):
a = float(a)
# b = float(b)
return 2*a
demo = gr.Blocks()
with demo:
input_func1 = gr.Textbox(label = "val1")
input_func2 = gr.Textbox(label = "val2")
# input_func3 = [gr.Textbox(label = "val3")
output_func1 = gr.Label(label = "result1")
output_func2 = gr.Label(label = "result2")
output_func3 = gr.Label(label = "result3")
b1 = gr.Button("x^2")
b2 = gr.Button("y^2")
b3 = gr.Button("x^2+y^2")
b1.click(func1, inputs=input_func1, outputs=output_func1)
b2.click(func2, inputs=input_func2, outputs=output_func2)
b3.click(func3, inputs=output_func1, outputs=output_func3)
# b2.click(play_audio, inputs=output_func1, outputs=output_func2)
demo.launch(share=True, debug=True)
def main_func(input_string, speed = 1):
audio_result = play_audio(input_string)
audio_result_modified = play_audio_with_various_space_between_chunks(audio_result, silence_duration = float(speed))
return audio_result_modified
main_func("ǎ bà",".1")