音频也能“对话”?用 AssemblyAI、Qdrant 和 DeepSeek-R1 构建音频 RAG 聊天机器人 原创 精华

发布于 2025-3-28 09:32
浏览
0收藏

在信息爆炸的时代,音频内容也如潮水般涌来。无论是会议记录、播客还是采访,我们常常需要从海量音频中提取关键信息。但手动筛选音频不仅耗时费力,还容易错过重要细节。今天,就让我们一起探索如何用 AssemblyAI、Qdrant 和 DeepSeek-R1 构建一个强大的 AI 驱动的聊天机器人,将音频转化为可交互的对话内容,让音频检索变得轻松又高效!

一、初识利器:AssemblyAI、SambaNova Cloud、Qdrant 和 DeepSeek-R1

(一)AssemblyAI:精准转录的“专家”

音频也能“对话”?用 AssemblyAI、Qdrant 和 DeepSeek-R1 构建音频 RAG 聊天机器人-AI.x社区

AssemblyAI 是音频转录领域的佼佼者。它就像一位精通多国语言的速记员,无论是带有口音的演讲,还是嘈杂背景下的对话,都能准确无误地将其转化为文字。无论是转录播客、分析客户电话,还是为视频添加字幕,AssemblyAI 都能轻松应对,为我们的音频处理工作打下坚实基础。

(二)SambaNova Cloud:让大模型运行“飞”起来

音频也能“对话”?用 AssemblyAI、Qdrant 和 DeepSeek-R1 构建音频 RAG 聊天机器人-AI.x社区

想象一下,如果能以 10 倍的速度运行像 DeepSeek-R1 这样庞大的开源模型,而且无需担心复杂的基础设施问题,那该有多轻松?SambaNova Cloud 正是为此而生。它不依赖传统的 GPU,而是采用 RDUs(可重构数据流单元),带来惊人的性能提升。它拥有海量的内存存储,无需频繁重新加载模型;数据流设计高效,专为高吞吐量任务优化;还能在微秒级瞬间切换模型。在 SambaNova Cloud 上,你可以轻松训练、微调模型,一切都在同一个平台上完成。

(三)Qdrant:快速检索的“搜索引擎”

音频也能“对话”?用 AssemblyAI、Qdrant 和 DeepSeek-R1 构建音频 RAG 聊天机器人-AI.x社区

Qdrant 是一款超快速的向量数据库,堪称 AI 应用的加速器。它就像是在海量数据中寻找针尖的高手,无论是构建推荐系统、图像搜索工具,还是聊天机器人,Qdrant 都能快速找到与复杂数据(如文本嵌入或视觉特征)最相似的匹配项。有了它,我们的音频转录内容可以被高效存储和检索,为后续的智能对话提供有力支持。

(四)DeepSeek-R1:自然语言理解的“大师”

音频也能“对话”?用 AssemblyAI、Qdrant 和 DeepSeek-R1 构建音频 RAG 聊天机器人-AI.x社区

DeepSeek-R1 是一款极具创新性的语言模型,它将人类般的适应性与前沿 AI 技术完美融合,在自然语言处理领域独树一帜。无论是撰写内容、翻译语言、调试代码,还是总结复杂报告,DeepSeek-R1 都能精准理解上下文、语气和意图,给出自然流畅而非机械生硬的回答。它不仅仅是一个工具,更是让我们窥见未来 AI 与人类自然交流的窗口。

二、搭建 RAG 模型:让音频“活”起来

(一)搭建前的准备

在开始搭建 RAG 模型之前,我们需要做好一些准备工作。首先,从 GitHub 上克隆项目仓库(​​https://github.com/karthikponna/chat_with_audios.git​​),然后进入项目目录。接下来,根据操作系统创建并激活虚拟环境,安装所需的依赖包,并设置好 AssemblyAI 和 SambaNova 的 API 密钥。这些步骤就像是为我们的项目搭建起稳固的“脚手架”,确保后续开发工作顺利进行。

git clone https://github.com/karthikponna/chat_with_audios.git
cd chat_with_audios

# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate  # macOS 和 Linux
# 对于 Windows:
# python -m venv venv
# .\venv\Scripts\activate

# 安装依赖
pip install -r requirements.txt

# 设置环境变量
touch .env  # macOS 和 Linux
# 对于 Windows:
# type nul > .env
echo"ASSEMBLYAI_API_KEY=your_assemblyai_api_key_string" >> .env
echo"SAMBANOVA_API_KEY=your_sambanova_api_key_string" >> .env
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

(二)Retrieval Augmented Generation(RAG):融合检索与生成

RAG 是一种将大型语言模型与外部数据相结合的技术,它能够在查询时获取相关信息,从而生成更准确、更具上下文的答复。这种技术确保了回答不仅依赖于模型的训练数据,而是基于真实可靠的数据,让聊天机器人变得更加智能和实用。

(三)代码实现:一步步构建 RAG 系统

1. 批量处理与文本嵌入

我们首先定义了一个 ​​batch_iterate​​​ 函数,它可以将文本列表分割成更小的块,方便后续处理大规模数据集。接着,创建了一个 ​​EmbedData​​ 类,它加载 Hugging Face 嵌入模型,为每一块文本生成嵌入向量,并将这些嵌入向量收集起来,为后续的存储和检索做好准备。

from typing import List
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

def batch_iterate(lst: List[str], batch_size: int) -> List[List[str]]:
    """将文本列表分割成小块"""
    for i in range(0, len(lst), batch_size):
        yield lst[i : i + batch_size]

class EmbedData:
    def __init__(self, embed_model_name: str = "BAAI/bge-large-en-v1.5", batch_size: int = 32):
        self.embed_model_name = embed_model_name
        self.embed_model = self._load_embed_model()
        self.batch_size = batch_size
        self.embeddings = []

    def _load_embed_model(self) -> HuggingFaceEmbedding:
        """加载 Hugging Face 嵌入模型"""
        embed_model = HuggingFaceEmbedding(model_name=self.embed_model_name, trust_remote_code=True, cache_folder='./hf_cache')
        return embed_model

    def generate_embedding(self, context: List[str]) -> List[List[float]]:
        """生成文本嵌入向量"""
        return self.embed_model.get_text_embedding_batch(context)

    def embed(self, contexts: List[str]) -> None:
        """为所有文本生成嵌入向量"""
        self.contexts = contexts
        for batch_context in batch_iterate(contexts, self.batch_size):
            batch_embeddings = self.generate_embedding(batch_context)
            self.embeddings.extend(batch_embeddings)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.

2. Qdrant 向量数据库设置与数据导入

​QdrantVDB_QB​​ 类负责初始化 Qdrant 向量数据库。它设置了关键参数,如集合名称、向量维度和批量大小,并连接到 Qdrant 数据库。如果指定的集合不存在,它会自动创建一个新的集合。然后,它通过批量处理的方式,将文本上下文及其对应的嵌入向量高效地上传到数据库中,并根据需要更新集合的配置。

from qdrant_client import QdrantClient, models

class QdrantVDB_QB:
    def __init__(self, collection_name: str, vector_dim: int = 768, batch_size: int = 512):
        self.collection_name = collection_name
        self.batch_size = batch_size
        self.vector_dim = vector_dim

    def define_client(self) -> None:
        """定义 Qdrant 客户端"""
        self.client = QdrantClient(url="http://localhost:6333", prefer_grpc=True)

    def create_collection(self) -> None:
        """创建 Qdrant 集合"""
        ifnot self.client.collection_exists(collection_name=self.collection_name):
            self.client.create_collection(
                collection_name=self.collection_name,
                vectors_cnotallow=models.VectorParams(
                    size=self.vector_dim,
                    distance=models.Distance.DOT,
                    on_disk=True
                ),
                optimizers_cnotallow=models.OptimizersConfigDiff(
                    default_segment_number=5,
                    indexing_threshold=0
                ),
                quantization_cnotallow=models.BinaryQuantization(
                    binary=models.BinaryQuantizationConfig(always_ram=True)
                )
            )

    def ingest_data(self, embeddata: EmbedData) -> None:
        """将嵌入数据导入 Qdrant"""
        for batch_context, batch_embeddings in zip(
            batch_iterate(embeddata.contexts, self.batch_size),
            batch_iterate(embeddata.embeddings, self.batch_size)
        ):
            self.client.upload_collection(
                collection_name=self.collection_name,
                vectors=batch_embeddings,
                payload=[{"context": context} for context in batch_context]
            )
        self.client.update_collection(
            collection_name=self.collection_name,
            optimizer_cnotallow=models.OptimizersConfigDiff(indexing_threshold=20000)
        )
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.

3. 查询嵌入检索器

​Retriever​​​ 类是连接用户查询和向量数据库的桥梁。它初始化时接收一个向量数据库客户端和一个嵌入模型。其 ​​search​​ 方法将用户查询转化为嵌入向量,然后在数据库中进行向量搜索,通过精细调整量化参数,快速检索出与查询最相关的结果。

class Retriever:
    def __init__(self, vector_db: QdrantVDB_QB, embeddata: EmbedData):
        self.vector_db = vector_db
        self.embeddata = embeddata

    def search(self, query: str) -> List[dict]:
        """根据用户查询检索相关上下文"""
        query_embedding = self.embeddata.embed_model.get_query_embedding(query)
        result = self.vector_db.client.search(
            collection_name=self.vector_db.collection_name,
            query_vector=query_embedding,
            search_params=models.SearchParams(
                quantizatinotallow=models.QuantizationSearchParams(
                    ignore=False,
                    rescore=True,
                    oversampling=2.0
                )
            ),
            timeout=1000
        )
        return result
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

4. RAG 智能查询助手

​RAG​​ 类将检索器和大型语言模型(LLM)整合在一起,用于生成具有上下文意识的回应。它从向量数据库中检索相关信息,将其格式化为结构化的提示文本,然后发送给 LLM 以获取回应。在这里,我们通过 SambaNova Cloud 的 API 访问 LLM 模型,实现高效的文本生成。

from llama_index.llms.sambanovasystems import SambaNovaCloud
from llama_index.core.base.llms.types import ChatMessage, MessageRole

class RAG:
    def __init__(self, retriever: Retriever, llm_name: str = "Meta-Llama-3.1-405B-Instruct"):
        system_msg = ChatMessage(role=MessageRole.SYSTEM, cnotallow="You are a helpful assistant that answers questions about the user's document.")
        self.messages = [system_msg]
        self.llm_name = llm_name
        self.llm = self._setup_llm()
        self.retriever = retriever
        self.qa_prompt_tmpl_str = (
            "Context information is below.\n"
            "---------------------\n"
            "{context}\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"
            "Query: {query}\n"
            "Answer: "
        )

    def _setup_llm(self) -> SambaNovaCloud:
        """设置 LLM"""
        return SambaNovaCloud(
            model=self.llm_name,
            temperature=0.7,
            context_window=100000
        )

    def generate_context(self, query: str) -> str:
        """生成上下文"""
        result = self.retriever.search(query)
        context = [dict(data) for data in result]
        combined_prompt = []
        for entry in context[:2]:
            combined_prompt.append(entry["payload"]["context"])
        return"\n\n---\n\n".join(combined_prompt)

    def query(self, query: str) -> str:
        """处理用户查询"""
        context = self.generate_context(query)
        prompt = self.qa_prompt_tmpl_str.format(cnotallow=context, query=query)
        user_msg = ChatMessage(role=MessageRole.USER, cnotallow=prompt)
        streaming_response = self.llm.stream_complete(user_msg.content)
        return streaming_response
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.

5. 音频转录

​Transcribe​​ 类负责初始化 AssemblyAI API 密钥并创建转录器。它使用配置了说话者标签的转录器处理音频文件,最终返回一个字典列表,其中每个条目都将说话者与其转录文本相对应。这让我们能够清楚地知道每个说话者在音频中说了什么内容。

import assemblyai as aai
from typing import List, Dict

class Transcribe:
    def __init__(self, api_key: str):
        """初始化转录器"""
        aai.settings.api_key = api_key
        self.transcriber = aai.Transcriber()

    def transcribe_audio(self, audio_path: str) -> List[Dict[str, str]]:
        """转录音频文件"""
        config = aai.TranscriptionConfig(speaker_labels=True, speakers_expected=2)
        transcript = self.transcriber.transcribe(audio_path, cnotallow=config)
        speaker_transcripts = []
        for utterance in transcript.utterances:
            speaker_transcripts.append({
                "speaker": f"Speaker {utterance.speaker}",
                "text": utterance.text
            })
        return speaker_transcripts
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

三、Streamlit 应用:让交互变得简单有趣

Streamlit 是一个强大的 Python 库,它可以将数据脚本转换为交互式的 Web 应用程序,非常适合基于 LLM 的解决方案。我们利用 Streamlit 构建了一个用户友好的应用程序,用户可以通过它上传音频文件,查看转录内容,并与聊天机器人进行实时互动。

当用户上传音频文件后,应用程序会使用 AssemblyAI 将音频转录为带有说话者标签的文本。然后,这些文本会被嵌入并存储在 Qdrant 向量数据库中,以便快速检索。检索器与 RAG 引擎配合,利用这些嵌入向量生成具有上下文意识的聊天回应。同时,会话状态管理聊天历史和文件缓存,确保用户体验流畅。

import os
import gc
import uuid
import tempfile
import base64
from dotenv import load_dotenv
import streamlit as st

# 加载环境变量
load_dotenv()

# 初始化会话状态
if"id"notin st.session_state:
    st.session_state.id = uuid.uuid4()
    st.session_state.file_cache = {}

# 侧边栏:上传音频文件
with st.sidebar:
    st.header("Add your audio file!")
    uploaded_file = st.file_uploader("Choose your audio file", type=["mp3", "wav", "m4a"])

    if uploaded_file:
        try:
            with tempfile.TemporaryDirectory() as temp_dir:
                file_path = os.path.join(temp_dir, uploaded_file.name)
                with open(file_path, "wb") as f:
                    f.write(uploaded_file.getvalue())
                file_key = f"{st.session_state.id}-{uploaded_file.name}"
                st.write("Transcribing with AssemblyAI and storing in vector database...")

                if file_key notin st.session_state.get('file_cache', {}):
                    # 初始化转录器
                    transcriber = Transcribe(api_key=os.getenv("ASSEMBLYAI_API_KEY"))
                    # 获取带有说话者标签的转录内容
                    transcripts = transcriber.transcribe_audio(file_path)
                    st.session_state.transcripts = transcripts

                    # 将每个说话者片段作为单独的文档进行嵌入
                    documents = [f"Speaker {t['speaker']}: {t['text']}"for t in transcripts]
                    embeddata = EmbedData(embed_model_name="BAAI/bge-large-en-v1.5", batch_size=32)
                    embeddata.embed(documents)

                    # 设置向量数据库
                    qdrant_vdb = QdrantVDB_QB(collection_name="chat_with_audios", batch_size=32, vector_dim=1024)
                    qdrant_vdb.define_client()
                    qdrant_vdb.create_collection()
                    qdrant_vdb.ingest_data(embeddata=embeddata)

                    # 设置检索器
                    retriever = Retriever(vector_db=qdrant_vdb, embeddata=embeddata)

                    # 设置 RAG 引擎
                    query_engine = RAG(retriever=retriever, llm_name="DeepSeek-R1-Distill-Llama-70B")
                    st.session_state.file_cache[file_key] = query_engine
                else:
                    query_engine = st.session_state.file_cache[file_key]

                # 提示用户文件已准备好
                st.success("Ready to Chat!")
                st.audio(uploaded_file)

                # 显示带有说话者标签的转录内容
                st.subheader("Transcript")
                with st.expander("Show full transcript", expanded=True):
                    for t in st.session_state.transcripts:
                        st.text(f"**{t['speaker']}**: {t['text']}")
        except Exception as e:
            st.error(f"An error occurred: {e}")
            st.stop()

# 初始化聊天历史
if"messages"notin st.session_state:
    st.session_state.messages = []

# 显示聊天历史
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

# 接受用户输入
if prompt := st.chat_input("Ask about the audio conversation..."):
    # 将用户消息添加到聊天历史中
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    # 显示助手回应
    with st.chat_message("assistant"):
        message_placeholder = st.empty()
        full_response = ""
        streaming_response = query_engine.query(prompt)
        for chunk in streaming_response:
            try:
                new_text = chunk.raw["choices"][0]["delta"]["content"]
                full_response += new_text
                message_placeholder.markdown(full_response + "▌")
            except:
                pass
        message_placeholder.markdown(full_response)
    # 将助手回应添加到聊天历史中
    st.session_state.messages.append({"role": "assistant", "content": full_response})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.

四、总结与展望

通过将 AssemblyAI、SambaNova Cloud、Qdrant 和 DeepSeek-R1 结合起来,我们成功构建了一个基于音频的聊天机器人,它利用检索增强生成(RAG)技术,为用户提供了一个高效、智能的音频检索和对话体验。​​rag_code.py​​​ 文件管理着整个 RAG 工作流程,而 ​​app.py​​ 文件则提供了一个简洁的 Streamlit 界面,让整个系统易于使用和扩展。

这个项目的成功离不开各个组件的协同合作:AssemblyAI 提供了精准的音频转录,为后续的对话体验奠定了基础;Qdrant 确保了快速的向量检索,让聊天机器人能够迅速找到相关上下文;RAG 方法将检索和生成相结合,确保回答基于真实数据;SambaNova Cloud 为 LLM 提供了强大的语言理解能力,让对话更加自然流畅;Streamlit 则为我们提供了一个简单易用的用户界面,简化了音频聊天机器人的部署过程。

现在,你可以通过运行 ​​streamlit run app.py​​​ 来启动这个应用程序,上传音频文件并与聊天机器人互动。你还可以尝试使用不同的音频文件,调整代码,添加新功能,探索音频聊天解决方案的无限可能。GitHub 仓库(​​https://github.com/karthikponna/chat_with_audios/tree/main​​)中包含了完整的代码和相关资源,等待你去挖掘和创新。

音频不再是静态的信息载体,而是可以与我们互动、为我们提供帮助的智能伙伴。让我们一起期待,在未来,音频技术将如何继续改变我们的生活和工作方式!

五、常见问题解答

(一)Qdrant 是如何实现快速检索的?

Qdrant 通过高效的向量索引和优化的搜索算法,能够快速在海量数据中找到与查询向量最相似的匹配项。它支持多种距离度量方式,并且可以根据数据特点和查询需求进行灵活配置,从而实现快速准确的检索。

(二)DeepSeek-R1 与其他语言模型相比有什么优势?

DeepSeek-R1 的优势在于其出色的人类适应性和自然语言理解能力。它能够精准把握上下文、语气和意图,生成自然流畅的回答,而不是机械生硬的文本。这使得它在处理复杂的语言任务时表现出色,能够更好地满足用户的需求。

(三)Streamlit 应用程序如何管理聊天历史和文件缓存?

Streamlit 应用程序通过会话状态(session state)来管理聊天历史和文件缓存。会话状态是一个全局的存储空间,可以在应用程序的不同部分之间共享数据。当用户上传文件或发送消息时,这些数据会被存储在会话状态中,以便后续的处理和显示。同时,应用程序会根据需要对文件进行缓存,避免重复处理相同的文件,提高运行效率。

(四)如果我想扩展这个项目,可以添加哪些新功能?

你可以尝试添加语音识别功能,让用户可以通过语音与聊天机器人互动;或者增加多语言支持,让聊天机器人能够处理不同语言的音频内容;还可以优化用户界面,增加更多的交互元素,如图表、音频标注等,提升用户体验。此外,你还可以探索将这个系统与其他应用程序或服务集成,实现更广泛的应用场景。

(五)如何确保音频数据的安全性和隐私性?

在处理音频数据时,确保数据的安全性和隐私性至关重要。你可以采取以下措施:在传输和存储音频数据时使用加密技术;限制对音频数据的访问权限,只有授权用户才能上传和查看数据;在应用程序中添加数据删除功能,允许用户随时删除自己的音频数据;遵守相关的法律法规和隐私政策,确保用户数据的合法使用和保护。

六、结语

今天,我们深入探讨了如何利用 AssemblyAI、Qdrant、SambaNova Cloud 和 DeepSeek-R1 构建一个基于音频的 RAG 聊天机器人。这个项目不仅展示了各个技术组件的强大功能,还体现了它们协同合作的巨大潜力。通过这个项目,我们看到了音频技术在智能交互领域的广阔前景,也感受到了技术创新为我们的生活和工作带来的便利。

在未来,随着技术的不断发展和创新,音频聊天机器人将变得更加智能、高效和人性化。它将不仅仅是一个工具,更将成为我们生活中的得力助手,帮助我们更好地处理音频信息,提高工作效率,丰富我们的生活体验。让我们一起期待这个充满无限可能的未来吧!


本文转载自公众号Halo咯咯    作者:基咯咯

原文链接:​​https://mp.weixin.qq.com/s/wpjFP6SKwq8aaTowFjat7w​

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐
这个用户很懒,还没有个人简介
帖子
声望
粉丝
社区精华内容