import whisper import gradio as gr WhisperModels = ['tiny', 'base', 'small', 'medium', 'large'] import matplotlib.pyplot as plt import matplotlib import requests matplotlib.use('AGG') import io from PIL import Image import PIL from io import BytesIO import openai import os openai.organization = os.getenv('organization') openai.api_key = os.getenv('api_key') def SpeechToText(audio, SelectedModel): if audio == None : return "" model = whisper.load_model(SelectedModel) audio = whisper.load_audio(audio) audio = whisper.pad_or_trim(audio) # make log-Mel spectrogram and move to the same device as the model mel = whisper.log_mel_spectrogram(audio).to(model.device) # Detect the Max probability of language ? _, probs = model.detect_language(mel) lang = f"Language: {max(probs, key=probs.get)}" # Decode audio to Text options = whisper.DecodingOptions(fp16 = False) result = whisper.decode(model, mel, options) return result.text, lang def clean_text(text): """ we get rid of the commas and dots, maybe in the future there more things to get rid of in a sentence like !, ? ... Args: text (_type_): _description_ Returns: _type_: _description_ """ text = text.lower() text = text.replace(",", " ") text = text.replace(".", " ") text = text.replace("?", " ") text = text.replace("-", " ") text = text.split() new_string = [] for temp in text: if temp: if temp == "i": temp = "I" new_string.append(temp) concatString = ' '.join(new_string) return new_string, concatString import nltk nltk.download('punkt') nltk.download('averaged_perceptron_tagger') nltk.download('wordnet') nltk.download('omw-1.4') nltk.data.path.append('/root/nltk_data') from nltk import pos_tag, word_tokenize from nltk.stem.wordnet import WordNetLemmatizer class POS_tagging(): def __init__(self, concatString): self.concatString = concatString def handle_conjugation(self, tags): # here we do the conjugation for verbs new_sentence = [] for index, item in enumerate(tags): if item[1] not in ['VBP', 'DT', 'IN', 'TO', 'VBG', 'VBD', 'VBN', 'VBZ']: new_sentence.append(item[0]) elif item[1] in ['VBP', 'VBG', 'VBD', 'VBN', 'VBZ']: new_verb = WordNetLemmatizer().lemmatize(item[0],'v') if new_verb != "be": new_sentence.append(new_verb) return new_sentence def make_predictions(self): tags = pos_tag(word_tokenize(self.concatString)) return self.handle_conjugation(tags) def generate_pic(text_to_search, ax): """ we define a function here to use the api frpm arasaac, and return the image based on the text that we search ref: https://arasaac.org/developers/api Args: text_to_search (_type_): _description_ ax (_type_): _description_ """ search_url = f"https://api.arasaac.org/api/pictograms/en/bestsearch/{text_to_search}" search_response = requests.get(search_url) search_json = search_response.json() if search_json: pic_url = f"https://api.arasaac.org/api/pictograms/{search_json[0]['_id']}?download=false" pic_response = requests.get(pic_url) img = Image.open(BytesIO(pic_response.content)) ax.imshow(img) ax.set_title(text_to_search) else: try: response = openai.Image.create( prompt=text_to_search, n=2, size="512x512" ) image_url = response['data'][0]['url'] image_response = requests.get(image_url) img = Image.open(BytesIO(image_response.content)) ax.imshow(img) ax.set_title(f"/{text_to_search}/") except: ax.set_title("Error!") ax.axes.xaxis.set_visible(False) ax.axes.yaxis.set_visible(False) # we generate an initial pictogram # here we see the am, eating, an having a problem def save_pictogram(transcript): """_summary_ Args: text_list (_type_): _description_ """ cleaned_text, concatString = clean_text(transcript) text_list = POS_tagging(concatString).make_predictions() fig, ax = plt.subplots(1,len(text_list), figsize=(10,1.75)) if len(text_list) > 1: for i, text in enumerate(text_list): generate_pic(text, ax[i]) else: for i, text in enumerate(text_list): generate_pic(text, ax) fig.savefig("pictogram.png") safe_image = Image.open(r"pictogram.png") return safe_image with gr.Blocks() as demo: gr.Markdown("# Speech to Pictogram App") gr.Markdown("The transcript of the audio can be in different languages, but the pictogram will only work for English") gr.Markdown("The pictures which are titled in slashes (/) are generated using stable diffusion, however, the API here has a limit of 25 calls per minute.") with gr.Row(): with gr.Column(): audio = gr.Audio(source="microphone", type="filepath") dropdown = gr.Dropdown(label="Whisper Model", choices=WhisperModels, value='base') with gr.Column(): transcript = gr.Textbox(label="Transcript") lan = gr.Textbox(label="Language") btn1 = gr.Button("Transcribe") btn1.click(SpeechToText, inputs=[audio, dropdown], outputs=[transcript, lan]) #if lan.value == "Language: en": image = gr.Image() btn2 = gr.Button("Generate Pictogram") btn2.click(save_pictogram, inputs=[transcript], outputs=[image]) gr.Markdown("Made by [Omidreza](https://github.com/omidreza-amrollahi)") demo.launch()