Li Feishu Audio -零成本打造飞书语音助手

作者:北京老李 日期:2026 年 3 月 19 日 版本:0.1.1

摘要

本文详细拆解了飞书平台语音交互系统的本地化实现方案。通过集成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.0

    2.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. 扩展性设计

    • 模块化架构 :各功能模块独立,便于替换或升级
    • 配置分离 :模型路径、语音参数等可配置化
    • 错误处理 :完善的错误捕获和日志记录机制

    五、部署建议

    1. 硬件要求:
    • 推荐使用NVIDIA GPU加速语音识别
    • 最低配置:4核CPU + 8GB内存
  1. 模型选择:
    • tiny模型:速度快,适合实时交互
    • base/small模型:精度更高,适合对准确性要求高的场景
  2. 运维监控:
    • 添加日志记录模块
    • 实现健康检查接口
    • 设置资源使用监控

    本方案提供了完整的飞书语音交互本地化实现,可根据实际需求进行定制和扩展,特别适合对数据隐私和成本控制有较高要求的企业级应用场景。

    四、成本对比分析

    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
    ©著作权归作者所有,转载或内容合作请联系作者
    【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
    平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

    相关阅读更多精彩内容

    友情链接更多精彩内容