Spaces:
Running
Running
| import gradio as gr | |
| from groq import Groq | |
| import os | |
| from whisper_support import transcribe | |
| from kokoro_support import generate_tts, voice_choices | |
| groq_api_key = os.environ.get("GROQ_API_KEY") | |
| client = Groq(api_key = groq_api_key) | |
| options = { | |
| 'always agree': [ #I hate that I have a space here but I'm also being lazy. | |
| 'meta-llama/llama-4-maverick-17b-128e-instruct', | |
| 'You are roleplaying as a naughty friend who affirms and encourages all ideas, even silly ideas. You talk in a way that a 7 year old can understand. Keep your responses short and expressive.'], | |
| 'careful': [ | |
| 'moonshotai/kimi-k2-instruct-0905', | |
| 'You are roleplaying as a good friend who is kind, fun and supportive, but who gently pushes back on bad or dangerous ideas, and encourages honesty and integrity. You talk in a way that a 7 year old can understand. Keep your responses short and expressive.' | |
| ] | |
| } | |
| chat_history = [] | |
| def groq_voicechat(new_message: tuple, chat_history: list[dict], chatbot_options: str): | |
| ''' | |
| Groq chat API call wrapper. | |
| inputs: | |
| - model [str]: model from model_list (cbf static typing from the list) | |
| - chat_history [list[dict]]: list of dictionaries of chat hist, needs "role" and "content" vars as strings | |
| - new_message [tuple]: new user input message (assuming we're only accepting user inputs) from voice recording, to be transcribed. | |
| - system prompt [str]: optional system prompt for whatever chat you're using | |
| outputs: | |
| - "" - used to delete old input msg in chat textbox lol | |
| - nonsys_msg_hist [list[dict]]: updated chat history | |
| ''' | |
| model = options[chatbot_options][0] | |
| system_prompt = options[chatbot_options][1] | |
| #augment chat hist | |
| nonsys_msg_hist = [{key: x[key] for key in ["role", "content"] if key in x} for x in chat_history] #clean the chatbot bullshit out | |
| print(nonsys_msg_hist) | |
| text_input = transcribe(new_message) | |
| if text_input: | |
| if text_input.startswith("Error"): | |
| text_input = "Error in audio transcription." | |
| return "error lol idk make this better later" | |
| nonsys_msg_hist.extend( | |
| [ | |
| { | |
| "role": "user", | |
| "content": text_input, | |
| } | |
| ] | |
| ) | |
| # use sys prompt | |
| input_msg_hist = [ | |
| { | |
| "role": "system", | |
| "content": system_prompt, | |
| } | |
| ] | |
| input_msg_hist.extend(nonsys_msg_hist) | |
| chat_completion = client.chat.completions.create( | |
| messages = input_msg_hist, | |
| model = model, | |
| ) | |
| output_msg = chat_completion.choices[0].message.content | |
| # add to chat hist | |
| nonsys_msg_hist.extend( | |
| [ | |
| { | |
| "role": "assistant", | |
| "content": output_msg | |
| } | |
| ] | |
| ) | |
| return nonsys_msg_hist | |
| def process_audio(audio: tuple): | |
| return audio | |
| def create_demo(): | |
| with gr.Blocks() as demo: | |
| with gr.Row(): | |
| chatbot_options = gr.Radio( | |
| choices = list(options.keys()), | |
| value = list(options.keys())[0], | |
| label = "Chatbot behaviours", | |
| show_label=True | |
| ) | |
| with gr.Row(): | |
| chatbot = gr.Chatbot( | |
| label="Conversation", | |
| editable='all', | |
| ) | |
| with gr.Row(): | |
| voiceinput = gr.Audio( | |
| label="Input Audio", | |
| sources=["microphone"], | |
| type="numpy", | |
| streaming=False, | |
| ) | |
| with gr.Row(): | |
| playback_button = gr.Button("playback last message") | |
| with gr.Accordion("Chatbot Voice Options", open = False): | |
| voice_opps = gr.Dropdown( | |
| label = "Choose the voice of the chatbot (some are American and some are British!)", | |
| choices = list(voice_choices.keys()), | |
| value = list(voice_choices.keys())[0] | |
| ) | |
| voice_speed = gr.Slider( | |
| label = "Choose the speed at which the chatbot talks", | |
| minimum = 0.5, | |
| maximum = 2, | |
| value = 1, | |
| step = 0.1, | |
| ) | |
| with gr.Row(): | |
| clear = gr.ClearButton(components = [voiceinput, chatbot], value = "Clear chat history", variant = 'stop') | |
| with gr.Row(): | |
| audio_out = gr.Audio( | |
| label = "Output Audio", | |
| interactive = False, | |
| autoplay = True, | |
| streaming = True, | |
| visible = "hidden", | |
| ) | |
| output = voiceinput.stop_recording( | |
| groq_voicechat, | |
| [voiceinput, chatbot, chatbot_options], | |
| [chatbot] | |
| ) #WHAT AM I DOING LOL - COME BACK TO THIS | |
| def playback_last_message(chat_history, voice, speed): | |
| if len(chat_history) > 0: | |
| last_message = chat_history[-1]['content'][0]['text'] | |
| gen_object = generate_tts(last_message, voice_choices[voice], speed) | |
| for chunk in gen_object: | |
| yield chunk | |
| return None | |
| playback_button.click( | |
| playback_last_message, | |
| inputs=[chatbot, voice_opps, voice_speed], | |
| outputs=[audio_out] | |
| ) | |
| return demo | |
| if __name__ == "__main__": | |
| demo = create_demo() | |
| demo.launch( | |
| auth=("DigitalChild", "IhateBroccoli123"), | |
| ssr_mode=False, | |
| theme="citrus" | |
| ) | |