আমি এমন একটি সরঞ্জাম খুঁজছি যা আমাকে বলবে, অর্ধ সেকেন্ডেরও কম সময়ে, যদি মাইক্রোফোন একটি নির্দিষ্ট প্রান্তিকের উপরে কোনও শব্দ তুলছে। (আমি তখন অ্যামিক্সারের মতো আরেকটি কমান্ড লাইন সরঞ্জাম দিয়ে মাস্টার চ্যানেলকে নিঃশব্দ করার পরিকল্পনা করছি))
আমি এমন একটি সরঞ্জাম খুঁজছি যা আমাকে বলবে, অর্ধ সেকেন্ডেরও কম সময়ে, যদি মাইক্রোফোন একটি নির্দিষ্ট প্রান্তিকের উপরে কোনও শব্দ তুলছে। (আমি তখন অ্যামিক্সারের মতো আরেকটি কমান্ড লাইন সরঞ্জাম দিয়ে মাস্টার চ্যানেলকে নিঃশব্দ করার পরিকল্পনা করছি))
উত্তর:
এই সমাধানটি বার বার ডিস্কে লেখা এড়াতে পারবে, এবং যদিও এটি সবচেয়ে খারাপ ক্ষেত্রে কাঙ্ক্ষিত অর্ধেক সেকেন্ডের চেয়ে এক সেকেন্ড সময় নেয়, আমি এটি চেষ্টা করার পরেও যথেষ্ট দ্রুত পেয়েছি। সুতরাং, আমি যে দুটি স্ক্রিপ্ট ব্যবহার করি তা এখানে:
./detect:
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"
হার্ড মার্জিত, কিন্তু এটি কার্যকর।
দ্রষ্টব্য: আপনি যদি আরও ধীরে ধীরে জিনিস চান তবে এর মতো কিছু যুক্ত করুন:
for i in `seq 0 80 | tac`; do
amixer set Master $i
done
নিঃশব্দ করার জন্য এবং
for i in `seq 0 80`; do
amixer set Master $i
done
আনমুট করার জন্য।
পাইথন স্ক্রিপ্ট এবং TALKING_PERIOD ছাড়াই কেবল সংস্করণ, এটি DOWN_SOUND_PERC স্তরে কত সেকেন্ডে শব্দ হবে তা সেট আপ করে, তারপরে 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
সম্পন্ন
পাভুমিটার নামে একটি সরঞ্জাম রয়েছে যা আপনাকে মাইক্রোফোন স্তর দেখতে দেয়, পাভামিটারের ক্যাপচার ইন্টারফেসটি খুলুন,
তারপরে পাভুকন্ট্রোল ব্যবহার করে ক্যাপচার শব্দের স্তরটি সামঞ্জস্য করুন, পাভুকন্ট্রলে ইনপুট ডিভাইসে যান এবং মাইক্রোফোনের সংবেদনশীলতা সামঞ্জস্য করুন।
সম্পাদনা: R4v0 দ্বারা বাশ স্ক্রিপ্টে, কোডের অভ্যন্তরে সম্পন্ন হয়।
সম্পাদনা 2: আমি যখনই শব্দ করলাম তখনই আমি ভলিউম বাড়াতে চেয়েছিলাম, তাই আমি কেবল কথার চেয়ে কম হওয়ার চেয়ে বেশি সম্পাদনা করেছি
if (( $(echo "$nmb < 0.3" |bc -l) )); then
আশেপাশের শব্দ স্তর অনুযায়ী ভলিউম বাড়ানোর জন্য আমি বাশ স্ক্রিপ্টটি পরিবর্তন করেছি।
আপনি ন্যূনতম_ভলিউম পরিবর্তন করতে পারেন, সর্বোচ্চ_ভোলিউম [মান শতাংশে] আছে]
To_Do: বর্ধিতকরণ এখনও পরীক্ষা করা হয়নি। sox এবং বিসি ইনস্টল করা প্রয়োজন।
#!/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
while true; do amixer set Master $(rec -n stat trim 0 .5 2>&1 | awk '/^Maximum amplitude/ { print $3 < .15 ? 80 : 0 }'); done