Spaces:
Running
Running
| import subprocess | |
| import sys | |
| import os | |
| from pydub import AudioSegment | |
| try: | |
| import openai | |
| except ImportError: | |
| subprocess.check_call([sys.executable, "-m", "pip", "install", "openai"]) | |
| import openai # Import the library after installing it | |
| def transcribe(filename,key): | |
| client = openai.OpenAI(api_key = key) | |
| audio_file = open(filename, "rb") | |
| transcript_txt = client.audio.transcriptions.create( | |
| model="whisper-1", | |
| file=audio_file, | |
| response_format="text" | |
| ) | |
| return transcript_txt | |
| def openai_api(prompt, key): | |
| openai.api_key = key | |
| completion = openai.chat.completions.create( | |
| model="gpt-4o", | |
| messages=[{"role": "user", "content": prompt}] | |
| ) | |
| return completion.choices[0].message.content | |
| def transcribe_large_audio(filename, key, segment_length_ms = 30 * 60 *1000): | |
| def get_file_size_in_mb(file_path): | |
| return os.path.getsize(file_path) / (1024 * 1024) | |
| def split_audio_file(file_path, segment_length_ms = 30 * 60 *1000): | |
| audio = AudioSegment.from_file(filename, format="mp3") | |
| segment_filenames = [] | |
| for i in range(0, len(audio), segment_length_ms): | |
| end = min(i + segment_length_ms, len(audio)) | |
| segment = audio[i:end] | |
| segment_filename = f"{file_path}_part{len(segment_filenames) + 1}.mp3" | |
| segment.export(segment_filename, format="mp3", bitrate="36k") | |
| segment_filenames.append(segment_filename) | |
| return segment_filenames | |
| openai.api_key = key | |
| transcript_txt = "" | |
| if get_file_size_in_mb(filename) > 25: | |
| # Split the audio file if it exceeds the chunk size | |
| audio_chunks = split_audio_file(filename) | |
| print(audio_chunks) | |
| # Process each chunk separately | |
| for chunk_filename in audio_chunks: | |
| print(chunk_filename) | |
| transcript_txt += transcribe(chunk_filename, key) | |
| # Remove the temporary chunk file | |
| os.remove(chunk_filename) | |
| else: | |
| transcript_txt = transcribe(filename, key) | |
| return transcript_txt | |
| def setup_gradio_interface(): | |
| with gr.Blocks() as demo: | |
| gr.Markdown("音頻轉文字,並擷取重點") | |
| with gr.Tab("請依順序操作"): | |
| with gr.Row(): | |
| file_input = gr.File(label="第一步:請上傳檔案") | |
| api_key_input = gr.Textbox(label="第二步:請輸入OpenAI API金鑰", placeholder="OpenAI API Key") | |
| submit_button = gr.Button("第三步:開始轉譯") | |
| file_output_txt = gr.File(label="第四步:下載逐字稿(Optional)") | |
| with gr.Row(): | |
| content = gr.Textbox(label="第五步:檢視轉譯逐字稿", value="轉譯逐字稿") | |
| submit2_button = gr.Button("第六步:開始重點摘錄") | |
| summary = gr.Textbox(label="第七步:輸出重點摘錄(Markdown格式)", value="重點摘錄") | |
| file_output2_txt = gr.File(label="第八步:下載重點摘錄(Optional)") | |
| def transcribe_and_download(file, key): | |
| if file is not None: | |
| txt_content = transcribe_large_audio(file,key) | |
| txt_path = "transcribe.txt" | |
| with open(txt_path, "w") as txt_file: | |
| txt_file.write(txt_content) | |
| return txt_content, txt_path | |
| def transcribe_and_summary(text, key): | |
| if text is not None: | |
| prompt = "請扮演文書處理專家,幫我把「會議逐字稿」作「重點摘錄」,逐字稿如下:" + text | |
| summary = openai_api(prompt, key) | |
| txt_path = "summary.txt" | |
| with open(txt_path, "w") as txt_file: | |
| txt_file.write(summary) | |
| return summary, txt_path | |
| submit_button.click( | |
| transcribe_and_download, | |
| inputs=[file_input, api_key_input], | |
| outputs=[content, file_output_txt] | |
| ) | |
| submit2_button.click( | |
| transcribe_and_summary, | |
| inputs=[content, api_key_input], | |
| outputs=[summary, file_output2_txt] | |
| ) | |
| return demo | |
| # First, try importing gradio. If it fails, attempt to install it. | |
| try: | |
| import gradio as gr | |
| except ImportError: | |
| import sys | |
| import gradio as gr | |
| # Run the interface | |
| if __name__ == "__main__": | |
| demo = setup_gradio_interface() | |
| demo.launch() |