xyfcc commited on
Commit
9f92c04
·
verified ·
1 Parent(s): 3071ac2

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -0
app.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ from transformers import MarianMTModel, MarianTokenizer
3
+ import speech_recognition as sr
4
+ from gtts import gTTS
5
+ import pyttsx3
6
+ import tempfile
7
+ import re
8
+ # import os
9
+
10
+ # os.environ["no_proxy"]="localhost,127.0.0.1,::1"
11
+
12
+ def clean_text(text):
13
+ """Clean text to handle punctuations and special characters."""
14
+ return re.sub(r'[^\w\s,.!?;:]', '', text)
15
+
16
+ # Load translation models
17
+ tokenizer_en2zh = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
18
+ model_en2zh = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-en-zh")
19
+
20
+ tokenizer_zh2en = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-zh-en")
21
+ model_zh2en = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-zh-en")
22
+
23
+ def translate_text(input_text, target_language):
24
+ cleaned_text = clean_text(input_text)
25
+ if target_language == "en":
26
+ tokenizer, model = tokenizer_zh2en, model_zh2en
27
+ else:
28
+ tokenizer, model = tokenizer_en2zh, model_en2zh
29
+
30
+ inputs = tokenizer(cleaned_text, return_tensors="pt", padding=True, truncation=True, max_length=512)
31
+ translated_tokens = model.generate(**inputs)
32
+ translated_text = tokenizer.decode(translated_tokens[0], skip_special_tokens=True)
33
+ return translated_text
34
+
35
+ def speech_to_text(audio_file):
36
+ recognizer = sr.Recognizer()
37
+ with sr.AudioFile(audio_file) as source:
38
+ audio = recognizer.record(source)
39
+ return recognizer.recognize_google(audio)
40
+
41
+ def synthesize_speech(text, language, method='gtts'):
42
+ if method == 'gtts':
43
+ tts = gTTS(text=text, lang=language)
44
+ temp_audio = tempfile.NamedTemporaryFile(delete=False, suffix=".mp3")
45
+ tts.save(temp_audio.name)
46
+ elif method == 'pyttsx3':
47
+ engine = pyttsx3.init()
48
+ engine.save_to_file(text, temp_audio.name)
49
+ engine.runAndWait()
50
+ return temp_audio.name
51
+
52
+ def process_input(input_text=None, audio_file=None, method='gtts'):
53
+ recognized_text = ""
54
+ if audio_file:
55
+ recognized_text = speech_to_text(audio_file)
56
+ elif input_text:
57
+ recognized_text = input_text
58
+ else:
59
+ return "No input provided", "", None
60
+
61
+ detected_lang = "zh" if re.search(r'[\u4e00-\u9fff]', recognized_text) else "en"
62
+ target_language = "zh" if detected_lang == "en" else "en"
63
+
64
+ translated_text = translate_text(recognized_text, target_language)
65
+ audio_path = synthesize_speech(translated_text, target_language, method=method)
66
+
67
+ return recognized_text, translated_text, audio_path
68
+
69
+ # Gradio interface
70
+ # Gradio Interface
71
+ with gr.Blocks() as demo:
72
+ gr.Markdown("## 中英文互译及语音播报")
73
+
74
+ inputs = [
75
+ gr.Textbox(label="Enter Text"),
76
+ gr.Audio(sources=["upload","microphone"], type="filepath", label="Or speak into the microphone")
77
+ ]
78
+
79
+ translate_button = gr.Button("翻译并播报")
80
+
81
+ outputs = [
82
+ gr.Textbox(label="Recognized Text"),
83
+ gr.Textbox(label="翻译结果"),
84
+ gr.Audio(label="语音播报")
85
+ ]
86
+
87
+ translate_button.click(fn=process_input, inputs=inputs, outputs=outputs)
88
+
89
+ demo.launch(server_name="0.0.0.0", server_port=7860,share=True)