Skill: chinapjs/pengjschina-meeting-transcriber (version 1.0.0)

# Meeting Transcriber - 会议转录技能 基于 FunASR 的实时会议转录技能，支持中文语音识别、实时转录、文件保存和环境管理。 ## 🎯 功能特性 ### 🎙️ 实时语音转录 - 实时麦克风录音和语音识别 - 支持中文语音识别 - 智能语音活动检测（VAD） - 自动标点恢复 ### 📝 会议纪要生成 - 自动保存转录文本 - 按时间戳记录发言 - 生成结构化会议纪要 - 支持导出文本格式 ### 🔧 环境管理 - Conda 环境自动检测 - 依赖包完整性检查 - 一键环境配置 - 音频设备检测 ## 🚀 快速开始 ### 安装技能 技能已自动注册到 OpenClaw，无需额外安装。 ### 使用命令 在 OpenClaw 会话中，使用以下命令： #### 转录操作 - `开始会议转录` - 启动实时语音转录 - `停止转录` - 停止转录并保存文件 #### 环境管理 - `检查转录环境` - 检查 Conda 环境和依赖包 - `设置转录环境` - 配置 Conda 环境和安装依赖 #### 文件管理 - `查看会议记录` - 列出所有会议转录文件 - `打开最新会议纪要` - 打开最新的会议纪要文件 ## 📁 文件结构 ``` meeting-transcriber/ ├── _meta.json # 技能元数据 ├── transcriber.py # 技能主文件（支持所有命令） ├── start_meeting.bat # 批处理启动文件 ├── check_env.py # 环境检查工具 ├── conda_setup.py # 环境设置工具 └── SKILL.md # 技能说明文档 ``` ## 🔧 技术要求 ### 必需条件 - **操作系统**: Windows 10/11 - **Conda**: Miniconda 或 Anaconda - **Python**: 3.8+（通过 Conda `audioProject` 环境） - **Conda 环境**: `audioProject` ### 依赖包 - `funasr` - 语音识别引擎 - `torch` - 深度学习框架 - `pyaudio` - 音频输入输出 - `webrtcvad` - 语音活动检测 - `numpy` - 数值计算 ## 📊 使用示例 ### 示例 1: 完整会议转录流程 ``` 用户: 开始会议转录 AI: 启动转录系统... 用户: （开始会议讨论） 用户: 停止转录 AI: 转录已保存，文件位置: ... ``` ### 示例 2: 环境检查 ``` 用户: 检查转录环境 AI: 检查Python环境... OK AI: 检查项目目录... OK AI: 检查依赖包... OK AI: 环境检查通过！ ``` ### 示例 3: 查看会议记录 ``` 用户: 查看会议记录 AI: 找到 5 个转录文件: AI: 1. meeting_20260402_103149.txt AI: 2. meeting_20260402_100724.txt AI: ... ``` ## 🛠️ 故障排除 ### 常见问题 **Q: 环境检查失败** ``` A: 1. 运行'设置转录环境'命令 2. 或手动创建环境: conda create -n audioProject python=3.8 3. 手动安装依赖: pip install funasr torch pyaudio webrtcvad ``` **Q: 转录启动失败** ``` A: 1. 检查麦克风权限 2. 运行'检查转录环境'验证环境 3. 尝试使用批处理文件: start_meeting.bat ``` **Q: 编码错误（乱码）** ``` A: 1. 使用批处理文件: start_meeting.bat 2. 脚本已内置编码修复 ``` **Q: 麦克风无法工作** ``` A: 1. 检查麦克风是否被其他程序占用 2. 运行环境检查查看音频设备 3. 确保麦克风已正确连接 ``` ### 性能优化建议 1. **硬件优化** - 使用 USB 麦克风或耳机麦克风 - 确保足够的系统内存（建议 8GB+） - 使用 SSD 存储提高 IO 性能 2. **软件优化** - 关闭不必要的后台程序 - 调整音频缓冲区大小 - 使用安静的录音环境 3. **环境优化** - 在安静的房间中使用 - 避免风扇、空调等背景噪音 - 说话时靠近麦克风 ## 📈 高级功能 ### 自定义配置 技能支持以下自定义配置： - 转录语言设置（默认中文） - VAD 参数调整 - 保存路径配置 - 音频设备选择 ### 扩展功能 如需扩展功能，可以修改以下文件： - `D:/dev/python/voiceFunAsr/vocie_mic_fixed_gbk.py` - 核心转录逻辑 - `transcriber.py` - 技能命令处理逻辑 ## 📝 文件说明 ### 核心文件 | 文件 | 功能 | 使用场景 | |------|------|----------| | `transcriber.py` | 技能主文件 | 处理所有命令，OpenClaw自动调用 | | `start_meeting.bat` | 批处理启动文件 | 直接启动转录，解决编码问题 | | `check_env.py` | 环境检查工具 | 独立运行环境检查 | | `conda_setup.py` | 环境设置工具 | 自动安装依赖和环境 | ### 转录文件 - **位置**: `D:\dev\python\voiceFunAsr\meeting_records\` - **格式**: `meeting_YYYYMMDD_HHMMSS.txt` - **内容**: 按时间戳记录的转录文本 ## 🔄 更新日志 ### v1.0.0 (2026-04-02) - 初始版本发布 - 基于 FunASR 的实时语音转录 - 完整的命令支持 - 环境检查和管理 - 文件查看和打开功能 - OpenClaw 技能集成 ### 计划功能 - [ ] 多说话人识别 - [ ] 实时翻译功能 - [ ] 云端同步备份 - [ ] 移动端支持 ## 📞 技术支持 如有问题，请提供： 1. 操作系统和 Python 版本 2. 错误日志或截图 3. 麦克风设备信息 4. 会议环境描述 --- **提示**: 首次使用时建议运行环境检查： ``` 检查转录环境 ``` **转录文件位置**: `D:\dev\python\voiceFunAsr\meeting_records\`

path: check_env.py
content: #!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
会议纪要助手 - 环境检查工具
验证Conda环境和依赖包
"""

import subprocess
import sys
import os
from pathlib import Path

def check_python():
    """检查Python可执行文件"""
    python_exe = Path(r"D:\ProgramData\Miniconda3\envs\audioProject\python.exe")
    
    print("\n[1] 检查Python环境...")
    if python_exe.exists():
        print(f"    ✅ 找到: {python_exe}")
        
        # 获取版本
        try:
            result = subprocess.run(
                [str(python_exe), "--version"],
                capture_output=True,
                text=True,
                encoding='utf-8'
            )
            print(f"    ✅ 版本: {result.stdout.strip()}")
            return True
        except Exception as e:
            print(f"    ❌ 无法运行Python: {e}")
            return False
    else:
        print(f"    ❌ 未找到: {python_exe}")
        print("    请确保已创建 audioProject Conda环境")
        return False

def check_project():
    """检查项目目录"""
    project_dir = Path(r"D:\dev\python\voiceFunAsr")
    script_gbk = project_dir / "vocie_mic_fixed_gbk.py"  # 使用修复后的脚本
    script_original = project_dir / "vocie_mic_fixed.py"
    
    print("\n[2] 检查项目目录...")
    if project_dir.exists():
        print(f"    ✅ 项目目录: {project_dir}")
        
        # 检查脚本文件
        if script_gbk.exists():
            print(f"    ✅ 脚本文件 (GBK修复版): {script_gbk.name}")
        elif script_original.exists():
            print(f"    ⚠️  脚本文件 (原始版): {script_original.name}")
            print("    建议使用GBK修复版以避免编码问题")
        else:
            print(f"    ❌ 未找到脚本文件")
            return False
        
        # 检查转录目录
        records_dir = project_dir / "meeting_records"
        if records_dir.exists():
            print(f"    ✅ 转录目录: {records_dir.name}")
        else:
            print(f"    ⚠️  转录目录不存在，将自动创建")
        
        # 检查模型缓存
        modelscope_dir = Path(r"C:\Users\pengjschina\.cache\modelscope\hub\models\iic")
        if modelscope_dir.exists():
            print(f"    ✅ 模型缓存目录存在")
            # 检查具体模型
            model_dir = modelscope_dir / "speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch"
            if model_dir.exists():
                print(f"    ✅ ASR模型已下载")
            else:
                print(f"    ⚠️  ASR模型未下载，首次使用将自动下载")
        else:
            print(f"    ⚠️  模型缓存目录不存在，首次使用将自动下载模型")
        
        return True
    else:
        print(f"    ❌ 项目目录未找到: {project_dir}")
        return False

def check_dependencies():
    """检查Python依赖包"""
    python_exe = r"D:\ProgramData\Miniconda3\envs\audioProject\python.exe"
    deps = [
        ('funasr', '语音识别引擎'),
        ('torch', '深度学习框架'),
        ('torchaudio', '音频处理'),
        ('pyaudio', '音频输入输出'),
        ('webrtcvad', '语音活动检测'),
        ('numpy', '数值计算')
    ]
    
    print("\n[3] 检查依赖包...")
    
    all_ok = True
    for dep, description in deps:
        try:
            result = subprocess.run(
                [python_exe, "-c", f"import {dep}; print('OK')"],
                capture_output=True,
                text=True,
                encoding='utf-8',
                timeout=10
            )
            if result.returncode == 0:
                print(f"    ✅ {dep} - {description}")
            else:
                print(f"    ❌ {dep} - 未安装")
                all_ok = False
        except subprocess.TimeoutExpired:
            print(f"    ⚠️  {dep} - 检查超时")
        except Exception as e:
            print(f"    ❌ {dep} - 检查失败: {e}")
            all_ok = False
    
    return all_ok

def check_audio_devices():
    """检查音频设备"""
    python_exe = r"D:\ProgramData\Miniconda3\envs\audioProject\python.exe"
    
    print("\n[4] 检查音频设备...")
    try:
        result = subprocess.run(
            [python_exe, "-c", """
import pyaudio
p = pyaudio.PyAudio()
input_devices = []
for i in range(p.get_device_count()):
    dev_info = p.get_device_info_by_index(i)
    if dev_info['maxInputChannels'] > 0:
        input_devices.append((i, dev_info['name']))
p.terminate()
print(f"Found {len(input_devices)} input devices")
for idx, name in input_devices[:3]:  # 显示前3个
    print(f"  [{idx}] {name}")
if len(input_devices) > 3:
    print(f"  ... and {len(input_devices)-3} more")
"""],
            capture_output=True,
            text=True,
            encoding='utf-8',
            timeout=10
        )
        
        if result.returncode == 0:
            lines = result.stdout.strip().split('\n')
            if lines:
                print(f"    {lines[0]}")
                for line in lines[1:]:
                    print(f"    {line}")
            return True
        else:
            print(f"    ❌ 无法检查音频设备")
            return False
            
    except Exception as e:
        print(f"    ❌ 音频设备检查失败: {e}")
        return False

def main():
    print("=" * 60)
    print("会议纪要助手 - 环境检查")
    print("=" * 60)
    
    results = []
    
    # 运行检查
    results.append(check_python())
    results.append(check_project())
    deps_ok = check_dependencies()
    audio_ok = check_audio_devices()
    
    # 总结
    print("\n" + "=" * 60)
    
    all_passed = all(results) and deps_ok
    
    if all_passed:
        print("✅ 环境检查通过！")
        print("\n可以开始使用会议转录：")
        print("  1. 在OpenClaw中说'开始会议转录'")
        print("  2. 或运行: python run_in_conda.py")
        print("\n转录文件将保存到: D:\\dev\\python\\voiceFunAsr\\meeting_records\\")
    else:
        print("⚠️ 环境检查发现问题")
        print("\n需要解决的问题：")
        if not all(results):
            print("  - Python环境或项目目录问题")
        if not deps_ok:
            print("  - 依赖包缺失，请运行: python conda_setup.py")
        if not audio_ok:
            print("  - 音频设备问题，请检查麦克风连接")
        
        print("\n建议操作：")
        print("  1. 运行环境设置: python conda_setup.py")
        print("  2. 或运行PowerShell脚本: .\\setup_and_test.ps1")
    
    print("=" * 60)
    
    return 0 if all_passed else 1

if __name__ == "__main__":
    sys.exit(main())

path: conda_setup.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Conda 环境配置脚本
专门为 audioProject 虚拟环境配置会议纪要助手技能
"""

import os
import sys
import json
import subprocess
from pathlib import Path

def detect_conda_environment():
    """检测 Conda 环境"""
    print("🔍 检测 Conda 环境")
    print("="*60)
    
    env_info = {}
    
    # 尝试检测 Conda
    try:
        # 方法1: 检查 CONDA_PREFIX 环境变量
        conda_prefix = os.environ.get('CONDA_PREFIX')
        if conda_prefix:
            env_info['conda_prefix'] = conda_prefix
            env_info['detected_by'] = 'CONDA_PREFIX'
        
        # 方法2: 运行 conda info 命令
        result = subprocess.run(
            ['conda', 'info', '--json'],
            capture_output=True,
            text=True,
            encoding='utf-8'
        )
        
        if result.returncode == 0:
            conda_info = json.loads(result.stdout)
            env_info.update({
                'conda_version': conda_info.get('conda_version'),
                'active_prefix': conda_info.get('active_prefix'),
                'envs': conda_info.get('envs', [])
            })
            env_info['detected_by'] = 'conda info'
    
    except (subprocess.CalledProcessError, FileNotFoundError, json.JSONDecodeError):
        pass
    
    # 检查 audioProject 环境
    project_env = None
    if env_info.get('envs'):
        for env_path in env_info['envs']:
            if 'audioProject' in str(env_path):
                project_env = str(env_path)
                break
    
    env_info['audioProject_path'] = project_env
    
    # 显示检测结果
    if env_info.get('conda_version'):
        print(f"✅ 检测到 Conda: 版本 {env_info['conda_version']}")
    else:
        print("❌ 未检测到 Conda")
    
    if env_info.get('active_prefix'):
        print(f"✅ 当前激活环境: {env_info['active_prefix']}")
    
    if project_env:
        print(f"✅ 找到 audioProject 环境: {project_env}")
    else:
        print("❌ 未找到 audioProject 环境")
    
    return env_info

def get_python_from_env(env_path):
    """获取指定环境的 Python 路径"""
    if not env_path:
        return None
    
    env_path = Path(env_path)
    
    # Windows 路径
    python_paths = [
        env_path / 'python.exe',
        env_path / 'Scripts' / 'python.exe',
    ]
    
    # Unix 路径
    python_paths.extend([
        env_path / 'bin' / 'python',
        env_path / 'bin' / 'python3',
    ])
    
    for path in python_paths:
        if path.exists():
            return str(path)
    
    return None

def test_environment_access():
    """测试环境访问"""
    print("\n🧪 测试环境访问")
    print("="*60)
    
    tests = []
    
    # 测试项目目录
    project_path = Path("D:/dev/python/voiceFunAsr")
    if project_path.exists():
        tests.append(("项目目录", "✅", str(project_path)))
    else:
        tests.append(("项目目录", "❌", "不存在"))
    
    # 测试虚拟环境中的 Python
    env_info = detect_conda_environment()
    python_path = get_python_from_env(env_info.get('audioProject_path'))
    
    if python_path:
        tests.append(("Python 路径", "✅", python_path))
        
        # 测试 Python 版本
        try:
            result = subprocess.run(
                [python_path, '--version'],
                capture_output=True,
                text=True,
                encoding='utf-8'
            )
            if result.returncode == 0:
                tests.append(("Python 版本", "✅", result.stdout.strip()))
            else:
                tests.append(("Python 版本", "❌", "无法获取"))
        except:
            tests.append(("Python 版本", "❌", "执行失败"))
    else:
        tests.append(("Python 路径", "❌", "未找到"))
    
    # 测试依赖包
    if python_path:
        dependencies = ['pyaudio', 'webrtcvad', 'funasr', 'torch']
        for dep in dependencies:
            try:
                result = subprocess.run(
                    [python_path, '-c', f'import {dep}; print(f"{dep} version: OK")'],
                    capture_output=True,
                    text=True,
                    encoding='utf-8'
                )
                if result.returncode == 0:
                    tests.append((f"依赖 {dep}", "✅", "已安装"))
                else:
                    tests.append((f"依赖 {dep}", "❌", "未安装"))
            except:
                tests.append((f"依赖 {dep}", "❌", "检查失败"))
    
    # 显示测试结果
    for name, status, message in tests:
        print(f"{status} {name}: {message}")
    
    return all(status == "✅" for _, status, _ in tests)

def create_conda_config():
    """创建 Conda 环境配置文件"""
    print("\n⚙️ 创建 Conda 环境配置")
    print("="*60)
    
    env_info = detect_conda_environment()
    python_path = get_python_from_env(env_info.get('audioProject_path'))
    
    if not python_path:
        print("❌ 无法获取 Python 路径，配置失败")
        return None
    
    config = {
        "conda_environment": {
            "name": "audioProject",
            "python_path": python_path,
            "env_path": env_info.get('audioProject_path'),
            "conda_version": env_info.get('conda_version'),
            "detected_at": subprocess.run(
                'date /T && time /T',
                shell=True,
                capture_output=True,
                text=True
            ).stdout.strip()
        },
        "project": {
            "path": "D:/dev/python/voiceFunAsr",
            "main_script": "vocie_mic_fixed.py",
            "requirements": "requirements.txt",
            "records_dir": "meeting_records"
        },
        "skill": {
            "use_conda": True,
            "activate_command": f'conda activate audioProject',
            "python_command": python_path,
            "working_directory": "D:/dev/python/voiceFunAsr"
        }
    }
    
    # 保存配置
    config_dir = Path.home() / ".openclaw"
    config_file = config_dir / "meeting_minutes_conda_config.json"
    
    try:
        os.makedirs(config_dir, exist_ok=True)
        with open(config_file, 'w', encoding='utf-8') as f:
            json.dump(config, f, indent=2, ensure_ascii=False)
        
        print(f"✅ 配置文件已创建: {config_file}")
        return config
    
    except Exception as e:
        print(f"❌ 创建配置文件失败: {e}")
        return None

def update_skill_for_conda():
    """更新技能以支持 Conda 环境"""
    print("\n🔄 更新技能以支持 Conda 环境")
    print("="*60)
    
    # 1. 更新 SKILL.md 中的元数据
    skill_md_path = Path(__file__).parent / "SKILL.md"
    if skill_md_path.exists():
        content = skill_md_path.read_text(encoding='utf-8')
        
        # 更新 metadata 部分
        if 'metadata:' in content:
            # 添加 Conda 环境信息
            conda_section = '\n  conda_environment: "audioProject"'
            if 'conda_environment' not in content:
                # 在 metadata 部分添加
                lines = content.split('\n')
                for i, line in enumerate(lines):
                    if line.strip().startswith('metadata:'):
                        # 在 metadata 块内添加
                        j = i + 1
                        while j < len(lines) and (lines[j].startswith('  ') or lines[j].startswith('}')):
                            j += 1
                        lines.insert(j, conda_section)
                        break
                content = '\n'.join(lines)
        
        skill_md_path.write_text(content, encoding='utf-8')
        print("✅ 更新了 SKILL.md 元数据")
    
    # 2. 创建 Conda 专用的启动脚本
    conda_script = Path(__file__).parent / "start_with_conda.bat"
    conda_content = """@echo off
REM 会议纪要助手 - Conda 环境启动脚本
REM 使用 audioProject 虚拟环境

echo 🎙️ 会议纪要助手 - Conda 版本
echo ========================================

REM 激活 Conda 环境
call conda activate audioProject
if errorlevel 1 (
    echo ❌ 无法激活 audioProject 环境
    pause
    exit /b 1
)

echo ✅ 已激活 audioProject 环境

REM 进入项目目录
cd /d D:\\dev\\python\\voiceFunAsr
if errorlevel 1 (
    echo ❌ 无法进入项目目录
    pause
    exit /b 1
)

echo ✅ 已进入项目目录

REM 运行转录脚本
echo 🚀 启动会议转录...
python vocie_mic_fixed.py

REM 如果脚本结束，暂停显示结果
pause
"""
    
    conda_script.write_text(conda_content, encoding='utf-8')
    print(f"✅ 创建了 Conda 启动脚本: {conda_script}")
    
    # 3. 更新主技能脚本以支持 Conda
    main_script = Path(__file__).parent / "meeting_minutes.py"
    if main_script.exists():
        content = main_script.read_text(encoding='utf-8')
        
        # 添加 Conda 环境检测
        conda_detection_code = '''
    def _get_conda_python(self):
        """获取 Conda 环境中的 Python 路径"""
        try:
            # 检查配置文件
            conda_config = self.config_dir / "meeting_minutes_conda_config.json"
            if conda_config.exists():
                with open(conda_config, 'r', encoding='utf-8') as f:
                    config = json.load(f)
                    python_path = config.get('skill', {}).get('python_command')
                    if python_path and Path(python_path).exists():
                        return python_path
            
            # 尝试自动检测
            env_paths = [
                Path.home() / "miniconda3" / "envs" / "audioProject",
                Path.home() / "anaconda3" / "envs" / "audioProject",
                Path("D:") / "miniconda3" / "envs" / "audioProject",
                Path("D:") / "anaconda3" / "envs" / "audioProject",
            ]
            
            for env_path in env_paths:
                python_exe = env_path / "python.exe"
                if python_exe.exists():
                    return str(python_exe)
                
                python_bin = env_path / "bin" / "python"
                if python_bin.exists():
                    return str(python_bin)
        
        except:
            pass
        
        return None
'''
        
        # 在 MeetingMinutesAssistant 类中添加方法
        if 'def _get_conda_python(self):' not in content:
            class_def_pos = content.find('class MeetingMinutesAssistant:')
            if class_def_pos != -1:
                # 找到第一个方法定义的位置
                method_start = content.find('def ', class_def_pos)
                if method_start != -1:
                    content = content[:method_start] + conda_detection_code + content[method_start:]
                    print("✅ 在主脚本中添加了 Conda 环境检测")
        
        main_script.write_text(content, encoding='utf-8')
    
    return True

def create_conda_requirements():
    """创建 Conda 环境要求文件"""
    print("\n📋 创建 Conda 环境要求")
    print("="*60)
    
    requirements = """# 会议纪要助手 - Conda 环境要求
# audioProject 虚拟环境应包含以下包

# 核心依赖
- python>=3.8
- pip

# 通过 pip 安装的包
- pyaudio
- webrtcvad
- sounddevice
- funasr>=1.0.27
- torch>=1.13.1
- torchaudio>=0.13.1

# 可选：用于增强功能
- openai-whisper
- pandas
- scikit-learn

# 环境配置说明
# 1. 创建环境: conda create -n audioProject python=3.8
# 2. 激活环境: conda activate audioProject
# 3. 安装依赖: pip install -r requirements.txt
# 4. 验证安装: python -c "import funasr; print('FunASR OK')"
"""
    
    req_file = Path(__file__).parent / "conda_requirements.txt"
    req_file.write_text(requirements, encoding='utf-8')
    print(f"✅ 创建了 Conda 环境要求文件: {req_file}")
    
    return True

def show_conda_usage():
    """显示 Conda 环境使用说明"""
    print("\n🚀 Conda 环境使用说明")
    print("="*60)
    
    print("1. 激活 Conda 环境:")
    print("   conda activate audioProject")
    print()
    
    print("2. 使用 Conda 启动脚本:")
    print("   start_with_conda.bat")
    print()
    
    print("3. 在 Conda 环境中测试技能:")
    print("   conda activate audioProject")
    print("   cd D:/dev/python/voiceFunAsr")
    print("   python vocie_mic_fixed.py")
    print()
    
    print("4. 在 OpenClaw 中使用（自动检测）:")
    print("   技能会自动检测并使用 Conda 环境")
    print("   无需手动激活环境")
    print()
    
    print("5. 手动指定 Python 路径:")
    print("   python meeting_minutes.py --python D:/miniconda3/envs/audioProject/python.exe")
    print()
    
    print("📁 重要路径:")
    print("   项目目录: D:/dev/python/voiceFunAsr")
    print("   Conda 环境: audioProject")
    print("   技能目录: C:/Users/pengjschina/.openclaw/workspace/skills/meeting-minutes-assistant")
    print("   配置文件: ~/.openclaw/meeting_minutes_conda_config.json")

def main():
    """主函数"""
    print("🎙️ 会议纪要助手 - Conda 环境配置")
    print("="*60)
    
    # 检测环境
    env_info = detect_conda_environment()
    
    if not env_info.get('audioProject_path'):
        print("\n⚠️  警告: 未找到 audioProject 环境")
        print("请确保:")
        print("1. Conda 已安装并配置")
        print("2. audioProject 环境已创建")
        print("3. 环境包含必要的依赖包")
        print("\n是否继续配置？(y/n): ", end='')
        if input().lower() != 'y':
            return
    
    # 测试环境访问
    if not test_environment_access():
        print("\n⚠️  环境测试有失败项")
        print("是否继续配置？(y/n): ", end='')
        if input().lower() != 'y':
            return
    
    # 创建配置
    config = create_conda_config()
    if not config:
        print("\n❌ 配置创建失败")
        return
    
    # 更新技能
    if not update_skill_for_conda():
        print("\n⚠️  技能更新有警告")
    
    # 创建要求文件
    create_conda_requirements()
    
    # 显示使用说明
    show_conda_usage()
    
    print("\n" + "="*60)
    print("✅ Conda 环境配置完成！")
    print("="*60)
    
    print("\n💡 下一步:")
    print("1. 测试环境: conda activate audioProject && python test_optimization.py")
    print("2. 使用 Conda 脚本: start_with_conda.bat")
    print("3. 在 OpenClaw 中测试: 说'开始会议转录'")

if __name__ == "__main__":
    main()

path: openclaw_wrapper.py
content: #!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
OpenClaw专用转录包装器
解决OpenClaw环境下的输出缓冲和交互问题
"""

import subprocess
import sys
import os
import time
from pathlib import Path

def main():
    print("=" * 60)
    print("OpenClaw会议转录包装器")
    print("=" * 60)
    print()
    print("此包装器专为解决OpenClaw环境下的转录问题：")
    print("  1. 输出缓冲问题 - 使用无缓冲输出")
    print("  2. 交互问题 - 启动独立窗口")
    print("  3. 编码问题 - 设置正确编码")
    print()
    
    print("请选择启动方式：")
    print("  1. 批处理文件（推荐，解决所有问题）")
    print("  2. 优化命令行（设置环境变量）")
    print("  3. 直接启动（可能有问题）")
    print()
    
    choice = input("请选择 (1/2/3): ").strip()
    
    if choice == "1":
        # 使用批处理文件
        batch_file = Path(__file__).parent / "openclaw_transcribe.bat"
        if batch_file.exists():
            print(f"\n使用批处理文件: {batch_file.name}")
            print("正在启动转录系统...")
            print()
            
            cmd = ["cmd", "/c", "start", "cmd", "/k", str(batch_file)]
            subprocess.Popen(cmd)
            
            print("转录系统已在新窗口中启动")
            print("请在新窗口中查看实时转录输出")
            print("按 Ctrl+C 停止转录")
            print()
            print("转录文件位置: D:\\dev\\python\\voiceFunAsr\\meeting_records\\")
            
        else:
            print(f"批处理文件未找到: {batch_file}")
            return 1
    
    elif choice == "2":
        # 优化命令行
        print("\n使用优化命令行启动...")
        print()
        
        cmd = ["cmd", "/c", "start", "cmd", "/k",
               "cd /d D:\\dev\\python\\voiceFunAsr && "
               "chcp 65001 && "
               "set PYTHONUNBUFFERED=1 && "
               "set PYTHONIOENCODING=utf-8 && "
               "conda run -n audioProject python -u vocie_mic_fixed_gbk.py"]
        
        print("执行命令:")
        print("  cd /d D:\\dev\\python\\voiceFunAsr")
        print("  chcp 65001")
        print("  set PYTHONUNBUFFERED=1")
        print("  set PYTHONIOENCODING=utf-8")
        print("  conda run -n audioProject python -u vocie_mic_fixed_gbk.py")
        print()
        
        subprocess.Popen(cmd)
        
        print("转录系统已在新窗口中启动")
        print("请在新窗口中查看实时转录输出")
        print("按 Ctrl+C 停止转录")
        print()
        print("转录文件位置: D:\\dev\\python\\voiceFunAsr\\meeting_records\\")
    
    elif choice == "3":
        # 直接启动（不推荐）
        print("\n直接启动（可能有问题）...")
        print("警告: 在OpenClaw中直接启动可能无法正常显示输出")
        print()
        
        cmd = ["conda", "run", "-n", "audioProject", "python", "-u", "vocie_mic_fixed_gbk.py"]
        
        print(f"执行命令: {' '.join(cmd)}")
        print(f"工作目录: D:\\dev\\python\\voiceFunAsr")
        print()
        print("正在启动转录系统...")
        print("-" * 50)
        
        try:
            process = subprocess.Popen(
                cmd,
                stdout=subprocess.PIPE,
                stderr=subprocess.STDOUT,
                text=True,
                encoding='utf-8',
                errors='replace',
                bufsize=1,
                universal_newlines=True,
                cwd=r"D:\dev\python\voiceFunAsr",
                env={**os.environ, "PYTHONUNBUFFERED": "1"}
            )
            
            print(f"转录进程已启动，PID: {process.pid}")
            print("转录系统初始化中...")
            print()
            
            line_count = 0
            while True:
                line = process.stdout.readline()
                if line:
                    line = line.rstrip()
                    line_count += 1
                    print(f"[{line_count:03d}] {line}")
                    sys.stdout.flush()
                
                returncode = process.poll()
                if returncode is not None:
                    print(f"转录进程结束，退出码: {returncode}")
                    break
            
            print("-" * 50)
            print(f"总共输出 {line_count} 行")
            
        except KeyboardInterrupt:
            print("\n用户中断转录")
            if 'process' in locals():
                process.terminate()
        except Exception as e:
            print(f"转录启动错误: {e}")
            return 1
    
    else:
        print("无效选择")
        return 1
    
    print()
    print("=" * 60)
    print("启动完成")
    print("=" * 60)
    
    return 0

if __name__ == "__main__":
    sys.exit(main())

path: _meta.json
content: {
  "name": "meeting-transcriber",
  "version": "1.0.0",
  "description": "基于FunASR的实时会议转录技能，支持中文语音识别、实时转录、文件保存和环境管理。",
  "author": "OpenClaw User",
  "homepage": "https://github.com/alibaba-damo-academy/FunASR",
  "license": "MIT",
  "keywords": ["meeting", "transcription", "speech-to-text", "chinese", "funasr"],
  "clawdbot": {
    "emoji": "🎙️",
    "requires": {
      "bins": ["python", "conda"],
      "files": ["D:/dev/python/voiceFunAsr/vocie_mic_fixed_gbk.py"],
      "conda_environment": "audioProject"
    },
    "execution": {
      "method": "conda_run",
      "main_script": "transcriber.py",
      "working_directory": "D:\\dev\\python\\voiceFunAsr",
      "timeout_seconds": 300,
      "conda_env": "audioProject"
    },
    "commands": {
      "start_transcription": "开始会议转录",
      "stop_transcription": "停止转录",
      "check_environment": "检查转录环境",
      "setup_environment": "设置转录环境",
      "view_records": "查看会议记录",
      "open_latest": "打开最新会议纪要",
      "openclaw_transcribe": "OpenClaw专用转录"
    },
    "troubleshooting": {
      "output_not_showing": "使用批处理文件: start_meeting.bat",
      "encoding_issues": "脚本已修复编码问题",
      "timeout_issues": "超时时间已设置为300秒",
      "audio_not_working": "检查麦克风权限和设备"
    }
  }
}

Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)