import subprocess import sys # Install dependencies from apt_requirements.txt def install_apt_dependencies(): try: subprocess.check_call(['sudo', 'apt-get', 'install', '-y'] + [line.strip() for line in open('BLAH.txt').readlines()]) print("Apt dependencies installed successfully.") except Exception as e: print("Failed to install apt dependencies:", str(e)) sys.exit(1) # Install dependencies from requirements.txt def install_pip_dependencies(): try: subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-r', 'BLAHBLAH.txt']) print("Pip dependencies installed successfully.") except Exception as e: print("Failed to install pip dependencies:", str(e)) sys.exit(1) # Install dependencies install_apt_dependencies() install_pip_dependencies() import streamlit as st import os import time import pvporcupine import pyaudio import struct import wave from elevenlabs import stream from groq import Groq import threading # Initialize Groq client groq_client = Groq(api_key=os.environ.get("GROQ_API_KEY")) # Initialize ElevenLabs client from elevenlabs.client import ElevenLabs eleven_client = ElevenLabs(api_key=os.environ.get("ELEVEN_API_KEY")) # Porcupine wake word detector porcupine = pvporcupine.create( access_key=os.environ.get("PORCUPINE_ACCESS_KEY"), keywords=["grapefruit"] ) # Audio recording parameters CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 def record_audio(duration): p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) frames = [] for _ in range(0, int(RATE / CHUNK * duration)): data = stream.read(CHUNK) frames.append(data) stream.stop_stream() stream.close() p.terminate() return b''.join(frames) def save_audio(audio_data, filename): wf = wave.open(filename, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(pyaudio.PyAudio().get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(audio_data) wf.close() def transcribe_audio(filename): with open(filename, "rb") as file: transcription = groq_client.audio.transcriptions.create( file=(filename, file.read()), model="whisper-large-v3", response_format="verbose_json", ) return transcription.text def get_ai_response(message): chat_completion = groq_client.chat.completions.create( messages=[ { "role": "user", "content": message, } ], model="llama-3.1-70b-versatile", ) return chat_completion.choices[0].message.content def text_to_speech(text): audio_stream = eleven_client.generate( text=text, stream=True ) stream(audio_stream) def listen_for_wake_word(): pa = pyaudio.PyAudio() audio_stream = pa.open( rate=porcupine.sample_rate, channels=1, format=pyaudio.paInt16, input=True, frames_per_buffer=porcupine.frame_length ) while True: pcm = audio_stream.read(porcupine.frame_length) pcm = struct.unpack_from("h" * porcupine.frame_length, pcm) keyword_index = porcupine.process(pcm) if keyword_index >= 0: print("Wake word detected!") return True def main(): st.title("Voice Conversation App with Wake Word") if st.button("Start Conversation"): st.write("Listening for wake word 'computer'...") wake_word_detected = listen_for_wake_word() if wake_word_detected: st.write("Wake word detected! Starting conversation...") while True: st.write("Listening for your message...") audio_data = record_audio(5) # Record for 5 seconds save_audio(audio_data, "user_message.wav") user_message = transcribe_audio("user_message.wav") st.write(f"You said: {user_message}") ai_response = get_ai_response(user_message) st.write(f"AI response: {ai_response}") text_to_speech(ai_response) time.sleep(2) # Short pause before next turn if __name__ == "__main__": main()