""" 语音唤醒模块使用示例(支持AEC回音消除) 演示如何使用独立的语音唤醒模块,包括AEC功能 """ import asyncio import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from wake_word_module import WakeWordDetector, AudioCapture, WakeWordConfig, AECProcessor async def main(): """主函数""" print("=" * 60) print("语音唤醒模块示例(支持AEC)") print("=" * 60) # 1. 列出可用音频设备 print("\n1. 列出可用音频设备:") AudioCapture.list_devices() # 2. 创建配置 print("\n2. 创建语音唤醒配置:") # 假设模型文件在 models 目录下 model_path = Path("models") if not model_path.exists(): print(f"错误: 模型目录不存在: {model_path}") print("请确保以下文件存在于模型目录中:") print("encoder.onnx") print("decoder.onnx") print("joiner.onnx") print("tokens.txt") print("keywords.txt") return config = WakeWordConfig( model_path=str(model_path), sample_rate=16000, num_threads=4, provider="cpu", keywords_score=1.8, keywords_threshold=0.2, detection_cooldown=1.5, ) print(f" 模型路径: {config.model_path}") print(f" 采样率: {config.sample_rate}Hz") print(f" 检测阈值: {config.keywords_threshold}") # 3. 创建音频采集器(启用AEC) print("\n3. 创建音频采集器:") print(" 是否启用AEC回音消除: 是") audio_capture = AudioCapture( sample_rate=16000, channels=1, device_id=None, # 自动选择设备 enable_aec=True, # 启用AEC回音消除 ) # 4. 创建唤醒词检测器 print("\n4. 创建唤醒词检测器:") detector = WakeWordDetector(config) # 5. 设置回调函数 def on_wake_word_detected(result, full_text): """唤醒词检测回调""" print("\n" + "=" * 60) print("🎉 检测到唤醒词!唤醒成功!✅") print(f" 结果: {result}") print(f" 完整文本: {full_text}") print("=" * 60 + "\n") def on_error(error): """错误回调""" print(f"❌ 唤醒词检测错误: {error}") detector.on_detected(on_wake_word_detected) detector.on_error(on_error) # 6. 连接音频采集器和检测器 print("\n5. 连接音频采集器和检测器:") audio_capture.add_audio_listener(detector) # 7. 启动系统 print("\n6. 启动系统:") try: await audio_capture.start() await detector.start() print("\n✅ 语音唤醒系统已启动!") print(" AEC回音消除: 已启用") print(" 请说出唤醒词进行测试...") print(" 按 Ctrl+C 停止程序\n") # 保持运行 while True: await asyncio.sleep(1) except KeyboardInterrupt: print("\n\n收到停止信号...") except Exception as e: print(f"\n❌ 发生错误: {e}") finally: # 8. 清理资源 print("\n7. 清理资源:") await detector.stop() await audio_capture.stop() print("✅ 资源已清理完毕") async def main_without_aec(): """不使用AEC的示例""" print("=" * 60) print("语音唤醒模块示例(不使用AEC)") print("=" * 60) # 1. 列出可用音频设备 print("\n1. 列出可用音频设备:") AudioCapture.list_devices() # 2. 创建配置 print("\n2. 创建语音唤醒配置:") model_path = Path("models") if not model_path.exists(): print(f"错误: 模型目录不存在: {model_path}") return config = WakeWordConfig( model_path=str(model_path), sample_rate=16000, ) # 3. 创建音频采集器(不启用AEC) print("\n3. 创建音频采集器:") print(" 是否启用AEC回音消除: 否") audio_capture = AudioCapture( sample_rate=16000, channels=1, device_id=None, enable_aec=False, # 不启用AEC ) # 4. 创建唤醒词检测器 detector = WakeWordDetector(config) # 5. 设置回调 def on_wake_word_detected(result, full_text): print(f"\n🎉 检测到唤醒词: {result},唤醒成功!✅") print(f" 完整文本: {full_text}") detector.on_detected(on_wake_word_detected) # 6. 连接并启动 audio_capture.add_audio_listener(detector) await audio_capture.start() await detector.start() print("\n✅ 语音唤醒系统已启动! (不使用AEC)") print(" 请说出唤醒词进行测试...") print(" 按 Ctrl+C 停止程序\n") try: while True: await asyncio.sleep(1) except KeyboardInterrupt: print("\n\n收到停止信号...") finally: await detector.stop() await audio_capture.stop() print("✅ 资源已清理完毕") if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="语音唤醒模块示例") parser.add_argument( "--no-aec", action="store_true", help="不使用AEC回音消除" ) args = parser.parse_args() try: if args.no_aec: asyncio.run(main_without_aec()) else: asyncio.run(main()) except KeyboardInterrupt: print("\n程序已退出") sys.exit(0)