猫叫声识别:嵌入式离线猫叫声检测与宠物健康

猫叫识别的价值(场景、流程)

猫是少数会主动"对人说话"的宠物:饥饿时的短促喵叫、压力或发情期的长嚎、清晨的"叫早服务"。对宠物产品来说,猫叫识别让设备从"看得见宠物"升级为"听得懂宠物"------而麦克风本就是这些设备的出厂标配,识别在本地离线完成,不用把音频上传到云端。

场景族:宠物看护摄像头、智能喂食器与猫砂盆、寄养机构多笼位监测,以及快速增长的一类组合场景------宠婴同室家庭,猫叫与哭声两个模型成对工作。

图:摄像头、喂食器与多区域监测共用一套引擎

猫叫的特点------与最被低估的难点

图:滑音结构 vs 哭声谐波 vs 高频啄式脉冲

一条真实猫叫的波形图与梅尔频谱图,可以看到短促爆发与中频滑音:

图:真实猫叫示例:波形(上)+ 梅尔频谱(下)

试听素材(真实样本,点击播放):

🔊 音频试听:真实猫叫样本
🔊 音频试听:婴儿哭声------对比试听两者的相似度

  • 喵叫:明显的"先升后降"滑音结构,单次 0.3--1 秒
  • 嚎叫:更长更响,压力/发情期成段出现
  • 与鸟叫(高频啄式脉冲)、犬吠(更低的中频成串爆发)区分明显

最被低估的难点:猫叫与婴儿哭声在频谱上高度接近 ------中频集中、带明显基频滑动、谐波丰富。通用音频模型经常把两者弄混:婴儿监视器把猫叫误报成哭声,宠物摄像头又把哭声当作猫叫。因此猫叫识别必须做双向专项区分------这也正是"猫叫 + 哭声"组合方案在宠婴家庭中成立的原因。

识别方法:预处理 → 特征提取 → 算法

  1. 以事件为单位------逐次输出叫唤段的起止时间与强度,而不是对每帧单独判断
  2. 滑音特征验证------喵叫的基频滑动轮廓,是区别于稳态声音的独特证据
  3. 与哭声、人声专项区分------双向负样本训练,降低两个方向的互相误报

图:采集、处理、引擎、输出、应用

独处看护业务流程

图:监测、事件检测、活跃统计、阈值推送与行为日报

主人外出或夜间:事件检测 → 活跃度统计(次数/时长/时段)→ 超过关注阈值则即时推送(含实时画面),否则记录到行为日报。长期数据自然呈现晨/昏活跃规律。

从叫唤数据到健康洞察

单次叫唤是事件,长期数据是信号。长期叫唤模式构成一份个人健康档案------它不是医疗器械,而是一份能提前发现趋势的行为参考。

图:4 周基线与偏离检测(示意)

行为基线 :最初 1--2 周系统学习这只猫的个人基线------日均叫唤次数、活跃时段、典型叫声时长。之后偏离才有意义:持续高于基线(如翻倍)、夜间偏离晨昏规律、异常拉长的叫唤。核心原则:单日波动属正常,持续偏离才是信号。

图:叫唤、进食、如厕三条趋势(示意)

多指标联合:单一指标可能充满噪声;报告把叫唤、进食、如厕三条数据流联合------多个指标在同一时间窗内同向偏离,才更值得关注。

图:幼猫、成年、老年的叫唤模式(示意)

生命阶段:幼猫高频短促;成年猫规律稳定、基线清晰;老年猫夜间长叫可能增多------关注趋势,明显时咨询兽医。

图:从日常采集到分级提醒与长期档案

分级响应:日常采集 → 基线学习 → 偏差检测 → 分级提醒(提示 / 建议观察 / 建议咨询兽医)→ 用户行动 → 长期档案。定位说明:这是行为分析与照护参考工具,不构成医疗诊断;出现持续异常时,请结合日常观察并咨询专业兽医。

图:周报界面与四个阅读要点

设备形态与集成

图:摄像头、喂食器、猫砂盆、寄养机构

摄像头侧重低延迟推送;喂食器侧重低功耗与电机噪声鲁棒;猫砂盆强调自身噪声下的稳定检测;寄养机构需要多路并发------它们共用同一套 SDK。

图:四维评估框架

评估沿四个维度:识别能力(准确率、误报、与哭声区分)、资源占用(0.2--1MB INT8、CPU <50MHz)、平台兼容(ARM/MIPS/x86_64、NPU 预适配)、工程支持(示例、集成周期、授权、OTA)。

图:各设备本地检测,事件汇总到用户 APP

多设备各自本地检测,事件与统计共享,用户 APP 统一查看------全部推理仍在设备端完成。

准确率与性能

项目 指标
准确率 95.5%
误报率 <2%
模型大小 0.2--1MB(INT8)
推理延迟 灵活可调(视平台资源)
采样率 16kHz
支持平台 ARM Linux / MIPS / x86_64;SVP / Magik 预适配

注:文中性能指标基于内部测试环境,实际表现取决于硬件配置与使用场景。

运行平台与硬件要求

从 100MHz 主频级芯片起步;与设备主业务共享 SoC 资源;电池供电的喂食器与猫砂盆可由低功耗事件架构支撑。

C 接口与嵌入式集成

「猫叫声」识别库提供简洁的流式 C 接口:调用方只需持续送入 16kHz 单声道 PCM,拼帧、Mel 预处理与模型推理全部在内部完成,帧级概率经报警策略聚合成「猫叫事件」回调输出。

完整接口声明(cat_detect.h):

c 复制代码
/**
 * cat_detect.h --- 猫叫声识别统一接口
 *
 * 封装 Mel 预处理 + 推理引擎 + 报警策略, 内部模型消费线程处理音频。
 * 与录音模块 (audio_capture.h) 相互独立: 调用者自行决定音频来源
 * (录音回调 / wav 文件 / 网络流), 通过 cat_detect_feed 送入, 数据任意大小。
 *
 * 用法 (实时录音模式):
 *   cat_detect_t *d = cat_detect_create(mgk_path, NULL, NULL);
 *   cat_detect_set_listener(d, on_frame, on_onset, on_offset, NULL);
 *   cat_detect_start(d);                          // 启动内部模型消费线程
 *   audio_capture_start(rec, capture_cb, d);        // 录音回调里调 cat_detect_feed
 *   ...
 *   cat_detect_stop(d);                           // 排空缓冲, 停止线程
 *   cat_detect_destroy(d);
 *
 * 用法 (wav 文件模式):
 *   cat_detect_t *d = cat_detect_create(mgk_path, NULL, NULL);
 *   cat_detect_set_listener(d, on_frame, on_onset, on_offset, NULL);
 *   cat_detect_start(d);
 *   循环读文件: cat_detect_feed(d, pcm, n);       // 任意数据大小
 *   cat_detect_stop(d);
 *   cat_detect_destroy(d);
 */

#ifndef CAT_DETECT_H
#define CAT_DETECT_H

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* 识别事件 (报警策略输出, 用于事件结束回调) */
typedef struct {
    float start_time;       /* 事件开始时间 (秒) */
    float end_time;         /* 事件结束时间 (秒) */
    float confidence;       /* 事件置信度 */
    float max_confidence;   /* 事件内最大帧置信度 */
    int   frame_count;      /* 事件持续帧数 */
} cat_detect_event_t;

/* 帧级回调: 每帧识别结果 (模型线程内执行) */
typedef void (*cat_detect_frame_cb_t)(float cat_prob, float timestamp,
                                        void *user_data);

/* 事件开始回调: 策略判定猫叫事件开始, 只有开始时间 */
typedef void (*cat_detect_onset_cb_t)(float start_time, void *user_data);

/* 事件结束回调: 策略判定猫叫事件结束 (或停止识别时未结束的事件), 完整事件信息 */
typedef void (*cat_detect_offset_cb_t)(const cat_detect_event_t *event,
                                         void *user_data);

typedef struct cat_detect_s cat_detect_t;

/* 创建/销毁; alarm_name/alarm_params 可传 NULL (用默认策略及参数) */
cat_detect_t *cat_detect_create(const char *mgk_path,      /* 模型文件路径 (必填) */
                                    const char *alarm_name,    /* 报警策略名, NULL=默认 */
                                    const char *alarm_params); /* 策略参数 key=val,key=val, NULL=默认 */
void cat_detect_destroy(cat_detect_t *det);

/* 设置事件回调 (create 后调用, 也可在运行中调整); 不需要的回调传 NULL */
void cat_detect_set_listener(cat_detect_t *det,
                               cat_detect_frame_cb_t  on_frame,
                               cat_detect_onset_cb_t  on_onset,
                               cat_detect_offset_cb_t on_offset,
                               void *user_data);

/* 启动/停止识别: 启动内部模型消费线程 / 排空缓冲后停止线程 */
int  cat_detect_start(cat_detect_t *det);
void cat_detect_stop(cat_detect_t *det);
int  cat_detect_is_running(cat_detect_t *det);

/* 设置事件识别策略 (可在运行中调整) */
int cat_detect_set_alarm(cat_detect_t *det, const char *alarm_name,
                           const char *alarm_params);

/* 送入 PCM 数据 (16bit 单声道 16kHz), 线程安全, 任意数据大小 */
int cat_detect_feed(cat_detect_t *det, const int16_t *pcm, int num_samples);

#ifdef __cplusplus
}
#endif

#endif /* CAT_DETECT_H */

最简 wav 推理示例(节选,完整文件位于 SDK 的 src/catDetect/c/cat_demo.c):

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "cat_detect.h"

#define DEFAULT_MGK  "cat_detect.mgk"  /* 模型文件 */
#define DEFAULT_WAV  "test_cat.wav"       /* 16kHz 单声道 16bit PCM */
#define FEED_CHUNK   16000                  /* 每次送入 1 秒音频 */

/* 帧级回调: 每帧输出猫叫声概率 (约 1 秒一帧) */
static void on_frame(float cat_prob, float timestamp, void *user_data)
{
    (void)user_data;
    printf("%8.2fs  cat=%.4f\\n", timestamp, cat_prob);
}

/* 事件开始回调: 策略判定猫叫事件开始 */
static void on_onset(float start_time, void *user_data)
{
    (void)user_data;
    printf("[EVENT] cat start at %.2fs\\n", start_time);
}

/* 事件结束回调: 应用层可据此做后续统计或分级响应 */
static void on_offset(const cat_detect_event_t *ev, void *user_data)
{
    (void)user_data;
    printf("[EVENT] cat end at %.2fs (dur=%.2fs, conf=%.3f, frames=%d)\\n",
           ev->end_time, ev->end_time - ev->start_time,
           ev->confidence, ev->frame_count);
}

static int read_wav_pcm(const char *path, int16_t **pcm, int *n, int *sr);  /* 完整实现见源文件 */

int main(void)
{
    cat_detect_t *det;
    int16_t *pcm = NULL;
    int num_samples = 0, sample_rate = 0;
    int pos;

    if (read_wav_pcm(DEFAULT_WAV, &pcm, &num_samples, &sample_rate) != 0)
        return 1;

    /* 1. 创建识别器: 模型文件 + 默认报警策略 (NULL) */
    det = cat_detect_create(DEFAULT_MGK, NULL, NULL);
    if (!det) return 1;

    /* 2. 注册回调 (均为可选) */
    cat_detect_set_listener(det, on_frame, on_onset, on_offset, NULL);

    /* 3. 启动内部模型消费线程 */
    cat_detect_start(det);

    /* 4. 分块送入 PCM; 实时录音时改在录音回调里 feed */
    for (pos = 0; pos < num_samples; pos += FEED_CHUNK) {
        int n = num_samples - pos;
        if (n > FEED_CHUNK) n = FEED_CHUNK;
        cat_detect_feed(det, pcm + pos, n);
    }

    /* 5. 停止并销毁 */
    cat_detect_stop(det);
    cat_detect_destroy(det);
    free(pcm);
    return 0;
}

编译与运行(示例):

bash 复制代码
$(CC) cat_demo.c -I. -L. -lcatdetect -lpthread -lm -o cat_demo
./cat_demo

结语

猫叫识别让宠物设备从"玩具"变成"照护伙伴"------既听懂猫咪此刻在表达什么,也看得见长期趋势。它还能和同一台设备上的哭声检测互不干扰,宠婴场景尤其用得上。


在线验证 :上传自己的录音,在线猫叫识别测试

代码下载 :gitee下载,github下载

其它声音处理方面程序:

哭声识别:

面向边缘设备的离线嵌入式哭声检测

鼾声识别:嵌入式离线鼾声检测 SDK 与睡眠健康数据

狗叫声识别:嵌入式离线犬吠检测 SDK 与分级告警

相关推荐
码流子1 小时前
高速公路视频AI分析,算力该放哪:边缘、中心还是云边协同?
大数据·数据库·人工智能·物联网·音视频
企业数字化笔记1 小时前
AI视频成片怎样做到可追溯?用镜头清单、文件哈希和字幕时间轴复盘交付
人工智能·音视频·哈希算法
TechVoyager_824614 小时前
多形态输入与12 通道音频:IT6615 这颗 HDMI 发射器的接口宽度
音视频·音频芯片·芯片选型·视频发射
Raymond168814 小时前
AI配音工具长文本合成架构技术解析:全局音色锚定与声学状态跟踪
人工智能·架构·实时互动·视觉检测·音视频·语音识别
hflmwl820 小时前
Wise Data Recovery找回误删的文档照片音乐和视频
音视频·datarecovery·找回误删的文档照片音乐和视频·找回误删的文档照片音乐视频
技灵AI21 小时前
AI 视频转场提示词怎么写?让前后画面衔接更自然
人工智能·prompt·aigc·音视频
youandyouyou1 天前
跨区培训的屏幕共享怎么做才稳?同屏同步与弱网优化实践
音视频·网络通信
开开心心就好1 天前
课堂随机点名工具,绿色版免安装双击即用
java·服务器·前端·ffmpeg·音视频·perl·symfony
美狐美颜SDK开放平台1 天前
直播APP集成美颜SDK,如何梳理第三方组件的数据权限?
开发语言·人工智能·深度学习·音视频·第三方美颜sdk