#@title <-- Just run the cell (config edge TTS) edge_folder="." import nltk nltk.download('punkt') from nltk.tokenize import sent_tokenize from deep_translator import GoogleTranslator from lang_data import languages,male_voice_list,female_voice_list def translate_text(text, Language): # print("calling translate") target_language=languages[Language] if Language == "Chinese": target_language='zh-CN' translator = GoogleTranslator(target=target_language) translation = translator.translate(text.strip()) t_text=str(translation) # print(f"{t_text}---{Language}----{target_language}") return t_text def chunks_sentences(paragraph, join_limit=2): sentences = sent_tokenize(paragraph) # Initialize an empty list to store the new sentences new_sentences = [] # Iterate through the list of sentences in steps of 'join_limit' for i in range(0, len(sentences), join_limit): # Join the sentences with a space between them new_sentence = ' '.join(sentences[i:i + join_limit]) new_sentences.append(new_sentence) return new_sentences def calculate_rate_string(input_value): rate = (input_value - 1) * 100 sign = '+' if input_value >= 1 else '-' return f"{sign}{abs(int(rate))}" def make_chunks(input_text, language): language="English" if language == "English": filtered_list=chunks_sentences(input_text, join_limit=2) # temp_list = input_text.strip().split(".") # filtered_list = [element.strip() + '.' for element in temp_list[:-1] if element.strip() and element.strip() != "'" and element.strip() != '"'] # if temp_list[-1].strip(): # filtered_list.append(temp_list[-1].strip()) return filtered_list import re import uuid def tts_file_name(text): if text.endswith("."): text = text[:-1] text = text.lower() text = text.strip() text = text.replace(" ","_") truncated_text = text[:25] if len(text) > 25 else text if len(text) > 0 else "empty" random_string = uuid.uuid4().hex[:8].upper() file_name = f"{edge_folder}/edge_tts_voice/{truncated_text}_{random_string}.mp3" return file_name from pydub import AudioSegment import shutil import os def merge_audio_files(audio_paths, output_path): # Initialize an empty AudioSegment merged_audio = AudioSegment.silent(duration=0) # Iterate through each audio file path for audio_path in audio_paths: # Load the audio file using Pydub audio = AudioSegment.from_file(audio_path) # Append the current audio file to the merged_audio merged_audio += audio # Export the merged audio to the specified output path merged_audio.export(output_path, format="mp3") def edge_free_tts(chunks_list,speed,voice_name,save_path,translate_text_flag,Language): # print(voice_name) # print(chunks_list) store_text="" if len(chunks_list)>1: chunk_audio_list=[] if os.path.exists(f"{edge_folder}/edge_tts_voice"): shutil.rmtree(f"{edge_folder}/edge_tts_voice") os.mkdir(f"{edge_folder}/edge_tts_voice") k=1 for i in chunks_list: # print(i) if translate_text_flag: text=translate_text(i, Language) else: text=i store_text+=text+" " text=text.replace('"',"") edge_command=f'edge-tts --rate={calculate_rate_string(speed)}% --voice {voice_name} --text "{text}" --write-media {edge_folder}/edge_tts_voice/{k}.mp3' var1=os.system(edge_command) if var1==0: pass else: print(f"Failed: {i}") print(edge_command) chunk_audio_list.append(f"{edge_folder}/edge_tts_voice/{k}.mp3") k+=1 # print(chunk_audio_list) merge_audio_files(chunk_audio_list, save_path) else: if translate_text_flag: text=translate_text(chunks_list[0], Language) else: text=chunks_list[0] text=text.replace('"',"") store_text+=text+" " edge_command=f'edge-tts --rate={calculate_rate_string(speed)}% --voice {voice_name} --text "{text}" --write-media {save_path}' var2=os.system(edge_command) if var2==0: pass else: print(f"Failed: {chunks_list[0]}") print(edge_command) with open("./temp.txt", "w", encoding="utf-8") as text_file: text_file.write(store_text) return save_path # speed = 1 # @param {type: "number"} # translate_text_flag = True # @param {type:"boolean"} # long_sentence = True # @param {type:"boolean"} # from IPython.display import clear_output # from IPython.display import Audio if not os.path.exists(f"{edge_folder}/audio"): os.mkdir(f"{edge_folder}/audio") import uuid def random_audio_name_generate(): random_uuid = uuid.uuid4() audio_extension = ".mp3" random_audio_name = str(random_uuid)[:8] + audio_extension return random_audio_name def edge_tts_pipeline(input_text,Language='English',voice_name=None,Gender='Male',translate_text_flag=True,no_silence=False,speed=1,tts_save_path="",long_sentence=True): # print("calling gradio_talk") # global long_sentence,translate_text_flag,Language,speed,voice_name,Gender global male_voice_list,female_voice_list # long_sentence=True # translate_text_flag=True # speed=1 if long_sentence==False: if len(input_text)>500: long_sentence=True if voice_name==None: if Gender=="Male": voice_name=male_voice_list[Language] if Gender=="Female": voice_name=female_voice_list[Language] if long_sentence==True and translate_text_flag==True: chunks_list=make_chunks(input_text,Language) elif long_sentence==True and translate_text_flag==False: chunks_list=make_chunks(input_text,"English") else: chunks_list=[input_text] temp_save_path=f"{edge_folder}/audio/"+random_audio_name_generate() save_path=temp_save_path.lower().replace(".mp3",".wav") # print(chunks_list,speed,voice_name,save_path,translate_text_flag,Language) edge_save_path=edge_free_tts(chunks_list,speed,voice_name,temp_save_path,translate_text_flag,Language) mp3_to_wav(edge_save_path, save_path) audio_return_path=save_path if no_silence: clean_path=f"{edge_folder}/audio/"+random_audio_name_generate().replace(".mp3",".wav") remove_silence(save_path,clean_path) audio_return_path=clean_path # return clean_path if tts_save_path=="": return audio_return_path else: shutil.copyfile(audio_return_path,tts_save_path) return audio_return_path def talk(input_text): # global long_sentence,translate_text_flag,Language,speed,voice_name,Gender global Language, Gender,male_voice_list,female_voice_list global no_silence long_sentence=True translate_text_flag=False speed=1 if Gender=="Male": voice_name=male_voice_list[Language] if Gender=="Female": voice_name=female_voice_list[Language] if long_sentence==True and translate_text_flag==True: chunks_list=make_chunks(input_text,Language) elif long_sentence==True and translate_text_flag==False: chunks_list=make_chunks(input_text,"English") else: chunks_list=[input_text] temp_save_path=f"{edge_folder}/audio/"+random_audio_name_generate() # print(f"temp_save_path: {temp_save_path}") save_path=temp_save_path.replace(".mp3",".wav") # print(f"save_path: {save_path}") edge_save_path=edge_free_tts(chunks_list,speed,voice_name,temp_save_path,translate_text_flag,Language) mp3_to_wav(edge_save_path, save_path) if no_silence: clean_path=f"{edge_folder}/audio/"+random_audio_name_generate().replace(".mp3",".wav") remove_silence(save_path,clean_path) return clean_path return save_path from pydub import AudioSegment from pydub.silence import split_on_silence import os def remove_silence(file_path,output_path): # Extract file name and format from the provided path file_name = os.path.basename(file_path) audio_format = "wav" # Reading and splitting the audio file into chunks sound = AudioSegment.from_file(file_path, format=audio_format) audio_chunks = split_on_silence(sound, min_silence_len=100, silence_thresh=-45, keep_silence=50) # Putting the file back together combined = AudioSegment.empty() for chunk in audio_chunks: combined += chunk combined.export(output_path, format=audio_format) print(f"Remove silence successfully: {output_path}") return output_path from pydub import AudioSegment def mp3_to_wav(mp3_file, wav_file): # Load the MP3 file # print("calling mp3_to_wav") # print(mp3_file,wav_file) audio = AudioSegment.from_mp3(mp3_file) # Export the audio to WAV format audio.export(wav_file, format="wav") ###use case # from microsoft_tts import edge_tts_pipeline # def tts(text, Language='English',voice_name=None, tts_save_path='', Gender='Male', translate_text_flag=False, no_silence=True, speed=1.0, long_sentence=True): # edge_save_path = edge_tts_pipeline(text, Language,voice_name, Gender, translate_text_flag=translate_text_flag, # no_silence=no_silence, speed=speed, tts_save_path=tts_save_path, # long_sentence=long_sentence) # return edge_save_path # text="Machine learning is the study of computer algorithms that improve automatically through experience. It is seen as a subset of artificial intelligence. Machine learning algorithms build a model based on sample data, known as training data, in order to make predictions or decisions without being explicitly programmed to do so. Machine learning algorithms are used in a wide variety of applications, such as email filtering and computer vision, where it is difficult or infeasible to develop conventional algorithms to perform the needed tasks." # save_path = tts(text, Language='English',Gender="Male") # print(save_path) # import simpleaudio as sa # def play_sound(filename): # wave_obj = sa.WaveObject.from_wave_file(filename) # play_obj = wave_obj.play() # play_obj.wait_done() # play_sound(save_path) # edge_save_path=talk(text) # print(f"Audio File Save at: {edge_save_path}") # text = "a quick brown fox jumps over the lazy dog and the dog barks loudly" # Language = "English" # @param ['English','Hindi','Bengali','Afrikaans', 'Amharic', 'Arabic', 'Azerbaijani', 'Bulgarian', 'Bosnian', 'Catalan', 'Czech', 'Welsh', 'Danish', 'German', 'Greek', 'Spanish', 'French', 'Irish', 'Galician', 'Gujarati', 'Hebrew', 'Croatian', 'Hungarian', 'Indonesian', 'Icelandic', 'Italian', 'Japanese', 'Javanese', 'Georgian', 'Kazakh', 'Khmer', 'Kannada', 'Korean', 'Lao', 'Lithuanian', 'Latvian', 'Macedonian', 'Malayalam', 'Mongolian', 'Marathi', 'Malay', 'Maltese', 'Burmese', 'Norwegian Bokmål', 'Nepali', 'Dutch', 'Polish', 'Pashto', 'Portuguese', 'Romanian', 'Russian', 'Sinhala', 'Slovak', 'Slovenian', 'Somali', 'Albanian', 'Serbian', 'Sundanese', 'Swedish', 'Swahili', 'Tamil', 'Telugu', 'Thai', 'Turkish', 'Ukrainian', 'Urdu', 'Uzbek', 'Vietnamese', 'Chinese', 'Zulu'] # no_silence = False # Gender = "Male"# @param ['Male', 'Female'] # translate_text_flag=True # no_silence=True # speed=1 # tts_save_path='temp.wav' # edge_save_path=edge_tts_pipeline(text,Language,Gender,translate_text_flag=translate_text_flag,no_silence=no_silence,speed=speed,tts_save_path=tts_save_path) # print(f"Audio File Save at: {edge_save_path}") # from microsoft_tts import edge_tts_pipeline # def tts(text,tts_save_path=''): # # text = "a quick brown fox jumps over the lazy dog and the dog barks loudly" # Language = "English" # @param ['English','Hindi','Bengali','Afrikaans', 'Amharic', 'Arabic', 'Azerbaijani', 'Bulgarian', 'Bosnian', 'Catalan', 'Czech', 'Welsh', 'Danish', 'German', 'Greek', 'Spanish', 'French', 'Irish', 'Galician', 'Gujarati', 'Hebrew', 'Croatian', 'Hungarian', 'Indonesian', 'Icelandic', 'Italian', 'Japanese', 'Javanese', 'Georgian', 'Kazakh', 'Khmer', 'Kannada', 'Korean', 'Lao', 'Lithuanian', 'Latvian', 'Macedonian', 'Malayalam', 'Mongolian', 'Marathi', 'Malay', 'Maltese', 'Burmese', 'Norwegian Bokmål', 'Nepali', 'Dutch', 'Polish', 'Pashto', 'Portuguese', 'Romanian', 'Russian', 'Sinhala', 'Slovak', 'Slovenian', 'Somali', 'Albanian', 'Serbian', 'Sundanese', 'Swedish', 'Swahili', 'Tamil', 'Telugu', 'Thai', 'Turkish', 'Ukrainian', 'Urdu', 'Uzbek', 'Vietnamese', 'Chinese', 'Zulu'] # no_silence = False # Gender = "Male"# @param ['Male', 'Female'] # translate_text_flag=True # no_silence=True # speed=1 # # tts_save_path='temp.wav' # long_sentence=True # edge_save_path=edge_tts_pipeline(text,Language,Gender,translate_text_flag=translate_text_flag,no_silence=no_silence,speed=speed,tts_save_path=tts_save_path,long_sentence=long_sentence) # print(f"Audio File Save at: {edge_save_path}") # return edge_save_path