端到端开源语音智能体平台:通过一个 JSON 配置,快速构建以语音为先的对话助手。
[!NOTE]
我们正在积极寻找维护者。
Bolna 是一个端到端、开源、可投入生产环境的框架,用于快速构建基于 LLM 的语音驱动对话应用。
https://github.com/bolna-ai/bolna/assets/1313096/2237f64f-1c5b-4723-b7e7-d11466e9b226
本仓库包含构建语音 AI 应用所需的完整编排平台。它在技术层面上通过 WebSocket,将不同的 ASR + LLM + TTS 供应商与模型组合起来,从而编排语音对话。
Bolna 帮助你创建可以被指示执行任务的 AI 语音智能体,起点包括:
graph LR;
A[Bolna 开源版] -->B[托管 API];
B[托管 API] --> C[托管演练场]
Twilio、Plivo、Exotel(即将推出)、Vonage(即将推出)等电话供应商发起电话呼叫Deepgram、Azure 等对对话进行转录OpenAI、DeepSeek、Llama、Cohere、Mistral 等 LLM 处理对话AWS Polly、ElevenLabs、Deepgram、OpenAI、Azure、Cartesia、Smallest、Maya、Kalpa 等将 LLM 响应合成回电话系统关于所有受支持供应商的深入介绍,请参阅文档。
基础本地设置包括使用 Twilio 或 Plivo 作为电话服务。我们已在 local_setup/ 中将该设置 Docker 化。你需要根据 .env.sample 填充环境变量 .env 文件。
该设置包含四个容器:
ngrok:用于隧道转发。你需要将 authtoken 添加到 ngrok-config.ymlredis:用于持久化智能体与提示词数据最简单的入门方式是使用提供的脚本:
cd local_setup
chmod +x start.sh
./start.sh
该脚本会检查 Docker 依赖,启用 BuildKit 构建所有服务,并以分离模式启动它们。
或者,你也可以手动构建并运行服务:
bash
export DOCKER_BUILDKIT=1
export COMPOSE_DOCKER_CLI_BUILD=1bash
docker compose buildbash
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 文件,以使用自己的供应商密钥。
过去,我们曾尝试同时维护开源方案与托管方案(通过 API 和 UI 仪表盘)。
由于时间紧张而非缺乏兴趣,我们在这两者之间反复摇摆。
目前,我们继续为社区维护该项目,并推动 Voice AI 的采用。
虽然该仓库完全开源,但如果你对托管服务或更多定制化解决方案感兴趣,也欢迎与我们联系。

如果你希望扩展并添加其他电话服务(如 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 发起呼叫。
我们要感谢以下个人负责任地披露安全漏洞,并帮助我们保持此项目的安全:
我们欢迎各种形式的贡献:无论大小,都有助于改进这一社区资源。