마이크 모니터링 및 필터링된 클립 저장

마이크 모니터링 및 필터링된 클립 저장

다음 스크립트를 사용하여 마이크를 모니터링합니다.

while true; do
    printf "$(AUDIODEV=hw:2,0 rec -n stat trim 0 1 2>&1 |
        awk 'BEGIN { ORS="" } /^Maximum amplitude/ { print "Max. amplitude: "$3} 
             /^Rough\s+frequency/ { print " Frequency: "$3} 
             /^Maximum\s+delta/ { print " Max. delta: "$3}')\r";
done

1초 길이의 세그먼트를 기록하고 표준 출력에서 Maximum amplitude​​합계 값을 추출하여 인쇄합니다.Rough frequencysox

세그먼트 수나 빈도가 특정 임계값보다 큰 경우 파일로 저장할 수 있나요? 각 세그먼트를 저장한 다음 분석할 수 있다는 것을 알고 있지만 쓰기가 너무 많아 피하고 싶습니다.

답변1

그러던 중 해결책을 찾았습니다. 이는 recPython의 출력을 파이핑하여 base64ASCII로 인코딩하고 bash 변수에 저장할 수 있도록 하는 것을 기반으로 합니다 . 세그먼트 수와 빈도를 분석할 때가 되면 base --decode가변 콘텐츠를 실행하겠습니다. 아래 스크립트에서는 볼륨만 분석됩니다. 임계값(0.6)을 초과하면 handleExcess해당 세그먼트가 호출되어 저장됩니다. 또한 클립 길이를 5초로 늘렸습니다.

handleExcess() {
    echo "$1" | base64 --decode > /tmp/"$2".wav
}

VOLUME="";

while true; do
    AUDIO_DATA="$(AUDIODEV=hw:0,0 rec -c 1 -t wav - trim 0 5 2> /dev/null | base64)";
    declare $(echo "$AUDIO_DATA" | base64 --decode | sox - -n stat 2>&1 | awk 'BEGIN { ORS="" } /^Maximum amplitude/ { print "VOLUME="$3 }');

    if [ $(echo "$VOLUME > 0.6" | bc) == 1 ]; then
        AUDIO_DATA_TMP="$AUDIO_DATA";
        handleExcess "$AUDIO_DATA_TMP" "$VOLUME""_""$(date +%s)" &
    fi
done

관련 정보