247 lines
12 KiB
YAML
247 lines
12 KiB
YAML
# ***********音频采集配置 *************
|
||
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
|
||
|
||
|
||
|