{"id":147328,"date":"2025-03-21T08:26:22","date_gmt":"2025-03-21T08:26:22","guid":{"rendered":"https:\/\/peraltafinancing.com\/analytics\/build-an-audio-rag-with-assemblyai-qdrant-deepseek-r1\/"},"modified":"2025-03-21T08:26:22","modified_gmt":"2025-03-21T08:26:22","slug":"build-an-audio-rag-with-assemblyai-qdrant-deepseek-r1","status":"publish","type":"post","link":"https:\/\/fivemor.com\/?p=147328","title":{"rendered":"Build an Audio RAG with AssemblyAI, Qdrant &#038; DeepSeek-R1"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<div id=\"article-start\">\n<p>Tired of manually sifting through hours of audio to find key insights? This guide teaches you to build an <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2021\/10\/complete-guide-to-build-your-ai-chatbot-with-nlp-in-python\/\" target=\"_blank\" rel=\"noreferrer noopener\">AI-powered chatbot<\/a> that transforms recordings \u2013 meetings, podcasts, interviews\u2014into interactive conversations. Using AssemblyAI for precise transcription with speaker labels, Qdrant for fast data storage, and <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2025\/01\/deepseek-r1\/\" target=\"_blank\" rel=\"noreferrer noopener\">DeepSeek-R1<\/a> via SambaNova Cloud for smart responses, you\u2019ll create a RAG tool that answers questions like <em>\u201cWhat did [Speaker] say?\u201d<\/em> or<em> \u201cSummarize this segment.\u201d <\/em>Let\u2019s turn your audio into a searchable, AI-driven dialogue by building a RAG system with AssemblyAI, Qdrant, and DeepSeek-R1.<\/p>\n<h4 class=\"wp-block-heading\" id=\"h-learning-objectives\">Learning Objectives<\/h4>\n<ul class=\"wp-block-list\">\n<li>Leverage AssemblyAI API to transcribe audio files with speaker diarization, converting conversations into structured text data for analysis.<\/li>\n<li>Deploy Qdrant Vector Database to store and efficiently retrieve embeddings of transcribed audio content using HuggingFace models.<\/li>\n<li>Implement RAG with DeepSeek R1 model via SambaNova Cloud to generate context-aware chatbot responses.<\/li>\n<li>Build a Streamlit Web Interface for users to upload audio files, visualize transcripts, and interact with the chatbot in real time.<\/li>\n<li>Integrate End-to-End Workflow combining audio processing, vector storage, and AI-driven response generation to create a scalable audio-based chat application.<\/li>\n<\/ul>\n<p><em><strong>This article was published as a part of the\u00a0<\/strong><\/em><a href=\"https:\/\/www.analyticsvidhya.com\/datahack\/blogathon\" target=\"_blank\" rel=\"noreferrer noopener\"><em><strong>Data Science Blogathon.<\/strong><\/em><\/a><a href=\"https:\/\/www.analyticsvidhya.com\/learning-path\/chat\/?article_id=226564&amp;utm_source=blog_banner\"\/><\/p>\n<h2 class=\"wp-block-heading\" id=\"h-what-is-assemblyai\">What is AssemblyAI?<\/h2>\n<p>AssemblyAI is your go-to tool for turning audio into actionable insights. Whether you\u2019re transcribing podcasts, analyzing customer calls, or captioning videos, its AI-powered speech-to-text engine delivers pinpoint accuracy, even with accents or background noise.<\/p>\n<figure class=\"wp-block-image size-full figure mt-2 mb-2 d-table mx-auto\"><img fetchpriority=\"high\" decoding=\"async\" width=\"600\" height=\"222\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_124147-thumbnail_webp-600x300-1.webp\" alt=\"Audio RAG with AssemblyAI, Qdrant &amp; DeepSeek-R1\" class=\"wp-image-227053\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_124147-thumbnail_webp-600x300-1.webp 600w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_124147-thumbnail_webp-600x300-1-300x111.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_124147-thumbnail_webp-600x300-1-150x56.webp 150w\" sizes=\"(max-width: 600px) 100vw, 600px\"\/><\/figure>\n<h2 class=\"wp-block-heading\" id=\"h-what-is-sambanova-cloud\">What is SambaNova Cloud?<\/h2>\n<p>Imagine running massive open-source models like DeepSeek-R1 (671B) up to 10x faster \u2014 and without the usual infrastructure headaches.<\/p>\n<figure class=\"wp-block-image size-full figure mt-2 mb-2 d-table mx-auto\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"259\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_192534-thumbnail_webp-600x300-1.webp\" alt=\"SambaNova Cloud\" class=\"wp-image-227054\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_192534-thumbnail_webp-600x300-1.webp 600w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_192534-thumbnail_webp-600x300-1-300x130.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_192534-thumbnail_webp-600x300-1-150x65.webp 150w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\"\/><\/figure>\n<p>Instead of relying on GPUs, SambaNova UsesRDUs (Reconfigurable Dataflow Units), which unlock faster performance with:<\/p>\n<ul class=\"wp-block-list\">\n<li>Massive in-memory storage \u2014 no constant reloading of models<\/li>\n<li>Efficient dataflow design \u2014 optimized for high-throughput tasks<\/li>\n<li>Instant model switching \u2014 switch between models in microseconds<\/li>\n<li>Run DeepSeek-R1 instantly \u2014 no complicated setup required<\/li>\n<li>Train and fine-tune on the same platform \u2014 all in one place<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\" id=\"h-what-is-qdrant\">What is Qdrant?<\/h2>\n<p><a href=\"https:\/\/www.analyticsvidhya.com\/blog\/2023\/11\/a-deep-dive-into-qdrant-the-rust-based-vector-database\/\" target=\"_blank\" rel=\"noopener\">Qdrant<\/a> is a lightning-fast vector database built to supercharge AI applications, think of it as a search engine that finds needles in haystacks. Whether you\u2019re building a recommendation system, image search tool, or chatbot, Qdrant specializes in similarity searches, quickly pinpointing the closest matches for complex data like text embeddings or visual features.<\/p>\n<figure class=\"wp-block-image size-full figure mt-2 mb-2 d-table mx-auto\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"266\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_125756-thumbnail_webp-600x300-1.webp\" alt=\"Audio RAG with AssemblyAI, Qdrant &amp; DeepSeek-R1\" class=\"wp-image-227055\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_125756-thumbnail_webp-600x300-1.webp 600w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_125756-thumbnail_webp-600x300-1-300x133.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_125756-thumbnail_webp-600x300-1-150x67.webp 150w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\"\/><\/figure>\n<h2 class=\"wp-block-heading\" id=\"h-what-is-deepseek-r1\">What is DeepSeek-R1?<\/h2>\n<p>Deepseek-R1 is a game-changing language model that blends human-like adaptability with cutting-edge AI, making it a standout in natural language processing. Whether you\u2019re crafting content, translating languages, debugging code, or summarizing complex reports, R1 excels at understanding context, tone, and intent, delivering responses that feel intuitive rather than robotic. By prioritizing empathy and precision, Deepseek-R1 isn\u2019t just a tool; it\u2019s a glimpse into a future where AI communicates as naturally as we do.<\/p>\n<figure class=\"wp-block-image size-full figure mt-2 mb-2 d-table mx-auto\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"248\" src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_122800-thumbnail_webp-600x300-1.webp\" alt=\"Audio RAG with AssemblyAI, Qdrant &amp; DeepSeek-R1\" class=\"wp-image-227057\" srcset=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_122800-thumbnail_webp-600x300-1.webp 600w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_122800-thumbnail_webp-600x300-1-300x124.webp 300w, https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/Screenshot_2025-03-14_122800-thumbnail_webp-600x300-1-150x62.webp 150w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\"\/><\/figure>\n<h2 class=\"wp-block-heading\" id=\"h-building-the-rag-model-with-assemblyai-and-deepseek-r1\">Building the RAG Model with AssemblyAI and DeepSeek-R1<\/h2>\n<p>Now that you understand all the components, let\u2019s dive into building our RAG. But before we do that, let\u2019s quickly cover what you\u2019ll need to get started.<\/p>\n<h3 class=\"wp-block-heading\" id=\"h-1-necessary-prerequisites\">1. Necessary Prerequisites<\/h3>\n<p>Below are the prerequisites required:<\/p>\n<p><b>Clone the repository:<\/b><\/p>\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/karthikponna\/chat_with_audios.git\ncd chat_with_audios<\/code><\/pre>\n<p><b>Create and activate the virtual environment:<\/b><\/p>\n<pre class=\"wp-block-code\"><code># For macOS and Linux:\npython3 -m venv venv\nsource venv\/bin\/activate\n\n# For Windows:\npython -m venv venv\n.\\venv\\Scripts\\activate<\/code><\/pre>\n<p><b>Install Required Dependencies:<\/b><\/p>\n<pre class=\"wp-block-code\"><code>pip install -r requirements.txt<\/code><\/pre>\n<p><b>Set Up Environment Variables:<\/b><\/p>\n<p>Create a `.env` file and add your <a href=\"https:\/\/www.assemblyai.com\/app\/api-keys\" target=\"_blank\" rel=\"nofollow noopener\">AssemblyAI<\/a> and <a href=\"https:\/\/cloud.sambanova.ai\/apis\" target=\"_blank\" rel=\"nofollow noopener\">SambaNova<\/a> API keys.<\/p>\n<pre class=\"wp-block-code\"><code>ASSEMBLYAI_API_KEY=\"your_assemblyai_api_key_string\"\nSAMBANOVA_API_KEY=\"your_sambanova_api_key_string\"<\/code><\/pre>\n<p>Now lets start with the coding part.<\/p>\n<h3 class=\"wp-block-heading\" id=\"h-2-retrieval-augmented-generation\">2. Retrieval Augmented Generation<\/h3>\n<p>RAG merges large language models with external data to produce more accurate, context-rich answers. It fetches relevant information at query time, ensuring responses rely on real data instead of just model training.<\/p>\n<h4 class=\"wp-block-heading\" id=\"h-2-1-importing-necessary-libraries\">2.1 Importing Necessary Libraries<\/h4>\n<p>Let\u2019s create a file named rag_code.py. We\u2019ll walk through the code step by step, starting with importing the necessary modules and orchestrating the code architecture using the\u00a0<a href=\"https:\/\/www.llamaindex.ai\/\" target=\"_blank\" rel=\"nofollow noopener\">Llama Index<\/a>.<\/p>\n<pre class=\"wp-block-code\"><code>from qdrant_client import models\nfrom qdrant_client import QdrantClient\nfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding\nfrom llama_index.llms.sambanovasystems import SambaNovaCloud\nfrom llama_index.llms.ollama import Ollama\nimport assemblyai as aai\nfrom typing import List, Dict\n\nfrom llama_index.core.base.llms.types import (\n    ChatMessage,\n    MessageRole,\n)<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-2-2-batch-processing-and-text-embedding-with-hugging-face\">2.2 Batch Processing and Text Embedding with Hugging Face<\/h4>\n<p>Here batch_iterate function splits a list of text into smaller chunks, making it easier to process large datasets. The EmbedData class then loads a Hugging Face embedding model, generates embeddings for each batch of text, and collects these embeddings for later use.<\/p>\n<pre class=\"wp-block-code\"><code>def batch_iterate(lst, batch_size):\n    \"\"\"Yield successive n-sized chunks from lst.\"\"\"\n    for i in range(0, len(lst), batch_size):\n        yield lst[i : i + batch_size]\n\nclass EmbedData:\n\n    def __init__(self, embed_model_name=\"BAAI\/bge-large-en-v1.5\", batch_size = 32):\n        self.embed_model_name = embed_model_name\n        self.embed_model = self._load_embed_model()\n        self.batch_size = batch_size\n        self.embeddings = []\n        \n    def _load_embed_model(self):\n        embed_model = HuggingFaceEmbedding(model_name=self.embed_model_name, trust_remote_code=True, cache_folder=\".\/hf_cache\")\n        return embed_model\n\n    def generate_embedding(self, context):\n        return self.embed_model.get_text_embedding_batch(context)\n        \n    def embed(self, contexts):\n        \n        self.contexts = contexts\n        \n        for batch_context in batch_iterate(contexts, self.batch_size):\n            batch_embeddings = self.generate_embedding(batch_context)\n            self.embeddings.extend(batch_embeddings)<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-2-3-qdrant-vector-database-setup-and-ingestion\">2.3 Qdrant Vector Database Setup and Ingestion<\/h4>\n<ul class=\"wp-block-list\">\n<li>QdrantVDB_QB class initializes a Qdrant vector database by setting up key parameters like collection name, vector dimension, and batch size, and it connects to Qdrant while checking for an existing collection (creating one if needed).<\/li>\n<li>It efficiently uploads data by batching text contexts with their corresponding embeddings and then updating the collection\u2019s configuration accordingly.<\/li>\n<\/ul>\n<pre class=\"wp-block-code\"><code>class QdrantVDB_QB:\n\n    def __init__(self, collection_name, vector_dim = 768, batch_size=512):\n        self.collection_name = collection_name\n        self.batch_size = batch_size\n        self.vector_dim = vector_dim\n        \n    def define_client(self):\n        \n        self.client = QdrantClient(url=\"http:\/\/localhost:6333\", prefer_grpc=True)\n        \n    def create_collection(self):\n        \n        if not self.client.collection_exists(collection_name=self.collection_name):\n\n            self.client.create_collection(collection_name=f\"{self.collection_name}\",\n                                          \n                                          vectors_config=models.VectorParams(size=self.vector_dim,\n                                                                             distance=models.Distance.DOT,\n                                                                             on_disk=True),\n                                          \n                                          optimizers_config=models.OptimizersConfigDiff(default_segment_number=5,\n                                                                                        indexing_threshold=0),\n                                          \n                                          quantization_config=models.BinaryQuantization(\n                                                        binary=models.BinaryQuantizationConfig(always_ram=True)),\n                                         )\n            \n    def ingest_data(self, embeddata):\n    \n        for batch_context, batch_embeddings in zip(batch_iterate(embeddata.contexts, self.batch_size), \n                                                    batch_iterate(embeddata.embeddings, self.batch_size)):\n    \n            self.client.upload_collection(collection_name=self.collection_name,\n                                          vectors=batch_embeddings,\n                                          payload=[{\"context\": context} for context in batch_context])\n\n        self.client.update_collection(collection_name=self.collection_name,\n                                      optimizer_config=models.OptimizersConfigDiff(indexing_threshold=20000)\n                                     )<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-2-4-query-embedding-retriever\">2.4 Query Embedding Retriever<\/h4>\n<ul class=\"wp-block-list\">\n<li>The Retriever class is designed to bridge the gap between user queries and a vector database by initializing with a vector database client and an embedding model.<\/li>\n<li>Its search method transforms a query into an embedding using the model, then performs a vector search on the database with fine-tuned quantization parameters to quickly retrieve relevant results.<\/li>\n<\/ul>\n<pre class=\"wp-block-code\"><code>class Retriever:\n\n    def __init__(self, vector_db, embeddata):\n        \n        self.vector_db = vector_db\n        self.embeddata = embeddata\n\n    def search(self, query):\n        query_embedding = self.embeddata.embed_model.get_query_embedding(query)\n        \n        \n        result = self.vector_db.client.search(\n            collection_name=self.vector_db.collection_name,\n            \n            query_vector=query_embedding,\n            \n            search_params=models.SearchParams(\n                quantization=models.QuantizationSearchParams(\n                    ignore=False,\n                    rescore=True,\n                    oversampling=2.0,\n                )\n            ),\n            \n            timeout=1000,\n        )\n\n        return result<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-2-5-rag-smart-query-assistant\">2.5 RAG Smart Query Assistant<\/h4>\n<p>The RAG class integrates a retriever and an LLM to generate context-aware responses. It retrieves relevant information from a vector database, formats it into a structured prompt, and sends it to the LLM for a response. I am using SambaNovaCloud to access the LLM model through their API for efficient text generation.<\/p>\n<pre class=\"wp-block-code\"><code>class RAG:\n\n    def __init__(self,\n                 retriever,\n                 llm_name = \"Meta-Llama-3.1-405B-Instruct\"\n                 ):\n        \n        system_msg = ChatMessage(\n            role=MessageRole.SYSTEM,\n            content=\"You are a helpful assistant that answers questions about the user's document.\",\n        )\n        self.messages = [system_msg, ]\n        self.llm_name = llm_name\n        self.llm = self._setup_llm()\n        self.retriever = retriever\n        self.qa_prompt_tmpl_str = (\"Context information is below.\\n\"\n                                   \"---------------------\\n\"\n                                   \"{context}\\n\"\n                                   \"---------------------\\n\"\n                                   \"Given the context information above I want you to think step by step to answer the query in a crisp manner, incase case you don't know the answer say 'I don't know!'.\\n\"\n                                   \"Query: {query}\\n\"\n                                   \"Answer: \"\n                                   )\n\n    def _setup_llm(self):\n\n        return SambaNovaCloud(\n                        model=self.llm_name,\n                        temperature=0.7,\n                        context_window=100000,\n                    )\n\n        # return Ollama(model=self.llm_name,\n        #               temperature=0.7,\n        #               context_window=100000,\n        #             )\n\n    def generate_context(self, query):\n\n        result = self.retriever.search(query)\n        context = [dict(data) for data in result]\n        combined_prompt = []\n\n        for entry in context[:2]:\n            context = entry[\"payload\"][\"context\"]\n\n            combined_prompt.append(context)\n\n        return \"\\n\\n---\\n\\n\".join(combined_prompt)\n\n    def query(self, query):\n        context = self.generate_context(query=query)\n        \n        prompt = self.qa_prompt_tmpl_str.format(context=context, query=query)\n\n        user_msg = ChatMessage(role=MessageRole.USER, content=prompt)\n\n        # self.messages.append(ChatMessage(role=MessageRole.USER, content=prompt))\n                \n        streaming_response = self.llm.stream_complete(user_msg.content)\n        \n        return streaming_response<\/code><\/pre>\n<h4 class=\"wp-block-heading\" id=\"h-2-6-audio-transcription\">2.6 Audio Transcription<\/h4>\n<p>Here Transcribe class initializes by setting the AssemblyAI API key and creating a transcriber. It then processes an audio file using a configuration that enables speaker labels, ultimately returning a list of dictionaries where each entry maps a speaker to their transcribed text.<\/p>\n<pre class=\"wp-block-code\"><code>class Transcribe:\n    def __init__(self, api_key: str):\n        \"\"\"Initialize the Transcribe class with AssemblyAI API key.\"\"\"\n        aai.settings.api_key = api_key\n        self.transcriber = aai.Transcriber()\n        \n    def transcribe_audio(self, audio_path: str) -&gt; List[Dict[str, str]]:\n        \"\"\"\n        Transcribe an audio file and return speaker-labeled transcripts.\n        \n        Args:\n            audio_path: Path to the audio file\n            \n        Returns:\n            List of dictionaries containing speaker and text information\n        \"\"\"\n        # Configure transcription with speaker labels\n        config = aai.TranscriptionConfig(\n            speaker_labels=True,\n            speakers_expected=2  # Adjust this based on your needs\n        )\n        \n        # Transcribe the audio\n        transcript = self.transcriber.transcribe(audio_path, config=config)\n        \n        # Extract speaker utterances\n        speaker_transcripts = []\n        for utterance in transcript.utterances:\n            speaker_transcripts.append({\n                \"speaker\": f\"Speaker {utterance.speaker}\",\n                \"text\": utterance.text\n            })\n            \n        return speaker_transcripts<\/code><\/pre>\n<h3 class=\"wp-block-heading\" id=\"h-3-streamlit-app\">3. Streamlit App<\/h3>\n<p>Streamlit is a Python library that transforms data scripts into interactive web apps, making it perfect for LLM-based solutions.<\/p>\n<ul class=\"wp-block-list\">\n<li>The below code builds a user-friendly app that lets users upload an audio file, view its transcript, and chat accordingly.<\/li>\n<li>AssemblyAI transcribes the uploaded audio into speaker-labeled text.<\/li>\n<li>The transcript is embedded and stored in a Qdrant vector database for efficient retrieval.<\/li>\n<li>A retriever paired with a RAG engine generates context-aware chat responses using these embeddings.<\/li>\n<li>Session state manages chat history and file caching to ensure a smooth experience.<\/li>\n<\/ul>\n<pre class=\"wp-block-code\"><code>import os\nimport gc\nimport uuid\nimport tempfile\nimport base64\nfrom dotenv import load_dotenv\nfrom rag_code import Transcribe, EmbedData, QdrantVDB_QB, Retriever, RAG\nimport streamlit as st\n\nif \"id\" not in st.session_state:\n    st.session_state.id = uuid.uuid4()\n    st.session_state.file_cache = {}\n\nsession_id = st.session_state.id\ncollection_name = \"chat with audios\"\nbatch_size = 32\n\nload_dotenv()\n\ndef reset_chat():\n    st.session_state.messages = []\n    st.session_state.context = None\n    gc.collect()\n\nwith st.sidebar:\n    st.header(\"Add your audio file!\")\n    \n    uploaded_file = st.file_uploader(\"Choose your audio file\", type=[\"mp3\", \"wav\", \"m4a\"])\n\n    if uploaded_file:\n        try:\n            with tempfile.TemporaryDirectory() as temp_dir:\n                file_path = os.path.join(temp_dir, uploaded_file.name)\n                \n                with open(file_path, \"wb\") as f:\n                    f.write(uploaded_file.getvalue())\n                \n                file_key = f\"{session_id}-{uploaded_file.name}\"\n                st.write(\"Transcribing with AssemblyAI and storing in vector database...\")\n\n                if file_key not in st.session_state.get('file_cache', {}):\n                    # Initialize transcriber\n                    transcriber = Transcribe(api_key=os.getenv(\"ASSEMBLYAI_API_KEY\"))\n                    \n                    # Get speaker-labeled transcripts\n                    transcripts = transcriber.transcribe_audio(file_path)\n                    st.session_state.transcripts = transcripts\n                    \n                    # Each speaker segment becomes a separate document for embedding\n                    documents = [f\"Speaker {t['speaker']}: {t['text']}\" for t in transcripts]\n\n                    # embed data    \n                    embeddata = EmbedData(embed_model_name=\"BAAI\/bge-large-en-v1.5\", batch_size=batch_size)\n                    embeddata.embed(documents)\n\n                    # set up vector database\n                    qdrant_vdb = QdrantVDB_QB(collection_name=collection_name,\n                                          batch_size=batch_size,\n                                          vector_dim=1024)\n                    qdrant_vdb.define_client()\n                    qdrant_vdb.create_collection()\n                    qdrant_vdb.ingest_data(embeddata=embeddata)\n\n                    # set up retriever\n                    retriever = Retriever(vector_db=qdrant_vdb, embeddata=embeddata)\n\n                    # set up rag\n                    query_engine = RAG(retriever=retriever, llm_name=\"DeepSeek-R1-Distill-Llama-70B\")\n                    st.session_state.file_cache[file_key] = query_engine\n                else:\n                    query_engine = st.session_state.file_cache[file_key]\n\n                # Inform the user that the file is processed\n                st.success(\"Ready to Chat!\")\n                \n                # Display audio player\n                st.audio(uploaded_file)\n                \n                # Display speaker-labeled transcript\n                st.subheader(\"Transcript\")\n                with st.expander(\"Show full transcript\", expanded=True):\n                    for t in st.session_state.transcripts:\n                        st.text(f\"**{t['speaker']}**: {t['text']}\")\n                \n        except Exception as e:\n            st.error(f\"An error occurred: {e}\")\n            st.stop()     \n\ncol1, col2 = st.columns([6, 1])\n\nwith col1:\n    st.markdown(\"\"\"\n    # RAG over Audio powered by <img decoding=\"async\" src=\"data:image\/png;base64,{}\" width=\"200\" style=\"vertical-align: -15px; padding-right: 10px;\"\/>  and <img decoding=\"async\" src=\"data:image\/png;base64,{}\" width=\"200\" style=\"vertical-align: -5px; padding-left: 10px;\"\/>\n\"\"\".format(base64.b64encode(open(\"assets\/AssemblyAI.png\", \"rb\").read()).decode(),\n           base64.b64encode(open(\"assets\/deep-seek.png\", \"rb\").read()).decode()), unsafe_allow_html=True)\n\nwith col2:\n    st.button(\"Clear \u21ba\", on_click=reset_chat)\n\n# Initialize chat history\nif \"messages\" not in st.session_state:\n    reset_chat()\n\n# Display chat messages from history on app rerun\nfor message in st.session_state.messages:\n    with st.chat_message(message[\"role\"]):\n        st.markdown(message[\"content\"])\n\n# Accept user input\nif prompt := st.chat_input(\"Ask about the audio conversation...\"):\n    # Add user message to chat history\n    st.session_state.messages.append({\"role\": \"user\", \"content\": prompt})\n    # Display user message in chat message container\n    with st.chat_message(\"user\"):\n        st.markdown(prompt)\n\n    # Display assistant response in chat message container\n    with st.chat_message(\"assistant\"):\n        message_placeholder = st.empty()\n        full_response = \"\"\n        \n        # Get streaming response\n        streaming_response = query_engine.query(prompt)\n        \n        for chunk in streaming_response:\n            try:\n                new_text = chunk.raw[\"choices\"][0][\"delta\"][\"content\"]\n                full_response += new_text\n                message_placeholder.markdown(full_response + \"\u258c\")\n            except:\n                pass\n\n        message_placeholder.markdown(full_response)\n\n    # Add assistant response to chat history\n    st.session_state.messages.append({\"role\": \"assistant\", \"content\": full_response})<\/code><\/pre>\n<p>Run the app.py file in the terminal, with the below code, where you can upload an audio file and interact with the chatbot.<\/p>\n<pre class=\"wp-block-code\"><code>streamlit run app.py<\/code><\/pre>\n<p>You can see the demo using the app here. And you can download the sample audio file from here.<\/p>\n<p>\n<iframe src=\"https:\/\/cdn.analyticsvidhya.com\/wp-content\/uploads\/2025\/03\/demo.mp4\" loading=\"lazy\" title=\"YouTube video\" allowfullscreen=\"\"><\/iframe>\n<\/p>\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusion<\/h2>\n<p>We have successfully combined AssemblyAI, SambaNova Cloud, Qdrant, and DeepSeek to build a chatbot that uses Retrieval Augmented Generation over audio. The rag_code.py file manages the RAG workflow, while the app.py file provides a simple Streamlit interface. I want you to interact with this chatbot using different audio files, tweak the code, add new features, and explore the endless possibilities of audio-based chat solutions.<\/p>\n<p>GitHub Repo:\u00a0<a href=\"https:\/\/github.com\/karthikponna\/chat_with_audios\/tree\/main\" target=\"_blank\" rel=\"nofollow noopener\">https:\/\/github.com\/karthikponna\/chat_with_audios\/tree\/main<\/a><\/p>\n<h4 class=\"wp-block-heading\" id=\"h-key-takeaways\">Key Takeaways<\/h4>\n<ul class=\"wp-block-list\">\n<li>Leveraging AssemblyAI for audio transcription enables accurate speaker-labeled text, providing a solid foundation for advanced conversation experiences.<\/li>\n<li>Integrating Qdrant ensures rapid vector-based retrieval, offering quick access to relevant context for more informed responses.<\/li>\n<li>Applying a RAG approach combines retrieval and generation, guaranteeing answers grounded in actual data.<\/li>\n<li>Employing SambaNova Cloud for the LLM delivers robust language understanding, powering engaging, context-aware interactions.<\/li>\n<li>Using Streamlit for the user interface offers a straightforward, interactive environment, simplifying audio-based chatbot deployment.<\/li>\n<\/ul>\n<p><strong>The media shown in this article is not owned by Analytics Vidhya and is used at the Author\u2019s discretion.<\/strong><a href=\"https:\/\/www.analyticsvidhya.com\/blog\/author\/adarsh2039075\/\"\/><a href=\"https:\/\/www.analyticsvidhya.com\/blog\/author\/mimi6\/\"\/><\/p>\n<h2 class=\"wp-block-heading\" id=\"h-frequently-asked-questions\">Frequently Asked Questions<\/h2>\n<div class=\"schema-faq wp-block-yoast-faq-block\">\n<div class=\"schema-faq-section\" id=\"faq-question-1742386020659\"><strong class=\"schema-faq-question\">Q1. What is RAG, and how does it help in building this chatbot?<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. RAG stands for Retrieval Augmented Generation. It fetches relevant data from a vector database, ensuring the chatbot\u2019s answers are grounded in real context rather than just model predictions.<\/p>\n<\/p><\/div>\n<div class=\"schema-faq-section\" id=\"faq-question-1742386029225\"><strong class=\"schema-faq-question\">Q2. How do I customize the embedding model used in rag_code.py?<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. Simply change the embed_model_name in the EmbedData class to your preferred Hugging Face model, ensuring it supports text embedding.<\/p>\n<\/p><\/div>\n<div class=\"schema-faq-section\" id=\"faq-question-1742386038132\"><strong class=\"schema-faq-question\">Q3. How can I modify the prompt template for different use cases?<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. Adjust the qa_prompt_tmpl_str in the RAG class to include any additional instructions or formatting needed for your application.<\/p>\n<\/p><\/div>\n<div class=\"schema-faq-section\" id=\"faq-question-1742386049503\"><strong class=\"schema-faq-question\">Q4.\u00a0Why use Qdrant for storing embeddings?<\/strong> <\/p>\n<p class=\"schema-faq-answer\">A. Qdrant provides efficient vector search, making it easy to quickly find relevant context within large sets of embedded text.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"border-top py-3 author-info my-4\">\n<div class=\"author-card d-flex align-items-center\">\n<div class=\"flex-shrink-0 overflow-hidden\">\n                                    <a href=\"https:\/\/www.analyticsvidhya.com\/blog\/author\/karthik3852845\/\" class=\"text-decoration-none active-avatar\"><br \/>\n                                                                       <img decoding=\"async\" src=\"https:\/\/av-eks-lekhak.s3.amazonaws.com\/media\/lekhak-profile-images\/converted_image_3tjdORM.webp\" width=\"48\" height=\"48\" alt=\"Karthik Ponna\" loading=\"lazy\" class=\"rounded-circle\"\/><\/p>\n<p>                                <\/a>\n                                <\/div>\n<\/p><\/div>\n<p>Hi! I&#8217;m Karthik Ponna, a Machine Learning Engineer at Antern. I&#8217;m deeply passionate about exploring the fields of AI and Data Science, as they constantly evolve and shape the future. I believe writing blogs is a great way to not only enhance my skills and solidify my understanding but also to share my knowledge and insights with others in the community. This helps me connect with like-minded individuals who share a curiosity for technology and innovation.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<p><h4 class=\"fs-24 text-dark\">Login to continue reading and enjoy expert-curated content.<\/h4>\n<p>                        <button class=\"btn btn-primary mx-auto d-table\" data-bs-toggle=\"modal\" data-bs-target=\"#loginModal\" id=\"readMoreBtn\">Keep Reading for Free<\/button>\n                    <\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Tired of manually sifting through hours of audio to find key insights? This guide teaches you to build an AI-powered chatbot that transforms recordings \u2013 meetings, podcasts, interviews\u2014into interactive conversations. Using AssemblyAI for precise transcription with speaker labels, Qdrant for fast data storage, and DeepSeek-R1 via SambaNova Cloud for smart responses, you\u2019ll create a RAG [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":147329,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12033],"tags":[61937,4450,5815,5293,33240,61938,32726],"dealstore":[],"offerexpiration":[],"class_list":["post-147328","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-assemblyai","tag-audio","tag-blogathon","tag-build","tag-deepseekr1","tag-qdrant","tag-rag"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Build an Audio RAG with AssemblyAI, Qdrant &amp; DeepSeek-R1 - Som2ny Network<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fivemor.com\/?p=147328\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Build an Audio RAG with AssemblyAI, Qdrant &amp; DeepSeek-R1 - Som2ny Network\" \/>\n<meta property=\"og:description\" content=\"Tired of manually sifting through hours of audio to find key insights? This guide teaches you to build an AI-powered chatbot that transforms recordings \u2013 meetings, podcasts, interviews\u2014into interactive conversations. Using AssemblyAI for precise transcription with speaker labels, Qdrant for fast data storage, and DeepSeek-R1 via SambaNova Cloud for smart responses, you\u2019ll create a RAG [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fivemor.com\/?p=147328\" \/>\n<meta property=\"og:site_name\" content=\"Som2ny Network\" \/>\n<meta property=\"article:published_time\" content=\"2025-03-21T08:26:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"872\" \/>\n\t<meta property=\"og:image:height\" content=\"473\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fivemor.com\/?p=147328#article\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/?p=147328\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\"},\"headline\":\"Build an Audio RAG with AssemblyAI, Qdrant &#038; DeepSeek-R1\",\"datePublished\":\"2025-03-21T08:26:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=147328\"},\"wordCount\":1420,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=147328#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp\",\"keywords\":[\"AssemblyAI\",\"Audio\",\"Blogathon\",\"Build\",\"DeepSeekR1\",\"Qdrant\",\"RAG\"],\"articleSection\":[\"Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fivemor.com\/?p=147328#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fivemor.com\/?p=147328\",\"url\":\"https:\/\/fivemor.com\/?p=147328\",\"name\":\"Build an Audio RAG with AssemblyAI, Qdrant & DeepSeek-R1 - Som2ny Network\",\"isPartOf\":{\"@id\":\"https:\/\/fivemor.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/fivemor.com\/?p=147328#primaryimage\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/?p=147328#primaryimage\"},\"thumbnailUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp\",\"datePublished\":\"2025-03-21T08:26:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fivemor.com\/?p=147328#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fivemor.com\/?p=147328\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/?p=147328#primaryimage\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp\",\"width\":872,\"height\":473},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fivemor.com\/?p=147328#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fivemor.com\/?bp_activities=1\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Build an Audio RAG with AssemblyAI, Qdrant &#038; DeepSeek-R1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fivemor.com\/#website\",\"url\":\"https:\/\/fivemor.com\/\",\"name\":\"Som2ny Network\",\"description\":\"Daily Deals\",\"publisher\":{\"@id\":\"https:\/\/fivemor.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fivemor.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/fivemor.com\/#organization\",\"name\":\"Som2ny Network\",\"url\":\"https:\/\/fivemor.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"contentUrl\":\"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png\",\"width\":300,\"height\":86,\"caption\":\"Som2ny Network\"},\"image\":{\"@id\":\"https:\/\/fivemor.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/fivemor.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png\",\"caption\":\"admin\"},\"sameAs\":[\"https:\/\/fivemor.com\"],\"url\":\"https:\/\/fivemor.com\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Build an Audio RAG with AssemblyAI, Qdrant & DeepSeek-R1 - Som2ny Network","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fivemor.com\/?p=147328","og_locale":"en_US","og_type":"article","og_title":"Build an Audio RAG with AssemblyAI, Qdrant & DeepSeek-R1 - Som2ny Network","og_description":"Tired of manually sifting through hours of audio to find key insights? This guide teaches you to build an AI-powered chatbot that transforms recordings \u2013 meetings, podcasts, interviews\u2014into interactive conversations. Using AssemblyAI for precise transcription with speaker labels, Qdrant for fast data storage, and DeepSeek-R1 via SambaNova Cloud for smart responses, you\u2019ll create a RAG [&hellip;]","og_url":"https:\/\/fivemor.com\/?p=147328","og_site_name":"Som2ny Network","article_published_time":"2025-03-21T08:26:22+00:00","og_image":[{"width":872,"height":473,"url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp","type":"image\/webp"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"admin","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fivemor.com\/?p=147328#article","isPartOf":{"@id":"https:\/\/fivemor.com\/?p=147328"},"author":{"name":"admin","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371"},"headline":"Build an Audio RAG with AssemblyAI, Qdrant &#038; DeepSeek-R1","datePublished":"2025-03-21T08:26:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fivemor.com\/?p=147328"},"wordCount":1420,"commentCount":0,"publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"image":{"@id":"https:\/\/fivemor.com\/?p=147328#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp","keywords":["AssemblyAI","Audio","Blogathon","Build","DeepSeekR1","Qdrant","RAG"],"articleSection":["Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fivemor.com\/?p=147328#respond"]}]},{"@type":"WebPage","@id":"https:\/\/fivemor.com\/?p=147328","url":"https:\/\/fivemor.com\/?p=147328","name":"Build an Audio RAG with AssemblyAI, Qdrant & DeepSeek-R1 - Som2ny Network","isPartOf":{"@id":"https:\/\/fivemor.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/fivemor.com\/?p=147328#primaryimage"},"image":{"@id":"https:\/\/fivemor.com\/?p=147328#primaryimage"},"thumbnailUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp","datePublished":"2025-03-21T08:26:22+00:00","breadcrumb":{"@id":"https:\/\/fivemor.com\/?p=147328#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fivemor.com\/?p=147328"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/?p=147328#primaryimage","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2025\/03\/RAG-Meets-Audio-Chat-with-Your-Recordings-via-AssemblyAI-and-DeepSeek-R1.webp.webp","width":872,"height":473},{"@type":"BreadcrumbList","@id":"https:\/\/fivemor.com\/?p=147328#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fivemor.com\/?bp_activities=1"},{"@type":"ListItem","position":2,"name":"Build an Audio RAG with AssemblyAI, Qdrant &#038; DeepSeek-R1"}]},{"@type":"WebSite","@id":"https:\/\/fivemor.com\/#website","url":"https:\/\/fivemor.com\/","name":"Som2ny Network","description":"Daily Deals","publisher":{"@id":"https:\/\/fivemor.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fivemor.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/fivemor.com\/#organization","name":"Som2ny Network","url":"https:\/\/fivemor.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/","url":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","contentUrl":"https:\/\/fivemor.com\/wp-content\/uploads\/2026\/07\/4a0953c4-logo-300x86-1.png","width":300,"height":86,"caption":"Som2ny Network"},"image":{"@id":"https:\/\/fivemor.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/fivemor.com\/#\/schema\/person\/b85e3c3dc0e1daea076524dc8810c371","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/fivemor.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/729ae85bf62b9917e93538db2f2688ca?s=96&r=g&default=https%3A%2F%2Ffivemor.com%2Fwp-content%2Fplugins%2Fbuddypress-first-letter-avatar%2Fimages%2Fdefault%2F96%2Flatin_a.png","caption":"admin"},"sameAs":["https:\/\/fivemor.com"],"url":"https:\/\/fivemor.com\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/147328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=147328"}],"version-history":[{"count":0,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/posts\/147328\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=\/wp\/v2\/media\/147329"}],"wp:attachment":[{"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=147328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=147328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=147328"},{"taxonomy":"dealstore","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fdealstore&post=147328"},{"taxonomy":"offerexpiration","embeddable":true,"href":"https:\/\/fivemor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fofferexpiration&post=147328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}