【Kiro 开发集训营】Vibe Coding 构建会议助理

使用 Kiro 构建智能会议助手:从想法到实现的完整实践

在日常工作中,会议记录一直是个耗时且容易遗漏重点的任务。本次使用 Kiro IDE 构建智能会议助手的完整经历,从需求分析到代码实现,整个过程高效且充满惊喜。
在这里插入图片描述
在这里插入图片描述

一、Kiro IDE 使用体验

Kiro 是一款 AI 驱动的开发工具,但它给我的感觉更像是一位经验丰富的技术伙伴。与传统 IDE 不同,Kiro 不仅能理解你的代码,还能理解你的意图。

支持的大模型

Kiro 支持多种主流大语言模型,让开发者可以根据需求灵活选择:

主流模型支持

  • Claude 系列(Anthropic):Claude 3.5 Sonnet、Claude 3 Opus - 擅长代码理解和复杂推理
  • GPT 系列(OpenAI):GPT-4、GPT-4 Turbo、GPT-3.5 - 通用能力强,响应速度快
  • Gemini 系列(Google):Gemini Pro、Gemini Ultra - 多模态能力出色
  • 开源模型:支持通过 Ollama 运行本地模型,如 Llama、Mistral 等

模型切换

  • 可在设置中随时切换模型
  • 支持为不同任务配置不同模型
  • 支持自定义 API 端点

核心功能体验

1. 自然语言交互

我只需要用自然语言描述需求:“构建一个会议助理,先使用 qwen3-asr-flash 做语音识别,然后使用 qwen3-max 做会议记录总结。界面为 Web 界面,界面要求简洁,支持上传本地音频文件。”

Kiro 立即理解了我的需求,并开始构建完整的应用框架。

2. 智能代码生成

Kiro 不是简单地生成代码模板,而是:

  • 自动选择合适的技术栈(Gradio + DashScope)
  • 设计合理的函数结构
  • 添加完善的错误处理
  • 生成配套的文档和依赖文件

3. 迭代优化能力

当我提出"添加能增加用户体验的功能,界面要求布局合理、高级、去 AI 化"时,Kiro 不仅添加了多语言支持、关键词提取、记录导出等功能,还重新设计了整个界面布局,使用自定义 CSS 打造专业商务风格。

4. 上下文理解

Kiro 能够记住之前的对话内容,理解项目的整体架构。在优化过程中,它知道要在现有代码基础上改进,而不是重新开始。

Kiro 的特色功能

1. Spec 规范化开发

Spec 功能是 Kiro 的独特之处,它提供了一种结构化的开发方式:

  • 需求文档(requirements.md):明确功能需求和验收标准
  • 设计文档(design.md):定义技术方案和实现细节
  • 任务分解(tasks.md):将大功能拆解为可执行的小任务
  • 增量开发:支持复杂功能的迭代式开发

2. Agent Hooks 自动化

Hooks 功能让开发流程自动化:

  • 文件保存时自动运行测试
  • 代码提交前自动格式化
  • 文档更新时自动同步翻译
  • 支持自定义触发条件和执行动作

3. Steering 上下文引导

Steering 功能让 Kiro 理解项目规范:

  • 定义团队编码规范
  • 配置项目特定的最佳实践
  • 添加领域知识和业务规则
  • 支持条件性加载和手动引用

4. MCP 协议集成

支持 Model Context Protocol,可以:

  • 连接外部数据源和工具
  • 扩展 Kiro 的能力边界
  • 集成企业内部系统
  • 自定义工具链

5. 多模态能力

  • 支持图片拖拽到对话中进行分析
  • 可以理解设计稿并生成代码
  • 支持图表、架构图的解读
  • 能够处理截图中的错误信息

6. 代码诊断

  • 实时显示编译错误和警告
  • 集成 ESLint、TypeScript 等工具
  • 自动修复常见问题
  • 提供优化建议

让我印象深刻的点

  • 效率提升:原本需要几小时的开发工作,在 Kiro 的协助下 15 分钟就完成了
  • 代码质量:生成的代码结构清晰,注释完善,符合最佳实践
  • 全栈思维:不仅关注功能实现,还考虑了用户体验、文档、部署等方面
  • 学习价值:通过观察 Kiro 的实现方式,我学到了很多新的技巧
  • 可控性强:通过 Spec、Steering 等功能,可以精确控制 AI 的行为
  • 扩展性好:MCP 协议让 Kiro 可以连接任何外部系统

二、项目简介

项目背景

在企业环境中,会议记录是一项重要但繁琐的工作。传统方式需要专人记录,容易遗漏关键信息,且整理耗时。我们需要一个能够:

  • 自动将会议音频转为文字
  • 智能提取会议要点
  • 生成结构化的会议总结
  • 支持多种导出格式

技术选型

语音识别阿里云百炼 qwen3-asr-flash

  • 支持多语言识别
  • 识别速度快,准确率高
  • API 调用简单

文本分析阿里云百炼 qwen-max

  • 强大的文本理解能力
  • 支持复杂的总结任务
  • 可定制化提示词

Web 框架Gradio

  • 快速构建 Web 界面
  • 组件丰富,易于定制
  • 支持文件上传和下载

核心功能

  1. 多语言语音识别:支持中英日韩等多种语言,可自动检测
  2. 智能总结:提供标准、简要、详细、行动清单四种总结模式
  3. 关键词提取:自动识别会议核心主题
  4. 记录管理:支持 JSON 和 Markdown 两种格式导出
  5. 专业界面:商务风格设计,操作流程清晰

三、构建过程与技术细节

第一阶段:基础功能实现

1. 语音识别模块

使用 DashScope 的多模态对话 API 进行语音识别:

def transcribe_audio(audio_file, language="auto"):
    """使用qwen3-asr-flash进行语音识别"""
    audio_path = f"file://{os.path.abspath(audio_file)}"
    
    messages = [
        {"role": "system", "content": [{"text": ""}]},
        {"role": "user", "content": [{"audio": audio_path}]}
    ]
    
    asr_options = {"enable_itn": True}
    if language != "auto":
        asr_options["language"] = language
    
    response = dashscope.MultiModalConversation.call(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        model="qwen3-asr-flash",
        messages=messages,
        result_format="message",
        asr_options=asr_options
    )
    
    return response.output.choices[0].message.content[0]["text"]

关键技术点:

  • 使用 file:// 协议处理本地文件路径
  • enable_itn 开启逆文本规范化,将数字、日期等转为标准格式
  • 支持语言参数配置,提升识别准确率

2. 会议总结模块

设计了四种总结模式,通过不同的提示词实现:

prompts = {
    "standard": "请提供专业的会议总结,包括:\n1. 会议主题\n2. 核心议题\n3. 关键决策\n4. 待办事项\n5. 后续跟进",
    "brief": "请用简洁的方式总结会议要点,突出最重要的3-5个关键信息",
    "detailed": "请提供详细的会议记录,包括:\n1. 会议背景\n2. 讨论过程\n3. 各方观点\n4. 决策依据\n5. 行动计划\n6. 时间节点",
    "action": "请专注于提取会议中的行动项,包括:\n1. 具体任务\n2. 责任人\n3. 截止时间\n4. 优先级"
}

这种设计让用户可以根据不同场景选择合适的总结方式。

第二阶段:功能增强

1. 关键词提取

通过专门的提示词让模型扮演关键词提取专家:

def extract_keywords(transcript):
    """提取关键词"""
    messages = [
        {
            "role": "system",
            "content": "你是关键词提取专家。请从文本中提取5-10个最重要的关键词,用逗号分隔。"
        },
        {
            "role": "user",
            "content": transcript
        }
    ]
    
    response = dashscope.Generation.call(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        model="qwen-max",
        messages=messages,
        result_format="message"
    )
    
    return response.output.choices[0].message.content

2. 记录导出功能

实现了两种导出格式:

  • JSON 格式:保存完整数据,便于程序处理
  • Markdown 格式:生成专业文档,便于分享
def export_to_markdown(transcript, summary, keywords, meeting_title):
    """导出为Markdown格式"""
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    title = meeting_title or f"会议记录_{datetime.now().strftime('%Y%m%d')}"
    
    markdown_content = f"""# {title}

**时间**: {timestamp}

## 关键词
{keywords}

---

## 会议总结
{summary}

---

## 完整记录
{transcript}

---
*本记录由会议助手自动生成*
"""
    
    filepath = HISTORY_DIR / f"{title.replace(' ', '_')}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
    
    with open(filepath, 'w', encoding='utf-8') as f:
        f.write(markdown_content)
    
    return str(filepath)

第三阶段:界面优化

1. 布局设计

采用左右分栏布局:

  • 左侧:音频上传、参数配置、处理按钮
  • 右侧:标签页展示不同维度的结果
with gr.Row():
    # 左侧:输入区域
    with gr.Column(scale=2):
        audio_input = gr.Audio(...)
        language_select = gr.Dropdown(...)
        summary_type = gr.Dropdown(...)
        process_btn = gr.Button(...)
    
    # 右侧:输出区域
    with gr.Column(scale=3):
        with gr.Tabs():
            with gr.Tab("总结"):
                summary_output = gr.Textbox(...)
            with gr.Tab("完整记录"):
                transcript_output = gr.Textbox(...)
            with gr.Tab("关键词"):
                keywords_output = gr.Textbox(...)

2. 样式定制

使用自定义 CSS 打造专业商务风格:

custom_css = """
.header {
    text-align: center;
    padding: 2rem 0;
    border-bottom: 2px solid #e5e7eb;
    margin-bottom: 2rem;
}
.header h1 {
    font-size: 2rem;
    font-weight: 600;
    color: #1f2937;
}
.section-title {
    font-size: 1.1rem;
    font-weight: 600;
    color: #374151;
    border-bottom: 1px solid #e5e7eb;
}
"""

技术难点与解决方案

1. 文件路径处理

问题:Gradio 上传的文件需要转换为 DashScope API 可识别的格式

解决:使用 file:// 协议 + 绝对路径

audio_path = f"file://{os.path.abspath(audio_file)}"

2. 异步处理

问题:语音识别和文本分析都需要时间,如何提供良好的用户体验

解决:

  • 实时状态反馈
  • 显示处理进度
  • 分步展示结果

3. 错误处理

在每个关键函数中添加完善的异常处理:

try:
    # 核心逻辑
    response = dashscope.MultiModalConversation.call(...)
    if response.status_code == 200:
        return transcript, f"✓ 识别完成 | 字数: {word_count}"
    else:
        return None, f"识别失败: {response.message}"
except Exception as e:
    return None, f"错误: {str(e)}"

四、核心代码展示

完整的处理流程

def process_meeting(audio_file, language, summary_type):
    """处理完整流程:识别 -> 总结 -> 关键词提取"""
    # 第一步:语音识别
    transcript, status = transcribe_audio(audio_file, language)
    
    if transcript is None:
        return status, "", "", ""
    
    # 第二步:生成总结
    summary = generate_summary(transcript, summary_type)
    
    # 第三步:提取关键词
    keywords = extract_keywords(transcript)
    
    return status, transcript, summary, keywords

界面构建

with gr.Blocks(css=custom_css, title="会议助手") as demo:
    # 头部
    with gr.Row(elem_classes="header"):
        gr.HTML("""
            <div>
                <h1>会议助手</h1>
                <p>专业的会议记录与分析工具</p>
            </div>
        """)
    
    with gr.Row():
        # 左侧:输入区域
        with gr.Column(scale=2):
            gr.HTML('<div class="section-title">音频文件</div>')
            audio_input = gr.Audio(
                label="",
                type="filepath",
                sources=["upload"],
                show_label=False
            )
            
            with gr.Row():
                language_select = gr.Dropdown(
                    choices=[
                        ("自动检测", "auto"),
                        ("中文", "zh"),
                        ("英文", "en"),
                        ("日语", "ja"),
                        ("韩语", "ko")
                    ],
                    value="auto",
                    label="语言"
                )
                
                summary_type = gr.Dropdown(
                    choices=[
                        ("标准总结", "standard"),
                        ("简要总结", "brief"),
                        ("详细记录", "detailed"),
                        ("行动清单", "action")
                    ],
                    value="standard",
                    label="总结类型"
                )
            
            process_btn = gr.Button("开始处理", variant="primary", size="lg")
            status_output = gr.Textbox(label="处理状态", interactive=False)
        
        # 右侧:输出区域
        with gr.Column(scale=3):
            with gr.Tabs():
                with gr.Tab("总结"):
                    summary_output = gr.Textbox(
                        label="",
                        lines=15,
                        show_label=False,
                        placeholder="会议总结将在这里显示..."
                    )
                
                with gr.Tab("完整记录"):
                    transcript_output = gr.Textbox(
                        label="",
                        lines=15,
                        show_label=False,
                        placeholder="完整的语音识别文本将在这里显示..."
                    )
                
                with gr.Tab("关键词"):
                    keywords_output = gr.Textbox(
                        label="",
                        lines=15,
                        show_label=False,
                        placeholder="关键词将在这里显示..."
                    )
    
    # 底部:操作区域
    with gr.Row():
        with gr.Column(scale=3):
            meeting_title_input = gr.Textbox(
                label="会议标题(可选)",
                placeholder="例如:2024年Q1产品规划会议"
            )
        
        with gr.Column(scale=1):
            save_btn = gr.Button("保存记录", size="lg")
            export_btn = gr.Button("导出Markdown", size="lg")
    
    with gr.Row():
        save_status = gr.Textbox(label="保存状态", interactive=False)
        export_status = gr.Textbox(label="导出状态", interactive=False)
    
    # 事件绑定
    process_btn.click(
        fn=process_meeting,
        inputs=[audio_input, language_select, summary_type],
        outputs=[status_output, transcript_output, summary_output, keywords_output]
    )
    
    save_btn.click(
        fn=save_meeting_record,
        inputs=[transcript_output, summary_output, keywords_output, meeting_title_input],
        outputs=[save_status]
    )
    
    export_btn.click(
        fn=export_to_markdown,
        inputs=[transcript_output, summary_output, keywords_output, meeting_title_input],
        outputs=[gr.File(label="下载文件"), export_status]
    )

记录保存功能

def save_meeting_record(transcript, summary, keywords, meeting_title):
    """保存会议记录为JSON格式"""
    if not transcript:
        return "没有可保存的内容"
    
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"meeting_{timestamp}.json"
    
    record = {
        "title": meeting_title or f"会议记录_{timestamp}",
        "timestamp": datetime.now().isoformat(),
        "transcript": transcript,
        "summary": summary,
        "keywords": keywords
    }
    
    filepath = HISTORY_DIR / filename
    with open(filepath, 'w', encoding='utf-8') as f:
        json.dump(record, f, ensure_ascii=False, indent=2)
    
    return f"✓ 已保存至: {filepath}"

五、使用效果与总结

实际效果

  1. 识别准确率:对于清晰的会议录音,识别准确率可达 95% 以上
  2. 总结质量:能够准确提取会议要点,结构化呈现关键信息
  3. 处理速度:一小时的会议录音,处理时间约 2-3 分钟
  4. 用户体验:界面简洁专业,操作流程清晰

适用场景

  • 企业内部会议记录
  • 客户访谈整理
  • 培训课程总结
  • 研讨会记录
  • 电话会议记录

项目收获

技术层面

  • 掌握了多模态 AI 模型的应用
  • 学会了 Gradio 的高级定制技巧
  • 理解了提示词工程的重要性
  • 熟悉了 DashScope API 的使用

工具层面

  • Kiro IDE 大幅提升了开发效率
  • AI 辅助编程不是替代,而是增强
  • 自然语言交互让开发更加直观
  • Spec 和 Steering 功能让开发更可控

产品层面

  • 用户体验设计的重要性
  • 功能完整性与易用性的平衡
  • 专业化界面的价值

未来优化方向

  1. 实时转写:支持会议进行中的实时语音转文字
  2. 多人识别:区分不同发言人
  3. 智能问答:基于会议内容的问答系统
  4. 多语言翻译:跨语言会议的实时翻译
  5. 会议分析:统计发言时长、参与度等指标

结语

这次使用 Kiro IDE 构建智能会议助手的经历,让我深刻体会到 AI 辅助开发的强大之处。Kiro 不仅是一个代码生成工具,更像是一位懂你的技术伙伴,能够理解需求、提供建议、快速实现。

对于开发者来说,Kiro 让我们可以把更多精力放在产品设计和业务逻辑上,而不是陷入繁琐的代码细节。这种开发方式的转变,或许就是未来软件工程的方向。

如果你也想尝试 AI 辅助开发,不妨从一个小项目开始,相信你会有不一样的收获。


相关资源

Kiro 相关

技术文档

项目信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值