Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import os | |
| import json | |
| import requests | |
| import time | |
| import pandas as pd | |
| import io | |
| from scipy.io.wavfile import write | |
| # AssemblyAI transcript endpoint (where we submit the file) | |
| transcript_endpoint = "https://api.assemblyai.com/v2/transcript" | |
| upload_endpoint = "https://api.assemblyai.com/v2/upload" | |
| headers={ | |
| "Authorization": os.environ["ASSEMBLYAI_KEY"], | |
| "Content-Type": "application/json" | |
| } | |
| # Helper function to upload data | |
| def _read_file(filename, chunk_size=5242880): | |
| with open(filename, "rb") as f: | |
| while True: | |
| data = f.read(chunk_size) | |
| if not data: | |
| break | |
| yield data | |
| def _read_array(audio, chunk_size=5242880): | |
| """Like _read_file but for array - creates temporary unsaved "file" from sample rate and audio np.array""" | |
| sr, aud = audio | |
| # Create temporary "file" and write data to it | |
| bytes_wav = bytes() | |
| temp_file = io.BytesIO(bytes_wav) | |
| write(temp_file, sr, aud) | |
| while True: | |
| data = temp_file.read(chunk_size) | |
| if not data: | |
| break | |
| yield data | |
| def get_audio_from_upload(audio): | |
| upload_response = requests.post( | |
| upload_endpoint, | |
| headers=headers, | |
| data=_read_array(audio)) | |
| return upload_response.json()['upload_url'] | |
| def get_transcript_url(audio): | |
| url = get_audio_from_upload(audio) | |
| # JSON that tells the API which file to trancsribe | |
| json={ | |
| # URL of the audio file to process | |
| "audio_url": url, | |
| # Turn on speaker labels | |
| "speaker_labels": True, | |
| # Turn on cusom vocabulary | |
| "word_boost": ["assembly ai"], | |
| # Turn on custom spelling | |
| "custom_spelling": [ | |
| {"from": ["assembly AI"], "to": "AssemblyAI"}, | |
| {"from": ["assembly AI's"], "to": "AssemblyAI's"} | |
| ], | |
| # Turn on PII Redaction and specify policies | |
| "redact_pii": True, | |
| "redact_pii_policies": ["drug", "injury", "person_name"], | |
| "redact_pii_audio": True, | |
| # Turn on Auto Highlights | |
| "auto_highlights": True, | |
| # Turn on Content Moderation | |
| "content_safety": True, | |
| # Turn on Topic Detection | |
| "iab_categories": True, | |
| # Turn on Sentiment Analysis | |
| "sentiment_analysis": True, | |
| # Turn on Summarization and specify configuration | |
| "summarization": True, | |
| "summary_model": "informative", | |
| "summary_type": "bullets", | |
| # Turn on Entity Detection | |
| "entity_detection": True,} | |
| response = requests.post( | |
| transcript_endpoint, | |
| json=json, | |
| headers=headers # Authorization to link this transcription with your account | |
| ) | |
| polling_endpoint = f"https://api.assemblyai.com/v2/transcript/{response.json()['id']}" | |
| while True: | |
| transcription_result = requests.get(polling_endpoint, headers=headers).json() | |
| if transcription_result['status'] == 'completed': | |
| break | |
| elif transcription_result['status'] == 'error': | |
| raise RuntimeError(f"Transcription failed: {transcription_result['error']}") | |
| else: | |
| time.sleep(3) | |
| res = transcription_result['sentiment_analysis_results'] | |
| sentiment_analysis_result = '' | |
| df = pd.DataFrame(res) | |
| df = df.loc[:, ["text", "sentiment", "confidence"]] | |
| topic = transcription_result['iab_categories_result']['summary'] | |
| topics = [] | |
| for k in topic: | |
| topic_dict = {} | |
| topic_dict["Topic"] = " > ".join(k.split(">")) | |
| topic_dict["Relevance"] = topic[k] | |
| topics.append(topic_dict) | |
| df_topic = pd.DataFrame(topics) | |
| return transcription_result['text'], transcription_result['summary'], df, df_topic.head() | |
| # def get_transcript_file(filename): | |
| # upload_response = requests.post( | |
| # upload_endpoint, | |
| # headers=headers, | |
| # data=_read_file(filename)) | |
| # # JSON that tells the API which file to trancsribe | |
| # json = { | |
| # # URL of the audio file to process | |
| # "audio_url": upload_response.json()['upload_url'], | |
| # # Turn on speaker labels | |
| # "speaker_labels": True, | |
| # # Turn on custom vocabulary | |
| # "word_boost": ["assembly ai"], | |
| # # Turn on custom spelling | |
| # "custom_spelling": [ | |
| # {"from": ["assembly AI"], "to": "AssemblyAI"}, | |
| # {"from": ["assembly AI's"], "to": "AssemblyAI's"} | |
| # ], | |
| # # Turn on PII Redaction and specify policies | |
| # "redact_pii": True, | |
| # "redact_pii_policies": ["drug", "injury", "person_name"], | |
| # "redact_pii_audio": True, | |
| # # Turn on Auto Highlights | |
| # "auto_highlights": True, | |
| # # Turn on Content Moderation | |
| # "content_safety": True, | |
| # # Turn on Topic Detection | |
| # "iab_categories": True, | |
| # # Turn on Sentiment Analysis | |
| # "sentiment_analysis": True, | |
| # # Turn on Summarization and specify configuration | |
| # "summarization": True, | |
| # "summary_model": "informative", | |
| # "summary_type": "bullets", | |
| # # Turn on Entity Detection | |
| # "entity_detection": True, | |
| # } | |
| # response = requests.post( | |
| # transcript_endpoint, | |
| # json=json, | |
| # headers=headers # Authorization to link this transcription with your account | |
| # ) | |
| # polling_endpoint = f"https://api.assemblyai.com/v2/transcript/{response.json()['id']}" | |
| # while True: | |
| # transcription_result = requests.get(polling_endpoint, headers=headers).json() | |
| # if transcription_result['status'] == 'completed': | |
| # break | |
| # elif transcription_result['status'] == 'error': | |
| # raise RuntimeError(f"Transcription failed: {transcription_result['error']}") | |
| # else: | |
| # time.sleep(3) | |
| # return transcription_result['text'] | |
| audio_intelligence_list = [ | |
| "Summarization", | |
| "Sentiment Analysis" | |
| ] | |
| title = """<h1 align="center">🔥Conformer-1 API </h1>""" | |
| description = """ | |
| ### In this demo, you can explore the outputs of a Conformer-1 Speech Recognition Model from AssemblyAI. | |
| """ | |
| with gr.Blocks() as demo: | |
| gr.HTML(title) | |
| gr.Markdown(description) | |
| with gr.Column(elem_id = "col_container"): | |
| #audio_intelligence_options = gr.CheckboxGroup(audio_intelligence_list, label="Audio Intelligence Options") | |
| inputs = gr.Audio(source = "upload",label = "Upload the input Audio file") | |
| b1 = gr.Button('Process Audio') | |
| with gr.Tabs(): | |
| with gr.TabItem('Transcript') as transcript_tab: | |
| transcript = gr.Textbox(label = "Transcript Result" ) | |
| with gr.TabItem('Summary', visible = False) as summary_tab: | |
| summary = gr.Textbox(label = "Summary Result") | |
| with gr.TabItem('Sentiment Analysis', visible = False) as sentiment_tab: | |
| sentiment_analysis = gr.Dataframe(label = "Sentiment Analysis Result" ) | |
| with gr.TabItem('Topic Detection', visible = False) as topic_detection_tab: | |
| topic_detection = gr.Dataframe(label = "Topic Detection Result" ) | |
| b1.click(get_transcript_url, [inputs], [transcript, summary, sentiment_analysis,topic_detection]) | |
| examples = gr.Examples(examples = [["audio.mp3"]], inputs = inputs, outputs=[transcript, summary, sentiment_analysis, topic_detection], cache_examples = True, fn = get_transcript_url) | |
| demo.queue().launch(debug=True) | |