translator_ui.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import openai
  2. import tkinter as tk
  3. from tkinter import Scrollbar, Text
  4. from RealtimeSTT import AudioToTextRecorder
  5. from RealtimeTTS import TextToAudioStream, AzureEngine
  6. import threading
  7. import os
  8. import logging
  9. import time
  10. import math
  11. openai.api_key = os.environ.get("OPENAI_API_KEY")
  12. engine = AzureEngine(os.environ.get("AZURE_SPEECH_KEY"), "germanywestcentral")
  13. system_prompt = {
  14. 'role': 'system',
  15. 'content': 'Translate the given text to english. Output only the english text. Input: "Hallo, wie geht es dir?" Output: "Hello, how are you?"'
  16. }
  17. stream = TextToAudioStream(engine)
  18. output = ""
  19. # Global lists to store our canvases and their rectangles
  20. canvases = []
  21. level_rects = []
  22. def generate(messages):
  23. global output
  24. output = ""
  25. for chunk in openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages, stream=True):
  26. if (text_chunk := chunk["choices"][0]["delta"].get("content")):
  27. output += text_chunk
  28. print(text_chunk, end="", flush=True)
  29. yield text_chunk
  30. def update_status(text):
  31. status_label.config(text=text)
  32. def map_value(value):
  33. return min(max((math.log(value * 4, 1.5) - 10) / 10, 0.0), 1.0)
  34. def update_levels(levels):
  35. for level, canvas, rect in zip(levels, canvases, level_rects):
  36. y = canvas_height - (canvas_height * level)
  37. canvas.coords(rect, 15, y, 65, canvas_height)
  38. def generate_translation(user_text):
  39. user_message = {'role': 'user', 'content': user_text}
  40. generator = generate([system_prompt] + [user_message])
  41. stream.feed(generator)
  42. recorder.long_term_noise_calculation = False
  43. stream.play()
  44. recorder.long_term_noise_calculation = True
  45. start_recording()
  46. def wait_for_recording_finished():
  47. user_text = recorder.text()
  48. input_text.config(state=tk.NORMAL)
  49. input_text.delete(1.0, tk.END)
  50. input_text.insert(tk.END, user_text)
  51. input_text.config(state=tk.DISABLED)
  52. threading.Thread(target=generate_translation, args=(user_text,)).start()
  53. root.after(0, update_status, "translating")
  54. def start_recording():
  55. threading.Thread(target=wait_for_recording_finished).start()
  56. recorder = AudioToTextRecorder(
  57. model="medium",
  58. language="de",
  59. )
  60. def update_output_ui():
  61. update_levels([map_value(recorder.level_short_term), map_value(recorder.level_long_term), map_value(recorder.level_floor), map_value(recorder.level_peak), recorder.voice_deactivity_probability])
  62. update_status(recorder.state if recorder.long_term_noise_calculation else "translating")
  63. output_text.config(state=tk.NORMAL)
  64. output_text.delete(1.0, tk.END)
  65. output_text.insert(tk.END, output)
  66. output_text.config(state=tk.DISABLED)
  67. def update_output():
  68. root.after(0,update_output_ui)
  69. root.after(100, update_output)
  70. root = tk.Tk()
  71. root.title("Translator")
  72. root.geometry("600x900")
  73. frame = tk.Frame(root, padx=10, pady=10)
  74. frame.pack(padx=20, pady=20, expand=True, fill=tk.BOTH)
  75. status_label = tk.Label(frame, text="Initializing...")
  76. status_label.pack(pady=10)
  77. input_text_label = tk.Label(frame, text="Input")
  78. input_text_label.pack(pady=10)
  79. input_text = Text(frame, wrap=tk.WORD, height=10, state=tk.DISABLED)
  80. input_text.pack(pady=10)
  81. output_text_label = tk.Label(frame, text="Output")
  82. output_text_label.pack(pady=10)
  83. output_text = Text(frame, wrap=tk.WORD, height=10, state=tk.DISABLED)
  84. output_text.pack(pady=10)
  85. canvas_width = 80
  86. canvas_height = 200
  87. canvas_frame = tk.Frame(frame)
  88. canvas_frame.pack(pady=20)
  89. for _ in range(5):
  90. canvas = tk.Canvas(canvas_frame, width=canvas_width, height=canvas_height, bg="white")
  91. canvas.pack(side=tk.LEFT, padx=5)
  92. canvases.append(canvas)
  93. rect = canvas.create_rectangle(15, canvas_height, 65, canvas_height, fill="blue")
  94. level_rects.append(rect)
  95. root.after(500, start_recording)
  96. root.after(500, update_output)
  97. root.mainloop()