摘要
本文详细拆解了飞书平台语音交互系统的本地化实现方案。通过集成faster-whisper(语音识别)和edge-tts(语音合成),在零 API 调用成本的前提下,实现了完整的语音输入→AI 处理→语音输出闭环。相比远程 API 方案,本实现节省约 95% 的运营成本,同时保证数据完全本地化处理。一、系统架构

整体流程:
1.用户在飞书发送语音消息
2.系统自动下载语音文件到本地
3.faster-whisper识别语音为文字
4.AI处理文字并生成回复
5.edge-tts将回复文字合成为语音
6.ffmpeg转换为飞书要求的OPUS格式
7.通过飞书API发送语音回复
性能指标:
- 语音识别:~8-10 秒(tiny 模型)
- 语音生成:~3-5 秒
- 总响应时间:~15 秒
二、核心依赖与环境
2.1 Python虚拟环境
建议在技能目录下创建独立虚拟环境,避免污染系统Python:
bash
# 创建虚拟环境
cd ~/.openclaw/workspace/skills/ll-feishu-audio
python3 -m venv .venv
source .venv/bin/activate
# 使用uv加速安装(推荐)
uv pip install faster-whisper==1.2.1
uv pip install edge-tts==7.2.7
uv pip install ffmpeg-python==0.2.02.2 依赖包说明
| 包名 | 版本 | 用途 | 大小 |
|---|---|---|---|
| faster-whisper | 1.2.1 | 语音识别(STT) | ~200MB |
| edge-tts | 7.2.7 | 语音合成(TTS) | ~5MB |
| ffmpeg-python | 0.2.0 | 音频格式转换 | ~1MB |
2.3 模型文件
- faster-whisper tiny模型(约150MB)
- 模型目录:
/volume1/opt/fast-whisper-models/ - 模型文件:
tiny/
三、核心代码实现
3.1 语音识别模块 (stt.py)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
语音识别模块 - 使用faster-whisper将语音转换为文字
"""
import sys
import os
from faster_whisper import WhisperModel
# 模型路径配置
MODEL_PATH ="/volume1/opt/fast-whisper-models/tiny"
DEVICE ="cpu"# 或 "cuda"(如有GPU)
deftranscribe_audio(audio_path:str, language:str="zh")->str:
"""
将音频文件转录为文字
Args:
audio_path: 音频文件路径
language: 语言代码 (zh=中文,en=英文)
Returns:
识别的文字内容
"""
# 加载模型(首次加载会缓存到内存)
model = WhisperModel(
MODEL_PATH,
device=DEVICE,
compute_type="int8"# INT8量化,加速推理
)
# 执行转录
segments, info = model.transcribe(
audio_path,
language=language,
beam_size=5,
vad_filter=True,# 启用语音活动检测,跳过静音段
vad_parameters=dict(
min_silence_duration_ms=500,
speech_pad_ms=200
)
)
# 拼接所有识别片段
text =""
for segment in segments:
text += segment.text
return text.strip()
if __name__ =="__main__":
iflen(sys.argv)<2:
print("用法:python stt.py <音频文件路径>")
sys.exit(1)
audio_file = sys.argv[1]
ifnot os.path.exists(audio_file):
print(f"错误:文件不存在{audio_file}")
sys.exit(1)
result = transcribe_audio(audio_file)
print(result)3.2 语音合成模块 (tts.py)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
语音合成模块 - 使用Edge TTS将文字转换为语音
"""
import asyncio
import edge_tts
import os
# 音色配置
VOICE_FEMALE ="zh-CN-XiaoxiaoNeural"# 温柔女声
VOICE_MALE ="zh-CN-YunxiNeural"# 沉稳男声
DEFAULT_VOICE = VOICE_FEMALE
# 输出参数
OUTPUT_RATE ="48000"# 48kHz(飞书要求)
OUTPUT_FORMAT ="mp3"
asyncdefsynthesize_speech(
text:str,
output_path:str,
voice:str= DEFAULT_VOICE,
rate:str="+0%",
volume:str="+0%"
)->str:
"""
将文字合成为语音文件
Args:
text: 要合成的文字
output_path: 输出文件路径
voice: 音色名称
rate: 语速调整 (+50%=快,-50%=慢)
volume: 音量调整
Returns:
输出文件路径
"""
communicate = edge_tts.Communicate(
text,
voice,
rate=rate,
volume=volume
)
await communicate.save(output_path)
return output_path
asyncdefmain():
"""测试入口"""
text ="你好,我是你的AI语音助手小美。"
output =await synthesize_speech(text,"test_output.mp3")
print(f"语音已生成:{output}")
if __name__ =="__main__":
asyncio.run(main())3.3 音频格式转换模块 (convert.py)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
音频格式转换模块 - 使用ffmpeg转换为飞书要求的OPUS格式
"""
import ffmpeg
import os
import subprocess
defconvert_to_opus(input_path:str, output_path:str)->bool:
"""
将音频转换为OPUS格式(飞书要求)
Args:
input_path: 输入文件路径(MP3/PCM)
output_path: 输出文件路径(.opus)
Returns:
转换是否成功
"""
try:
# 使用ffmpeg转换为OPUS
# 参数:48kHz采样率,单声道,OPUS编码
(
ffmpeg.input(input_path)
.output(
output_path,
acodec='libopus',
ar=48000,
ac=1,
b='64k',
loglevel='error'
)
.overwrite_output()
.run()
)
returnTrue
except ffmpeg.Error as e:
print(f"FFmpeg错误:{e.stderr.decode()}")
returnFalse
defconvert_with_cli(input_path:str, output_path:str)->bool:
"""使用ffmpeg命令行转换(备选方案)"""
cmd =[
"ffmpeg",
"-i", input_path,
"-acodec","libopus",
"-ar","48000",
"-ac","1",
"-b:a","64k",
"-y",# 覆盖输出
output_path
]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.returncode ==0
if __name__ =="__main__":
import sys
iflen(sys.argv)!=3:
print("用法:python convert.py <输入文件> <输出文件>")
sys.exit(1)
success = convert_to_opus(sys.argv[1], sys.argv[2])
print("转换成功"if success else"转换失败")3.4 主流程整合 (main.py)
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
飞书语音交互主流程
"""
import os
import sys
import asyncio
import tempfile
from pathlib import Path
# 导入自定义模块
from stt import transcribe_audio
from tts import synthesize_speech
from convert import convert_to_opus
# 配置
TEMP_DIR = tempfile.gettempdir()
MODEL_PATH ="/volume1/opt/fast-whisper-models/tiny"
classFeishuVoiceAssistant:
"""飞书语音助手主类"""
def__init__(self):
self.stt_model =None
asyncdefprocess_voice_message(self, input_audio:str, user_text:str=None)->str:
"""
处理用户语音消息的完整流程
Args:
input_audio: 输入音频文件路径
user_text: 用户文字(如果已识别则传入)
Returns:
输出语音文件路径
"""
# Step 1: 语音识别(如果未提供文字)
ifnot user_text:
print("🎤 正在识别语音...")
user_text = transcribe_audio(input_audio)
print(f"📝 识别结果:{user_text}")
# Step 2: AI处理(此处调用AI生成回复)
# 实际使用时替换为真实的AI调用
ai_response = self._call_ai(user_text)
print(f"🤖 AI回复:{ai_response}")
# Step 3: 语音合成
print("🔊 正在合成语音...")
temp_mp3 = os.path.join(TEMP_DIR,f"tts_{os.getpid()}.mp3")
await synthesize_speech(ai_response, temp_mp3)
# Step 4: 格式转换(MP3 → OPUS)
print("🔄 正在转换格式...")
output_opus = os.path.join(TEMP_DIR,f"reply_{os.getpid()}.opus")
convert_to_opus(temp_mp3, output_opus)
# 清理临时文件
os.remove(temp_mp3)
print("✅ 完成!")
return output_opus
def_call_ai(self, text:str)->str:
"""调用AI生成回复
实际使用时替换为真实的AI调用逻辑"""
# 示例:简单回复
returnf"我收到了你的消息:{text}"
asyncdefmain():
"""测试入口"""
iflen(sys.argv)<2:
print("用法:python main.py <音频文件>")
sys.exit(1)
assistant = FeishuVoiceAssistant()
output =await assistant.process_voice_message(sys.argv[1])
print(f"输出文件:{output}")
if __name__ =="__main__":
asyncio.run(main())3.5 飞书发送脚本 (feishu-tts.sh)
bash
#!/bin/bash
# 飞书语音发送脚本
# 用法:./feishu-tts.sh <音频文件> [用户ID]
set -e
AUDIO_FILE="$1"
USER_ID="${2:-$FEISHU_USER_ID}"
if[ -z "$AUDIO_FILE"];then
echo"用法:$0 <音频文件> [用户ID]"
exit1
fi
if[! -f "$AUDIO_FILE"];then
echo"错误:文件不存在 $AUDIO_FILE"
exit1
fi
# 获取飞书访问令牌(从环境变量或配置文件)
ACCESS_TOKEN="${FEISHU_ACCESS_TOKEN}"
if[ -z "$ACCESS_TOKEN"];then
echo"错误:请设置FEISHU_ACCESS_TOKEN环境变量"
exit1
fi
# 上传音频文件到飞书
echo"📤 正在上传音频..."
UPLOAD_RESPONSE=$(curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/messages"\
-H "Authorization: Bearer $ACCESS_TOKEN"\
-H "Content-Type: multipart/form-data"\
-F "type=audio"\
-F "file=@$AUDIO_FILE")
# 解析上传结果
FILE_KEY=$(echo"$UPLOAD_RESPONSE"| jq -r '.data.file_key')
if[ -z "$FILE_KEY"]||["$FILE_KEY"=="null"];then
echo"错误:上传失败 $UPLOAD_RESPONSE"
exit1
fi
echo"✅ 上传成功,file_key: $FILE_KEY"
# 发送语音消息
echo"📮 正在发送消息..."
SEND_RESPONSE=$(curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/messages"\
-H "Authorization: Bearer $ACCESS_TOKEN"\
-H "Content-Type: application/json"\
-d "{
\"receive_id\": \"$USER_ID\",
\"msg_type\": \"audio\",
\"content\": {
\"file_key\": \"$FILE_KEY\"
}
}")
echo"📬 发送结果:$SEND_RESPONSE"四、技术实现要点
1. 本地化处理优势
- 数据安全 :所有语音数据在本地处理,不经过任何第三方API
- 成本优势 :相比云API方案,节省约95%的运营成本
- 低延迟 :本地处理避免了网络传输带来的延迟
2. 性能优化技术
- 模型量化 :使用INT8量化加速faster-whisper推理
- 异步处理 :采用asyncio实现非阻塞IO操作
- 临时文件管理 :使用系统临时目录自动清理中间文件
3. 扩展性设计
- 模块化架构 :各功能模块独立,便于替换或升级
- 配置分离 :模型路径、语音参数等可配置化
- 错误处理 :完善的错误捕获和日志记录机制
五、部署建议
- 硬件要求:
- 推荐使用NVIDIA GPU加速语音识别
- 最低配置:4核CPU + 8GB内存
- tiny模型:速度快,适合实时交互
- base/small模型:精度更高,适合对准确性要求高的场景
- 添加日志记录模块
- 实现健康检查接口
- 设置资源使用监控
本方案提供了完整的飞书语音交互本地化实现,可根据实际需求进行定制和扩展,特别适合对数据隐私和成本控制有较高要求的企业级应用场景。
四、成本对比分析
4.1 远程 API 方案成本
| 服务商 | 语音识别 | 语音合成 | 月成本(1000 次/月) |
|---|---|---|---|
| 阿里云 | ¥0.02/分钟 | ¥0.03/分钟 | ~¥150 |
| 腾讯云 | ¥0.018/分钟 | ¥0.025/分钟 | ~¥130 |
| 百度 AI | ¥0.015/分钟 | ¥0.02/分钟 | ~¥105 |
| Azure | $0.01/分钟 | $0.016/分钟 | ~¥180 |
| 平均 | - | - | ~¥140/月 |
年度成本:约 ¥1,680
4.2 本地化或云化方案方案成本
| 项目 | 成本 | 说明 |
|---|---|---|
| 硬件成本 | ¥0 | 复用现有服务器 |
| 电费 | ~¥50/年 | 低功耗运行 |
| 维护成本 | ¥0 | 开源免费 |
| 年度总成本 | ~¥50 | 云化方案为你使用的云服务器成本 |
4.3 节省对比
远程 API 方案:¥1,680/年 本地化方案: ¥50/年 节省金额: ¥1,630/年节省比例: 97% 结论:本地化方案节省约 97% 的运营成本,且数据完全本地处理,无隐私泄露风险。五、部署步骤
5.1 环境准备
1. 安装系统依赖sudoapt-get updatesudoapt-get install -y ffmpeg python3-venv
# 2. 安装 uv(Python 包管理加速工具)curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. 下载 faster-whisper 模型mkdir-p /volume1/opt/fast-whisper-modelscd/volume1/opt/fast-whisper-modelsgit lfs installgitclonehttps://huggingface.co/guillaumekln/faster-whisper-tiny tiny
5.2 技能安装
克隆技能到本地cd~/.openclaw/workspace/skillsgitclonehttps://clawhub.ai/43622283/li-feishu-audio.git ll-feishu-audio
# 创建虚拟环境并安装依赖cdll-feishu-audiopython3 -m venv .venvsource.venv/bin/activateuv pip install -r requirements.txt
5.3 配置飞书凭证
编辑环境配置文件vim .env
# 添加以下内容:FEISHU_APP_ID=xxxFEISHU_APP_SECRET=xxxFEISHU_ACCESS_TOKEN=xxxFEISHU_USER_ID=ou_xxx
5.4 测试运行
测试语音识别python stt.py test_audio.wav
# 测试语音合成python tts.py
# 测试完整流程python main.py test_audio.wav
六、优化建议
6.1 性能优化
模型量化:使用 INT8 量化可提升 2-3 倍推理速度 GPU 加速:如有 NVIDIA GPU,使用 CUDA 可提升 5-10 倍 模型缓存:首次加载后常驻内存,避免重复加载 并发处理:使用异步 IO 处理多个请求6.2 质量优化
模型升级:tiny → base → small,准确率逐步提升 VAD 调优:根据环境噪音调整语音活动检测参数 音色选择:根据场景选择合适的 TTS 音色 后处理:添加标点、数字规范化等文本后处理6.3 成本优化
按需加载:空闲时卸载模型,释放内存 定时任务:非工作时间暂停服务 模型蒸馏:训练专用小模型,进一步压缩体积七、常见问题
Q1: 语音识别准确率不高?
A:尝试以下方法:- 升级到 larger 模型(base/small)
- 调整 VAD 参数,减少噪音干扰
- 确保音频采样率为 16kHz 或以上
Q2: 语音合成听起来不自然?
A:
- 尝试不同音色(Xiaoxiao/Yunxi/Yunjian 等)
- 调整语速和音量参数
- 在文本中添加停顿标记
Q3: 飞书发送失败?
A:
- 检查 access_token 是否过期
- 确认音频格式为 OPUS,48kHz
- 检查机器人权限配置
八、总结
本文详细介绍了飞书语音交互系统的本地化实现方案,核心优势: ✅零 API 成本- 完全本地运行,无调用费用 ✅数据隐私- 语音数据不出本地,安全可控 ✅快速响应- 15 秒内完成全流程 ✅易于扩展- 模块化设计,便于定制 通过本方案,企业可以以极低的成本搭建自己的 AI 语音助手系统,适合客服、办公助理、智能家居等多种场景。 项目地址:https://clawhub.ai/43622283/li-feishu-audio[2] 作者:北京老李 许可:MIT License引用链接
[1]Li Feishu Audio — ClawHub:https://clawhub.ai/43622283/li-feishu-audio [2]https://clawhub.ai/43622283/li-feishu-audio