Theo dõi cấp độ micrô bằng công cụ dòng lệnh trong Linux


17

Tôi đang tìm kiếm một công cụ sẽ cho tôi biết, trong chưa đầy nửa giây, nếu micrô phát ra bất kỳ âm thanh nào vượt quá ngưỡng nhất định. (Tôi dự định tắt tiếng kênh Master bằng một công cụ dòng lệnh khác, như amixer.)

Câu trả lời:


8

Giải pháp này sẽ tránh ghi liên tục vào đĩa và mặc dù trong trường hợp xấu nhất chỉ mất một giây thay vì mong muốn chưa đến nửa giây, tôi thấy nó đủ nhanh sau khi thử. Vì vậy, đây là hai kịch bản tôi sử dụng:

./phát hiện:

while true; do
    arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>\
    &1 | grep "Maximum amplitude" | cut -d ':' -f 2 | ./check.py
    if [ $? -eq 0 ] ; then
         amixer set Master 0
    else
         amixer set Master 80
    fi
done

./check.py:

#!/usr/bin/env python
import sys

number = 0.0
thing="NO"

line = sys.stdin.readline()
thing = line.strip()
number = float(thing)

if number < 0.15:
    raise Exception,"Below threshold"

Khó thanh lịch, nhưng nó hoạt động.

Lưu ý: Nếu bạn muốn một thứ dần dần, hãy thêm một cái gì đó như thế này:

   for i in `seq 0 80 | tac`; do
      amixer set Master $i
   done

để tắt tiếng và

   for i in `seq 0 80`; do
      amixer set Master $i
   done

để tắt tiếng.


7
Một giải pháp thanh lịch hơn một chút, hỗ trợ độ phân giải nửa giây và không yêu cầu tệp tạm thời: while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done
nandhp

1
Python hơi quá mức, math-blog.com/2012/07/23/ Kết quả = $ (AUDIODEV = hw: 1 rec -n stat trim 0 .5 2> & 1 | grep "Biên độ tối đa" | grep -o " [0-9] \. [0-9] * $ "); tiếng vang "$ kết quả> 0,01" | bc
kevinf

1
Chỉ cần lưu ý rằng 'Biên độ tối đa' không phải là chỉ báo duy nhất của âm thanh lớn. Một âm thanh có tần số cao (ví dụ như đeo kính) có thể được cảm nhận là rất to bằng tai người nhưng âm thanh '' Biên độ tối đa 'sẽ không khác biệt nhiều so với âm thấp nhất. Vì vậy, trong một số trường hợp, sẽ rất hợp lý khi phân tích 'Tần số thô'.
ka3ak

2

Chỉ là phiên bản không có tập lệnh python và TALKING_PERIOD, sẽ thiết lập bao nhiêu giây âm thanh sẽ ở mức DOWN_SOUND_PERC, sau đó chuyển sang cấp UP_SOUND_PERC.

#!/bin/bash

TALKING_PERIOD=16
UP_SOUND_PERC=65
DOWN_SOUND_PERC=45
counter=0
while true; do

echo "counter: " $counter

if [ "$counter" -eq 0 ]; then
    nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)

    echo "nmb: " $nmb

    if (( $(echo "$nmb > 0.3" |bc -l) )); then
        echo "ticho"
        amixer -D pulse sset Master 45%
        counter=$TALKING_PERIOD
    else
        echo "hlasno"
        amixer -D pulse sset Master 65%
    fi
fi

if [[ $counter -gt 0 ]]; then
        ((counter--))
fi

sleep 1

làm xong


0

Có một công cụ gọi là pavumeter cho phép bạn xem cấp độ micrô, Giao diện chụp mở của pavumeter,

Sau đó điều chỉnh mức âm thanh thu bằng pavucontrol, Trong pavucontrol, đi đến các thiết bị đầu vào và điều chỉnh độ nhạy của micrô.

Chỉnh sửa: Trong tập lệnh bash của R4v0, được thực hiện bên trong mã.

Edit2: Tôi muốn tăng âm lượng mỗi khi có tiếng ồn, vì vậy tôi chỉ chỉnh sửa nhiều hơn là ít hơn và hủy bỏ peroid nói chuyện

    if (( $(echo "$nmb < 0.3" |bc -l) )); then

5
"công cụ dòng lệnh"
deltaray

0

Tôi đã sửa đổi tập lệnh bash để tăng âm lượng theo mức độ tiếng ồn xung quanh.

Bạn có thể thay đổi minim_volume, Maximum_volume [giá trị tính bằng phần trăm].

To_Do: gia tăng chưa được thử nghiệm. sox và bc cần phải được cài đặt.

#!/bin/bash

minimum_volume=20
maximum_volume=60
increment=10

counter=0
while true; do

# echo "counter: " $counter


nmb=$(arecord -d 1 /dev/shm/tmp_rec.wav ; sox -t .wav /dev/shm/tmp_rec.wav -n stat 2>&1 | grep "Maximum amplitude" | cut -d ':' -f 2)
echo "nmb: " $nmb

    if (( $(echo "$nmb <= 0.1" |bc -l) )); then
    amixer -D pulse sset Master $minimum_volume%
    else 
        if (( $(echo "$nmb <= 0.2" |bc -l) )); then
        amixer -D pulse sset Master $(($minimum_volume+ $increment))%
        else
            if (( $(echo "$nmb <= 0.3" |bc -l) )); then
            amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment))%
                else
                    if (( $(echo "$nmb <= 0.4" |bc -l) & maximum_volume>=40)); then
                    amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment))%
                    else
                        if (( $(echo "$nmb <= 0.5" |bc -l) & maximum_volume>=50)); then
                        amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment))%
                        else
                            if (( $(echo "$nmb <= 0.6" |bc -l) & maximum_volume>=60)); then
                            amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment))%  
                            else
                                if (( $(echo "$nmb <= 0.7" |bc -l) & maximum_volume>=70)); then
                                amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                else
                                    if (( $(echo "$nmb <= 0.8" |bc -l) & maximum_volume>=80)); then
                                    amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                    else
                                        if (( $(echo "$nmb <= 0.9" |bc -l) & maximum_volume>=90)); then
                                        amixer -D pulse sset Master $(($minimum_volume+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment+ $increment))%
                                        else
                                            amixer -D pulse sset Master $(($maximum_volume+ $minimum_volume))%
                                        fi
                                    fi
                                fi
                            fi
                        fi
                    fi
                fi
            fi
        fi

sleep 1
done

Và đặt cuối dòng trong trình chỉnh sửa mã của bạn thành unix.
haytham-med haytham

Tôi có thể sử dụng điều này để 1. nghe mức độ tiếng ồn, 2. 'fade' khi phát tệp âm thanh, 3. hết thời gian sau x phút, 4. 'fade' ra và dừng âm thanh, 5. nếu mức độ tiếng ồn gặp lại tiếp tục từ điểm trước trong tập tin âm thanh nói? Chức năng mờ dần trong mờ dần không quan trọng bằng phần tiếp tục đối với tôi. Điều này sẽ dễ thực hiện? Tôi đang cố gắng tìm ra cách tạo một bộ tạo tiếng ồn trắng tự động bằng cách sử dụng bash và các tiện ích tiêu chuẩn nếu có thể. Tôi gần như đã tạo bài đăng của riêng mình nhưng điều này dường như là một phần của giải pháp tôi đang tìm kiếm.
BasicObject
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.