Page 1 of 1

yolov5实时检测+扬声器

Posted: 2024-07-30 1:36
by JokerY
求助大佬!我按照文档已经顺利将自训练模型参考luckfox_pico_rtsp_yolov5例程部署成功,通过摄像头和vlc可以查看目标检测结果。
现在想加入扬声器部分,实现目标检测+提示。
实现效果:扬声器在识别到特定物体后,播放指定的.wav音频。
目前进展:我写了一个.sh脚本,运行后检测和播放音频都可以实现,但是感觉延迟很明显,出现以下三种情况:1、画面出现了特定物体的画面音频迟迟没有播放;2、画面已经切换为其它画面,但是音频仍在循环播放;3、终端提示音频设备被占用。
脚本如下:

Code: Select all

#!/bin/bash  
  
# 初始化计数器  
apple_count=0  
# 用于存储aplay进程的PID数组  
aplay_pids=()  
  
# 启动 luckfox_rtsp_yolov5 并捕获其输出  
./luckfox_rtsp_yolov5 | while read line; do  
    # 检查行中是否包含"apple"  
    if [[ $line == *"apple"* ]]; then  
        ((apple_count++))  
  
        # 如果连续计数达到5,则播放音频并重置计数器  
        if [[ $apple_count -eq 5 ]]; then  
            # 播放音频并放到后台运行,同时获取进程ID  
            aplay -D plug:hw:0 Ding.wav &  
            # 将aplay进程的PID添加到数组中  
            aplay_pids+=($!)  
            # 等待音频播放结束(根据音频长度调整等待时间)  
            sleep 2  
            # 重置计数器  
            apple_count=0  
        fi  
    elif [[ $line == *"orange"* ]]; then  
        # 如果行中包含"orange",则重置计数器,并杀死所有aplay进程  
        apple_count=0  
        kill_aplay_processes  
    else  
        # 如果行中不包含"apple",则重置计数器  
        apple_count=0  
    fi  
done  
  
# 定义一个函数来杀死所有aplay进程  
kill_aplay_processes() {  
    for pid in "${aplay_pids[@]}"; do  
        kill $pid  
    done  
    # 清空aplay进程PID数组  
    aplay_pids=()  
}  
求助大佬,望不吝赐教!

Re: yolov5实时检测+扬声器

Posted: 2024-07-30 2:14
by Crocodile
您好,aplay在播放音频前都需要进行初始化,根据您的源码来看会如果同时触发多次会导致多个aplay进程占用音频设备导致报错,同时延迟较高,推荐学习一下ffmpeg库的api用代码创建一个音频专用的进程,通过进程间通讯来获取识别结果