6 ms·
Show HN: A personalised AI tutor with < 1s voice responses
TLDR: We created a personalised Andrej Karpathy tutor that can response to questions about his Youtube videos in sub 1 second responses (voice-to-voice). We do this using a voice enabled RAG agent. See later in the post for demo link, Github Repo and blog write up.
A few weeks ago we released the worlds fastest voice bot, achieving 500ms voice-to-voice response times, including a 200ms delay waiting for a user to stop speaking.
After reaching the front page of HN, we thought about how we could take this a step further based on feedback we were getting from the community. Many companies were looking for a way to implement function calling and RAG with voice interfaces while retaining a low enough latency. We couldn’t find many resources about how to do this online that:
1. Allowed us to achieve sub-second voice-to-voice latency
2. Was more flexible than existing solutions. Vapi, Retell, [Bland.ai](http://Bland.ai http://Bland.ai) are too opinionated plus since they just orchestrate API’s which incur network latency at every step. See requirement above
3. The unit economics actually work at scale.
So we decided to create a implementation of our own.
Process:
As we mentioned in our previous release, if you want to achieve response times this low you need to make everything as local as possible. So below was our setup
- Local STT: Deepgram model
- Local Embedding model: Nomic v1.5
- Local VectorDB: Turso
- Local LLM: Llama 3B
- Local TTS: Deepgram model
From our previous example, the only new components where:
- Local Embedding model: We chose Nomic Embed text v1.5 model that gave a processing time of roughly ~200ms
- Turso offers local embedded replicas combined with edgeDB’s which meant we were able to achieve 0.01 second read times. Pinecone also gave us good times of 0.043 seconds.
The above changes led us to achieve sub 1 second voice-to-voice response times
Application:
With Andrej Karpathy’s announcement around [Eureka Labs](https://eurekalabs.ai/ https://eurekalabs.ai/), a new AI+Education company we thought we would create our very own personalised Andrej tutor.
Listen to anyone of his Youtube lectures, as soon as your start specking, the video will pause and he will reply. Once your question has been answered you can then tell him to continue with the lecture and the video will automatically start playing.
Demo: https://educationbot.cerebrium.ai/ https://educationbot.cerebrium.ai/
Blog: https://www.cerebrium.ai/blog/creating-a-realtime-rag-voice-agent https://www.cerebrium.ai/blog/creating-a-realtime-rag-voice-...
Github Repo: https://github.com/CerebriumAI/examples/tree/master/19-voice-rag-agent https://github.com/CerebriumAI/examples/tree/master/19-voice...
For demo purposes:
- We used OpenAI for GPT-4-mini and embeddings (its cheaper to run on a CPU than GPU’s when running demos at scale. These changes add about ~1 second to the response time
- We used Eleven labs to clone his voice to make replies sound more realistic. This adds about 300ms to the response time.
The improvements that can be made which we would like the community to contribute to are:
- Embed the video screens as well that when you ask certain questions it can show you the relevant lecture slide for the same chuck that it got context from to answer.
- Insert the timestamps in the vectorDB timestamps so that if a question will be answered later in the lecture he can let you know
This unlocks so many use cases in education, employee training, sales etc that it would be great to see what the community builds!
- ukuina 2y agoHow is using a Deepgram model "local"?
- za_mike157 2y agoWe partnered with them and so its locally running their STT model on the container. You will see in the code we have a image reference which includes the Deepgram model
- ukuina 2y agoThat is awesome!
- ukuina 2y agoNot sure why it requires a Deepgram API key if it is running locally? > DeepgramClient(os.getenv("DEEPGRAM_API_KEY"))
- za_mike157 2y agoThat is only for the data processing step that I run locally on my Mac to embed all his Youtube videos and upload to the VectorDB. Im not running Deepgram locally there
- tunesmith 2y agoI think one of the hardest things about voice AI is being able to gracefully modulate between styles of input/output delay. In actual technical conversations sometimes it is appropriate to patiently wait for someone to ask a very difficult question with delays in speech, and sometimes it is appropriate to interrupt regularly and ask brief pointed questions that require one-word answers, and everywhere in between. I'm really looking forward to having that kind of interchange with an LLM.
- za_mike157 2y agoyou are 100% correct! Here we just check if there is a pause of 200ms (you can change that in the code). I haven't seen any models that can detect if the user has finish speaking base on the question or social cues. You also don't want to make the delay so long since then it sound unnatural