Spaces:
Sleeping
Sleeping
| #from dotenv import load_dotenv, find_dotenv | |
| #_ = load_dotenv(find_dotenv()) | |
| import solara | |
| from typing import List | |
| from typing_extensions import TypedDict | |
| class MessageDict(TypedDict): | |
| role: str | |
| content: str | |
| from tempfile import NamedTemporaryFile | |
| import ipywebrtc | |
| from ipywebrtc import AudioRecorder, CameraStream, AudioStream | |
| import ipywidgets | |
| from whispercpp import Whisper | |
| from elevenlabs import voices, generate, save, set_api_key | |
| from gtts import gTTS | |
| w = Whisper('tiny') | |
| import os | |
| os.environ['OPENAI_API_BASE'] = "https://shale.live/v1" | |
| os.environ['OPENAI_API_KEY'] = os.getenv("SHALE_API_KEY") | |
| set_api_key(os.getenv("ELEVENLABS_API_KEY")) | |
| from langchain.chat_models import ChatOpenAI | |
| llm = ChatOpenAI(temperature=0.7) | |
| from IPython.display import display | |
| messages: solara.Reactive[List[MessageDict]] = solara.reactive([]) | |
| user_message_count = solara.reactive(0) | |
| resultado = solara.reactive("") | |
| def Page(): | |
| with solara.Column(style={"padding": "30px"}): | |
| solara.Title("Talk to Llama2") | |
| solara.Markdown("#Talk to Llama2") | |
| user_message_count.value = len([m for m in messages.value if m["role"] == "user"]) | |
| def send(message): | |
| messages.value = [ | |
| *messages.value, | |
| {"role": "user", "content": message}, | |
| ] | |
| def response(message): | |
| messages.value = [ | |
| *messages.value, | |
| {"role": "assistant", "content": llm.predict(message)} | |
| ] | |
| def result(): | |
| if messages.value !=[]: response(messages.value[-1]["content"]) | |
| generated_response = solara.use_thread(result, [user_message_count.value]) | |
| solara.ProgressLinear(generated_response.state == solara.ResultState.RUNNING) | |
| with solara.Column(style={"width": "70%"}): | |
| with solara.Sidebar(): | |
| solara.Markdown("## Send a voice message") | |
| solara.Markdown("### Recorder") | |
| camera = CameraStream(constraints={'audio': True,'video':False}) | |
| recorder = AudioRecorder(stream=camera) | |
| display(recorder) | |
| def MyButton(): | |
| def transcribe_voice(): | |
| with NamedTemporaryFile(suffix=".webm") as temp: | |
| with open(f"{temp.name}", 'wb') as f: | |
| f.write(recorder.audio.value) | |
| result = w.transcribe(f"{temp.name}", lang="en") | |
| text = w.extract_text(result) | |
| resultado.value = text[0] | |
| messages.value = [*messages.value, {"role": "user", "content": f"{resultado.value}"},] | |
| solara.Button("Send voice message", on_click=transcribe_voice) | |
| MyButton() | |
| if resultado.value != "": | |
| solara.Markdown("## Transcribed message:") | |
| solara.Text(f"{resultado.value}", style={"color":"blue"}) | |
| with solara.lab.ChatBox(): | |
| for counter, item in enumerate(messages.value): | |
| with solara.lab.ChatMessage( | |
| user=item["role"] == "user", | |
| name="Assistant" if item["role"] == "assistant" else "User", | |
| avatar_background_color="#33cccc" if item["role"] == "assistant" else "#ff991f", | |
| border_radius="20px", | |
| ): | |
| solara.Markdown(item["content"]) | |
| if counter == 2*user_message_count.value-1: | |
| tts = gTTS(f"{messages.value[-1]['content']}") | |
| with NamedTemporaryFile(suffix=".mp3") as temp: | |
| tts.save(f"{temp.name}") | |
| audio = ipywidgets.Audio.from_file(filename=f"{temp.name}", autoplay=True, loop=False) | |
| if generated_response.state != solara.ResultState.RUNNING: | |
| display(audio) | |
| # voice_name = "Adam" | |
| # model_name = "eleven_monolingual_v1" | |
| # audio = generate(text=f"{messages.value[-1]['content']}", voice=voice_name, model=model_name) | |
| # with NamedTemporaryFile(suffix=".mp3") as temp: | |
| # save(audio, f"{temp.name}") | |
| # audio = ipywidgets.Audio.from_file(filename=f"{temp.name}", autoplay=False, loop=False) | |
| # display(audio) | |
| solara.lab.ChatInput(send_callback=send, disabled=(generated_response.state == solara.ResultState.RUNNING)) | |