Làm cách nào để tự động điều chỉnh âm lượng theo âm thanh xung quanh tôi?


8

Tôi sống bên cạnh một con đường lớn. Có cửa sổ mở vào ban đêm là mát mẻ và, không liên tục, rất lớn. Làm cách nào tôi có thể điều chỉnh âm lượng tự động, dựa trên đầu vào micrô tích hợp? Nếu tôi đặt âm lượng để tôi có thể nghe thấy lời nói trong một bộ phim khi xe hơi đi qua, nó sẽ rất to vào những lúc khác và nó cảm thấy rất đáng ghét đối với những người gần đó (bên ngoài và hàng xóm).

Hệ thống của tôi là Debian Buster, mặc dù tôi có thể có một giải pháp chung để làm việc. Nếu không có gói nào thực hiện được điều này, một lệnh trích xuất âm lượng từ micrô mặc định sẽ hữu ích cho kịch bản này.


1
Bạn có thể sử dụng soxđể tính toán độ ồn trung bình (IIRC có một câu hỏi khác trên stackexchange về điều này) và pacmdđể thay đổi âm lượng cho Pulseaudio.
dirkt

1
@dirkt Cảm ơn các con trỏ! Tôi đã tìm thấy câu hỏi này, tôi sẽ cố gắng thực hiện nó vào ngày mai và báo cáo lại (có lẽ tôi có thể trả lời câu hỏi của riêng mình): superuser.com/questions/306701/ trộm
Luc

Câu trả lời:


2

Tôi đã tạo một kịch bản Python để thực hiện công việc. Một vấn đề còn lại là micro của máy tính xách tay của tôi, tất nhiên, cũng sẽ tự nhận loa. Tôi nghĩ rằng 'hủy bỏ tiếng vang' có thể là điều tôi đang tìm kiếm, nhưng tôi không biết làm thế nào để tự thực hiện điều đó. Sử dụng micro ngoài có thể hoạt động mặc dù.

Đó là python 2 do sự python-alsaaudiophụ thuộc, không may.

#!/usr/bin/env python

''' For noise cancellation:
$ pactl load-module module-echo-cancel
$ PULSE_PROP="filter.want=echo-cancel" ./this-script.py
'''

''' SETTINGS (you might want to keep presets for music and speech) '''
smoothing = 15 # Over how many samples should we compute?
step_size = 1 # maximum volume adjustment in percent points
# scale_xxx = (n, level) # At mic level n, scale to level% audio volume
scale_min = (4, 39)
scale_max = (19, 53)

''' CREDITS
https://stackoverflow.com/a/1937058
How get sound input from microphone in python, and process it on the fly?
Answer by jbochi

https://stackoverflow.com/a/10739764
How to programmatically change volume in Ubuntu
Answer by mata
'''

import alsaaudio, audioop, sys, os

bucket = [None for i in range(smoothing)]

inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE)

inp.setchannels(1)
inp.setrate(8000)
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)

inp.setperiodsize(200)

print('Setting volume to minimum ({}%)'.format(scale_min[1]))
os.system('pactl set-sink-volume 0 {}%'.format(scale_min[1]))

i = 1
last_volume = scale_min[1]
while True:
    l, data = inp.read()
    if l:
        val = audioop.max(data, 2)
        bucket[i % smoothing] = val

        if i % smoothing == 0:
            m = min(bucket)
            miclvl = float(m) / 50.0

            if miclvl < scale_min[0]:
                scale = scale_min[1]
            elif miclvl > scale_max[0]:
                scale = scale_max[1]
            else:
                miclvl_range = scale_max[0] - scale_min[0]
                level_range = scale_max[1] - scale_min[1]
                scale = (miclvl - scale_min[0]) / miclvl_range * level_range + scale_min[1]

            scale = int(round(scale))
            step = max(min(scale - last_volume, step_size), -step_size)

            if step != 0:
                last_volume += step
                step = '+' + str(step) if step > 0 else str(step)
                os.system('pactl set-sink-volume 0 {}%'.format(step))

            miclvl = round(miclvl, 1)
            miclvlpacing = ' ' * (4 - len(str(miclvl)))
            stepspacing = ' ' * (2 - len(str(step)))
            sys.stdout.write('mic lvl {}{}  ideal scale {}%  adjust {}{}  now {}  '.format(
                miclvl, miclvlpacing, str(scale), step, stepspacing, last_volume))
            print(int(round(last_volume - scale_min[1])) * 'x')

        i += 1

1
Pulseaudio có thể thực hiện khử tiếng vang ở một mức độ nào đó, xem ví dụ ở đâyđây , google để biết thêm. Nếu bạn muốn tự làm, bạn phải trừ tín hiệu đầu ra khỏi tín hiệu đầu vào, trễ thời gian và với biên độ phù hợp. Tự động tìm hai tham số đó là phần thú vị. :-) (Google "tương quan")
dirkt

@dirkt Cảm ơn một lần nữa! Pulseaudio dường như không hoạt động rất tốt, mặc dù; đặc biệt là ở mức âm lượng cao hơn (> 50%), nó chỉ bị hỏng, tự phát hiện và tiếp tục tăng. Tôi sẽ phải đi lấy mic, dù sao thì chúng cũng không đắt lắm :)
Luc
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.