speechgen / microsoft_tts.py
aidevhund's picture
Upload 6 files
5592e3b verified
#@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