translator.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import os
  2. import openai
  3. from RealtimeSTT import AudioToTextRecorder
  4. from RealtimeTTS import TextToAudioStream, AzureEngine
  5. # Setup OpenAI API key
  6. openai.api_key = os.environ.get("OPENAI_API_KEY")
  7. # Text-to-Speech Stream Setup (alternative engines: SystemEngine or ElevenlabsEngine)
  8. engine = AzureEngine(
  9. os.environ.get("AZURE_SPEECH_KEY"),
  10. "eastus"
  11. )
  12. stream = TextToAudioStream(engine, log_characters=True)
  13. # Speech-to-Text Recorder Setup
  14. recorder = AudioToTextRecorder(
  15. model="medium",
  16. )
  17. # Supported languages and their voices
  18. languages = [
  19. ["english", "AshleyNeural"],
  20. ["german", "AmalaNeural"],
  21. ["french", "DeniseNeural"],
  22. ["spanish", "EstrellaNeural"],
  23. ["portuguese", "FernandaNeural"],
  24. ["italian", "FabiolaNeural"]
  25. ]
  26. def generate_response(messages):
  27. """Generate assistant's response using OpenAI."""
  28. for chunk in openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages, stream=True):
  29. text_chunk = chunk["choices"][0]["delta"].get("content")
  30. if text_chunk:
  31. yield text_chunk
  32. def select_language():
  33. """Display language options and get user's choice."""
  34. for index, language in enumerate(languages, start=1):
  35. print(f"{index}. {language[0]}")
  36. language_number = input("Select language to translate to (1-6): ")
  37. return languages[int(language_number) - 1]
  38. def main():
  39. """Main translation loop."""
  40. language_info = select_language()
  41. engine.set_voice(language_info[1])
  42. system_prompt_message = {
  43. 'role': 'system',
  44. 'content': f'Translate the given text to {language_info[0]}. Output only the translated text.'
  45. }
  46. while True:
  47. print("\nSay something!")
  48. # Capture user input from microphone
  49. user_text = recorder.text()
  50. print(f"Input text: {user_text}")
  51. user_message = {'role': 'user', 'content': user_text}
  52. # Get assistant response and play it
  53. translation_stream = generate_response([system_prompt_message, user_message])
  54. print("Translation: ", end="", flush=True)
  55. stream.feed(translation_stream)
  56. stream.play()
  57. if __name__ == "__main__":
  58. main()