OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  bolna — 面向实时语音对话场景的开源语音 Agent 框架

bolna — 面向实时语音对话场景的开源语音 Agent 框架

 
  domain ·  2026-09-29 11:00:25 · 20 次点击  · 0 条评论  

端到端开源语音智能体平台:通过一个 JSON 配置,快速构建以语音为先的对话助手。

Discord | 托管文档 | 官方网站

Discord Bolna is released under the MIT license. PRs welcome!

[!NOTE]
我们正在积极寻找维护者。

简介

Bolna 是一个端到端、开源、可投入生产环境的框架,用于快速构建基于 LLM 的语音驱动对话应用。

演示

https://github.com/bolna-ai/bolna/assets/1313096/2237f64f-1c5b-4723-b7e7-d11466e9b226

这个仓库是什么?

本仓库包含构建语音 AI 应用所需的完整编排平台。它在技术层面上通过 WebSocket,将不同的 ASR + LLM + TTS 供应商与模型组合起来,从而编排语音对话。

组件

Bolna 帮助你创建可以被指示执行任务的 AI 语音智能体,起点包括:

  1. 编排平台(即本开源仓库)
  2. 基于该编排平台构建的托管 API(https://docs.bolna.ai/api-reference/introduction)【当前为闭源】
  3. 位于 https://platform.bolna.ai/ 的无代码 UI 演练场,使用托管 API + Tailwind CSS 构建【当前为闭源】

开发理念

  1. 任何集成、增强或功能最初都会先落入这个开源包,因为它构成了我们托管 API 和仪表盘的基础
  2. 随后,我们会按需暴露 API 或对现有 API 进行相应修改
  3. 第三步,我们将其推送到 UI 仪表盘
graph LR;
    A[Bolna 开源版] -->B[托管 API];
    B[托管 API] --> C[托管演练场]

支持的供应商与模型

  1. 使用 Twilio、Plivo、Exotel(即将推出)、Vonage(即将推出)等电话供应商发起电话呼叫
  2. 使用 Deepgram、Azure 等对对话进行转录
  3. 使用 OpenAI、DeepSeek、Llama、Cohere、Mistral 等 LLM 处理对话
  4. 使用 AWS Polly、ElevenLabs、Deepgram、OpenAI、Azure、Cartesia、Smallest、Maya、Kalpa 等将 LLM 响应合成回电话系统

关于所有受支持供应商的深入介绍,请参阅文档。

本地示例设置【将迁移到另一个仓库】

基础本地设置包括使用 Twilio 或 Plivo 作为电话服务。我们已在 local_setup/ 中将该设置 Docker 化。你需要根据 .env.sample 填充环境变量 .env 文件。

该设置包含四个容器:

  1. 电话 Web 服务器:
    * 选择 Twilio:为了发起呼叫,你需要设置一个 Twilio 账户
    * 选择 Plivo:为了发起呼叫,你需要设置一个 Plivo 账户
  2. Bolna 服务器:用于创建和处理智能体
  3. ngrok:用于隧道转发。你需要将 authtoken 添加到 ngrok-config.yml
  4. redis:用于持久化智能体与提示词数据

快速开始

最简单的入门方式是使用提供的脚本:

cd local_setup
chmod +x start.sh
./start.sh

该脚本会检查 Docker 依赖,启用 BuildKit 构建所有服务,并以分离模式启动它们。

手动设置

或者,你也可以手动构建并运行服务:

  1. 确保已安装 Docker 与 Docker Compose V2
  2. 启用 BuildKit 以加快构建:
    bash export DOCKER_BUILDKIT=1 export COMPOSE_DOCKER_CLI_BUILD=1
  3. 构建镜像:
    bash docker compose build
  4. 运行服务:
    bash docker compose up -d

若要仅运行特定服务:

docker compose up -d bolna-app twilio-app
# 或
docker compose up -d bolna-app plivo-app

Docker 容器启动后,你就可以开始创建智能体并指示它们发起呼叫。

用于创建、使用并开始拨打电话的示例智能体

你可以从 example.bolna.dev 尝试不同的智能体。

编程式用法(最小示例)

你也可以直接使用 Python 构建并运行智能体,而无需本地电话设置。

示例脚本:examples/simple_assistant.py

import asyncio
from bolna.assistant import Assistant
from bolna.models import (
    Transcriber,
    Synthesizer,
    ElevenLabsConfig,
    LlmAgent,
    SimpleLlmAgent,
)


async def main():
    assistant = Assistant(name="demo_agent")

    # 配置音频输入(ASR)
    transcriber = Transcriber(provider="deepgram", model="nova-2", stream=True, language="en")

    # 配置 LLM
    llm_agent = LlmAgent(
        agent_type="simple_llm_agent",
        agent_flow_type="streaming",
        llm_config=SimpleLlmAgent(
            provider="openai",
            model="gpt-4o-mini",
            temperature=0.3,
        ),
    )

    # 配置音频输出(TTS)
    synthesizer = Synthesizer(
        provider="elevenlabs",
        provider_config=ElevenLabsConfig(voice="George", voice_id="JBFqnCBsd6RMkjVDRZzb", model="eleven_turbo_v2_5"),
        stream=True,
        audio_format="wav",
    )

    # 构建一条连贯的流水线:transcriber -> llm -> synthesizer
    assistant.add_task(
        task_type="conversation",
        llm_agent=llm_agent,
        transcriber=transcriber,
        synthesizer=synthesizer,
        enable_textual_input=False,
    )

    # 流式输出结果
    async for chunk in assistant.execute():
        print(chunk)


if __name__ == "__main__":
    asyncio.run(main())

如何运行:

export OPENAI_API_KEY=...
export DEEPGRAM_AUTH_TOKEN=...
export ELEVENLABS_API_KEY=...
python examples/simple_assistant.py

该示例演示了编排与流式输出。若要使用电话功能,请使用 local_setup/ 中的服务。

注意:关于基于 REST 的用法(通过 HTTP 进行智能体 CRUD),请参阅仓库根目录下的 API.md。

预期输出形态:assistant.execute() 是一个异步生成器,会按任务产出结果字典(类似事件的块)。具体键取决于所配置的工具与供应商;请将其视为流并增量处理。

纯文本流水线示例

如果你想要纯文本流程(不使用 transcriber/synthesizer),可以启用纯文本流水线:

示例脚本:examples/text_only_assistant.py

import asyncio
from bolna.assistant import Assistant
from bolna.models import LlmAgent, SimpleLlmAgent


async def main():
    assistant = Assistant(name="text_only_agent")

    llm_agent = LlmAgent(
        agent_type="simple_llm_agent",
        agent_flow_type="streaming",
        llm_config=SimpleLlmAgent(
            provider="openai",
            model="gpt-4o-mini",
            temperature=0.2,
        ),
    )

    # 不使用 transcriber/synthesizer;启用纯文本流水线
    assistant.add_task(
        task_type="conversation",
        llm_agent=llm_agent,
        enable_textual_input=True,
    )

    async for chunk in assistant.execute():
        print(chunk)


if __name__ == "__main__":
    asyncio.run(main())

如何运行(纯文本):

export OPENAI_API_KEY=...
python examples/text_only_assistant.py

预期输出形态:assistant.execute() 会按任务步骤产出流式字典;字段会随配置不同而变化。请逐块处理。

使用你自己的供应商

你可以填充 .env 文件,以使用自己的供应商密钥。

ASR 供应商
当前支持的 ASR 供应商如下: | Provider | 需要添加到 `.env` 文件中的环境变量 | |--------------|-----------------------------------------------| | Deepgram | `DEEPGRAM_AUTH_TOKEN` |

 

LLM 供应商
Bolna 使用 LiteLLM 包来支持多种 LLM 集成。 当前支持的 LLM 供应商系列如下: https://github.com/bolna-ai/bolna/blob/10fa26e5985d342eedb5a8985642f12f1cf92a4b/bolna/providers.py#L30-L47 对于基于 LiteLLM 的 LLM,请根据你的用例将以下任一项添加到 `.env` 文件:

`LITELLM_MODEL_API_KEY`:LLM 的 API Key
`LITELLM_MODEL_API_BASE`:托管 LLM 的 URL
`LITELLM_MODEL_API_VERSION`:适用于 Azure 等 LLM 的 API 版本 对于通过 VLLM 托管的 LLM,请将以下内容添加到 `.env` 文件:
`VLLM_SERVER_BASE_URL`:使用 VLLM 托管的 LLM 的 URL

 

TTS 供应商
当前支持的 TTS 供应商如下: https://github.com/bolna-ai/bolna/blob/c8a0d1428793d4df29133119e354bc2f85a7ca76/bolna/providers.py#L7-L14 | Provider | 需要添加到 `.env` 文件中的环境变量 | |------------|-------------------------------------------------| | AWS Polly | 通过 ~/.aws 中的系统级凭据访问 | | Elevenlabs | `ELEVENLABS_API_KEY` | | OpenAI | `OPENAI_API_KEY` | | Deepgram | `DEEPGRAM_AUTH_TOKEN` | | Cartesia | `CARTESIA_API_KEY` | | Smallest | `SMALLEST_API_KEY` | | Maya | `MAYA_API_KEY` | | Kalpa | `KALPA_API_KEY` |

 

电话供应商
当前支持的电话供应商如下: | Provider | 需要添加到 `.env` 文件中的环境变量 | |----------|----------------------------------------------------------------------------------------------------------------------------------------------------| | Twilio | `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`, `TWILIO_PHONE_NUMBER`| | Plivo | `PLIVO_AUTH_ID`, `PLIVO_AUTH_TOKEN`, `PLIVO_PHONE_NUMBER`|

开源版 vs 托管 API

过去,我们曾尝试同时维护开源方案与托管方案(通过 API 和 UI 仪表盘)。

由于时间紧张而非缺乏兴趣,我们在这两者之间反复摇摆。

目前,我们继续为社区维护该项目,并推动 Voice AI 的采用。

虽然该仓库完全开源,但如果你对托管服务或更多定制化解决方案感兴趣,也欢迎与我们联系。
Schedule a meeting

扩展其他电话供应商

如果你希望扩展并添加其他电话服务(如 Vonage、Telnyx 等),请遵循以下指南:
1. 确保该电话供应商支持双向流式传输
2. 在 input_handlers/telephony_providers 中添加电话专属输入处理器文件,编写继承自 telephony.py 类的自定义函数
1. 该文件主要包含如何从电话供应商处接收不同类型的事件包
3. 在 output_handlers/telephony_providers 中添加电话专属输出处理器文件,编写继承自 telephony.py 类的自定义函数
1. 这主要涉及将合成器类中的音频转换为支持的音频格式,并通过电话供应商提供的 WebSocket 进行流式传输
4. 最后,你需要编写一个专用服务器,类似 local_setup 中提供的示例 twilio_api_server.py,以通过 WebSocket 发起呼叫。

安全致谢

我们要感谢以下个人负责任地披露安全漏洞,并帮助我们保持此项目的安全:

贡献

我们欢迎各种形式的贡献:无论大小,都有助于改进这一社区资源。

  1. 当前有大量待解决 issue,非常适合作为起点
  2. 如果你有增强建议、希望贡献一个简单修复(例如修正拼写错误),或想处理一个明显的 bug,请随时新建 issue 或提交 pull request
  3. 如果你正在考虑对本仓库进行较大改动或新增内容,无论是结构还是功能,请先创建一个新 issue open a new issue :octocat:,并概述你的拟议改动。这样我们可以在你投入大量时间或精力之前展开讨论。感谢你的配合与理解。
20 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私 ·  条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 18 ms
Developed with Cursor