2026-04-14 09:59:51 +08:00

247 lines
12 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ***********音频采集配置 *************
audio:
sample_rate: 16000
channels: 1
sample_width: 2
frame_size: 1024
audio_format: "wav"
# 麦克风:仅使用 input_device_indexPyAudio 整数。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 时,用立体声打开再下混为 monoOrange 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.250.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_raterecognizer.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.onnxuint8 有时更慢(取决于 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_samplerateWindows/WASAPI 下 24000Hz 常无声,强烈建议 true
playback_resample_to_device_native: true
# 播放前将峰值压到约 0.92,减轻削波导致的爆音/杂音
playback_peak_normalize: true
# 播放音量增益波形幅度乘法1.0 不变1.31.8 更响,过大可能削波失真)
playback_gain: 2.5
# 首尾淡入淡出(毫秒),减轻驱动/缓冲区切换时的爆音与「咔哒」声
playback_edge_fade_ms: 8
# sounddevice OutputStream 延迟: low / medium / highhigh 易积缓冲,部分机器听感发闷或拖尾)
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.750.82;设 0 则关闭相对判据(只靠 rms_low + 尾静音)
energy_vad_end_peak_ratio: 0.80
# 每音频块后对句内峰值衰减系数0.950.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_appTakeoffPrintRecognizer*************
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