# ***********音频采集配置 ************* audio: sample_rate: 16000 channels: 1 sample_width: 2 frame_size: 1024 audio_format: "wav" # 麦克风:仅使用 input_device_index(PyAudio 整数)。null = 自动尝试默认输入 + 所有 in>0 设备。 # 运行 python src/rocket_drone_audio.py 会默认打印 arecord -l、PyAudio 列表与 hw 映射并交互选择。 # 自动化可加 --non-interactive 并在此写入整数索引;或传 --input-index / ROCKET_INPUT_DEVICE_INDEX。 input_device_index: null # 以下字段已不再参与选麦逻辑(可删或保留作备忘) input_strict_selection: false input_hw_card_device: null input_device_name_match: null # 设备报告双声道、但 channels 为 1 时,用立体声打开再下混为 mono(Orange Pi ES8388 等需开启) prefer_stereo_capture: true # ES8388 常需 48k 才能打开;打开后会在采集里重采样回 sample_rate audio_open_try_rates: [16000, 48000, 44100] # conda 下 PyAudio 常链到残缺 ALSA 插件:请在 shell 用 bash with_system_alsa.sh python … 启动 # ES8388 大声说话仍只有 RMS≈30:多为 ALSA「Left/Right Channel」采集=0%,先执行 scripts/es8388_capture_up.sh 再 sudo alsactl store # 高性能优化配置 high_performance_mode: true # 启用高性能模式(多线程+异步处理) use_callback_mode: true # 使用回调模式(非阻塞) buffer_queue_size: 10 # 音频缓冲队列大小 processing_threads: 2 # 处理线程数(采集和处理并行) batch_processing: true # 启用批处理优化 # 降噪配置 noise_reduce: true noise_reduction_method: "lightweight" # "lightweight" (轻量级) 或 "noisereduce" (完整版) noise_sample_duration_ms: 500 # 噪声样本收集时长(毫秒) noise_reduction_cutoff_hz: 80.0 # 轻量级降噪高通滤波截止频率(Hz) # 自动增益控制配置 agc: true agc_method: "incremental" # "incremental" (增量) 或 "standard" (标准) agc_target_db: -20.0 # AGC 目标音量(dB) # 过小(如 0.1)时在短时强噪声后易把波形压到 int16 近 0,能量 VAD 长期收不到音;建议 0.25~0.5 agc_gain_min: 0.25 # AGC 最小增益倍数 agc_gain_max: 10.0 # AGC 最大增益倍数 agc_rms_threshold: 1e-6 # AGC RMS 阈值(避免除零) agc_smoothing_alpha: 0.1 # 压低增益时的平滑系数(0-1,越小越慢) agc_release_alpha: 0.45 # 需要抬增益时(巨响/小声后恢复)用更大系数,由 audio.py 读取 # ***********语音活动检测配置 ************* vad: # 略降低门槛,避免板载麦/经 AGC 后仍达不到 0.65 threshold: 0.45 start_frame: 2 # 句尾连续静音块数(每块时长≈audio.frame_size/sample_rate);recognizer.trailing_silence_seconds 优先覆盖此项与 energy_vad_end_chunks end_frame: 10 min_silence_duration_s: 0.5 max_silence_duration_s: 30 model_path: "models/SileroVad/silero_vad.onnx" # ***********语音识别配置 ************* stt: # 模型路径配置 model_dir: "models/SenseVoiceSmall" # 模型目录 model_path: "models/SenseVoiceSmall/model.int8.onnx" # 直接指定模型路径(优先级高于 model_dir) prefer_int8: true # 是否优先使用 INT8 量化模型 warmup_file: "" # 预热音频文件 # 音频预处理配置 sample_rate: 16000 # 采样率(与 audio 配置保持一致) n_mels: 80 # Mel 滤波器数量 frame_length_ms: 25 # 帧长度(毫秒) frame_shift_ms: 10 # 帧移(毫秒) log_eps: 1e-10 # log 计算时的极小值(避免 log(0)) # ARM 设备优化配置 arm_optimization: enabled: true # 是否启用 ARM 优化 max_threads: 4 # 最大线程数(RK3588 使用 4 个大核) # CTC 解码配置 ctc_decode: blank_id: 0 # 空白 token ID # 语言和文本规范化配置(默认值,实际从模型元数据读取) language: zh_id: 3 # 中文语言ID(默认值) text_norm: with_itn_id: 14 # 使用 ITN 的 ID(默认值) without_itn_id: 15 # 不使用 ITN 的 ID(默认值) # 后处理配置 postprocess: special_tokens: # 需要移除的特殊 token - "<|zh|>" - "<|NEUTRAL|>" - "<|Speech|>" - "<|woitn|>" - "<|withitn|>" # ***********文本转语音配置 ************* tts: # Kokoro ONNX 中文模型目录 model_dir: "models/Kokoro-82M-v1.1-zh-ONNX" # ONNX 子目录中的模型文件名 # 清晰度优先: model_fp16.onnx / model.onnx > model_q4f16.onnx > int8/uint8 # 速度(板端 CPU):可试 model_q4f16.onnx;uint8 有时更慢(取决于 ORT/CPU) # 若仓库中仅有量化版,可改回 model_uint8.onnx 或 model_q4f16.onnx model_name: "model_uint8.onnx" # 语音风格(对应 voices 目录下的 *.bin, 这里不写扩展名) # 女声常用 zf_001 / zf_002;可换 zm_* 男声。以本机 voices 目录实际文件为准。 voice: "zm_009" # 语速系数(1.0 最自然; >1 易显赶、含糊; <1 更稳但略慢) speed: 1.15 # 输出采样率(与 Kokoro 模型保持一致, 官方为 24000Hz) sample_rate: 24000 # sounddevice 播放输出设备(命令应答语音走扬声器时请指定,避免播到虚拟声卡/耳机) # null:使用系统默认输出设备 # 整数:设备索引(启动日志会列出「sounddevice 输出设备列表」供对照) # 字符串:设备名称子串匹配(不区分大小写),例如 "扬声器"、"Speakers"、"Realtek" # 香橙派走 HDMI 出声时 PortAudio 名常含 rockchip-hdmi0,可设 output_device: "rockchip-hdmi0"(与 ROCKET_TTS_DEVICE 一致) output_device: null # 播放前重采样到该输出设备的 default_samplerate(Windows/WASAPI 下 24000Hz 常无声,强烈建议 true) playback_resample_to_device_native: true # 播放前将峰值压到约 0.92,减轻削波导致的爆音/杂音 playback_peak_normalize: true # 播放音量增益(波形幅度乘法,1.0 不变;1.3~1.8 更响,过大可能削波失真) playback_gain: 2.5 # 首尾淡入淡出(毫秒),减轻驱动/缓冲区切换时的爆音与「咔哒」声 playback_edge_fade_ms: 8 # sounddevice OutputStream 延迟: low / medium / high(high 易积缓冲,部分机器听感发闷或拖尾) playback_output_latency: low # ***********云端语音(LLM + TTS 上云,见 clientguide.md)************* cloud_voice: enabled: false server_url: "ws://192.168.0.186:8766/v1/voice/session" auth_token: "drone-voice-cloud-token-2024" device_id: "drone-001" timeout: 120 # PROMPT_LISTEN:麦克 RMS 持续低于 recognizer.energy_vad_rms_low 的累计秒数 ≥ 此值则超时(非滴声后固定墙上时钟);消抖/提示音见下 listen_silence_timeout_sec: 5 post_cue_mic_mute_ms: 200 segment_cue_duration_ms: 120 # 问候语 / 本地 LLM 文案 / 飞控确认超时等字符串是否走 WebSocket tts.synthesize(见 docs/API.md §3.3);失败回退 Kokoro remote_tts_for_local: true # 云端失败时是否回退本地 Qwen + Kokoro(需本地模型) fallback_to_local: true # PX4/MAV 语境:合并进 WebSocket session.start 的 client,供服务端 LLM;也可用 ROCKET_CLOUD_PX4_CONTEXT_FILE 覆盖路径 px4_context_file: "voice_drone/config/cloud_voice_px4_context.yaml" # ***********socket服务器配置 ************* socket_server: # deployed host: "192.168.43.200" port: 6666 #local # host: "127.0.0.1" # port: 8888 connection_timeout: 5.0 send_timeout: 2.0 reconnect_interval: 3.0 # -1:断线后持续重连并发送直到成功(仅打 warning,不当作一次性致命错误);正整数:最多尝试次数 max_retries: -1 # ***********文本预处理配置 ************* text_preprocessor: # 功能开关 enable_traditional_to_simplified: true # 启用繁简转换 enable_segmentation: true # 启用分词 enable_correction: true # 启用纠错 enable_number_extraction: true # 启用数字提取 enable_keyword_detection: true # 启用关键词检测 # 性能配置 lru_cache_size: 512 # LRU缓存大小(分词结果缓存) # ***********识别器流程配置 ************* recognizer: # 句尾连续静音达到该秒数后才切段送 STT,减少句中停顿被切开、识别半句。按 audio.frame_size 与 sample_rate 换算块数, # 并同时设置 Silero 的 vad.end_frame 与 energy 的 energy_vad_end_chunks。不配置则分别用 yaml 中上述两项。 trailing_silence_seconds: 1.5 # VAD 后端:energy(默认,无需 Silero ONNX)或 silero(需 models/SileroVad/silero_vad.onnx) vad_backend: energy energy_vad_rms_high: 8000 # int16 块 RMS,连续达到 start_chunks 块判为开始说话 energy_vad_rms_low: 5000 # 连续 end_chunks 块低于此判为结束(高噪底时单独不够) # 相对峰值判停:首字很响时若仍用 0.88,句中略轻易误判「已说完」。可改为 0.75~0.82;设 0 则关闭相对判据(只靠 rms_low + 尾静音) energy_vad_end_peak_ratio: 0.80 # 每音频块后对句内峰值衰减系数(0.95~0.999),与 end_peak_ratio 配合减少「长句说到一半被切」 energy_vad_utt_peak_decay: 0.988 energy_vad_start_chunks: 4 energy_vad_end_chunks: 15 # 预缓冲:在检测到语音开始时,把开始前的一小段音频也拼进语音段 # 用于避免 VAD 起始判定稍慢导致“丢字/丢开头” pre_speech_max_seconds: 0.8 # Socket 命令发送成功后,是否用 TTS 语音回复(需 Kokoro 模型与 sounddevice) ack_tts_enabled: true # 若配置了 ack_tts_phrases 且非空:仅下列命令会播报,且每次从对应列表随机选一句。 # 若未配置或为空 {}:回退为全局 ack_tts_text,所有成功命令均播报同一句(并可预缓存波形)。 # 阻塞预加载时会对所有「不重复」的备选句逐条合成并缓存;句数越多启动阶段越久,但播报为低延迟播放缓存。 ack_tts_phrases: takeoff: - "收到,正在控制无人机起飞" - "明白,正在准备起飞" - "懂你意思, 这就开始起飞" land: - "收到,正在控制无人机降落" - "明白,马上降落" - "懂你意思, 这就开始降落" follow: - "好的,我将持续跟随你,但请你不要移动太快" - "主人,我已经开始跟随模式,请不要突然离开我的视线" - "我已经开启了跟随模式" hover: - "我已悬停" - "我已经停下脚步了" - "放心,我现在开始不会乱动了" # 未使用 ack_tts_phrases 时的全局固定应答(旧行为) ack_tts_text: "收到!执行命令!" # 应答波形磁盘缓存:文案与 tts 配置未变时从 cache/ack_tts_pcm/ 读取,跳过后续启动时的逐条合成(可明显加快二次启动) ack_tts_disk_cache: true # 启动时预加载 Kokoro(首次加载约需十余秒) ack_tts_prewarm: true # true:启动阶段阻塞到 TTS 就绪后再进入监听(命令成功后可马上播报);false:后台加载(首条命令可能仍要等十余秒) ack_tts_prewarm_blocking: true # 播报应答前暂时停止 PyAudio 麦克风(Windows 上输入/输出同时占用时常导致扬声器无声;单独跑 tts 脚本时无此问题) # 香橙派 ES8388:暂停/恢复采集后出现「VAD RMS≈0、像没电平」时,可改为 false(避免 stop/start 采集),或加大 ROCKET_MIC_RESTART_SETTLE_MS。 ack_pause_mic_for_playback: true # ***********主程序 main_app(TakeoffPrintRecognizer)************* assistant: # 「keywords.yaml 里 takeoff 词 → 本地 offboard + WAV」捷径;默认关,飞控走云端 flight_intent / ROS 桥即可。 # 若需恢复口令起飞:此处改为 true,或启动前 export ROCKET_LOCAL_KEYWORD_TAKEOFF=1(非空环境变量优先于本项)。 local_keyword_takeoff_enabled: false # ***********日志配置 ************* logging: level: "INFO" debug: false