2016-01-22 16 views
6

Đầu tiên tôi sẽ mô tả vấn đề của mình, tôi đang tạo danh sách phát tự động từ các bài hát ngẫu nhiên, một số bài hát có 10-15 giây im lặng ở cuối bài hát, những gì tôi đang cố gắng đạt được là phát hiện máy phân tích khi bài hát đã im lặng trong 5 giây và hành động.Làm cách nào tôi có thể sử dụng máy phân tích được tạo từ audioContext để phát hiện xem âm thanh phát có thể nghe được không?

Cho đến nay tôi đã nhận điều này:

var context, analyser, source, audio; 
context = new (window.AudioContext || window.webkitAudioContext)(); 
analyser = context.createAnalyser(); 
audio = new Audio(); 

source = context.createMediaElementSource(audio) 
source.connect(analyser); 
analyser.connect(context.destination); 

var playNext = function() { 
    var pickedSong; 
    // chooses a song from an api with several 
    // thousands of songs and store it in pickedSong 
    audio.src = pickedSong; 
    audio.play(); 
} 

audio.addEventListener('ended', playNext); 

playNext(); 

Tôi biết câu trả lời là ở đâu đó trong phân tích nhưng tôi đã không tìm thấy bất kỳ sự gắn kết trong dữ liệu trả về từ It.

tôi có thể làm một cái gì đó như thế này:

var frequencies = new Float32Array(analyser.frequencyBinCount); 
analyser.getFloatFrequencyData(frequencies); 

và tần số var sẽ chứa 2048 phím đều có một ngẫu nhiên (với tôi) số (-48,11, -55, -67, vv ...) , làm những con số này có nghĩa là bất cứ điều gì liên quan đến âm thanh cảm nhận được chơi ?, làm thế nào tôi có thể phát hiện nếu nó đủ thấp mà mọi người sẽ nghĩ rằng không có gì đang chơi.

Đối với việc phát hiện tôi chủ yếu là muốn một cái gì đó như thế này:

var isInSilence = function(){ 
    return !audible; 
} 

var tries = 0; 

var checker = function() { 
    tries = isInSilence() ? tries + 1 : 0; 
    if(tries >= 5) playNext(); 
    setTimeout(checker, 1000); 
} 

checker(); 

Phần duy nhất còn thiếu là phát hiện nếu bài hát hiện đang im lặng hay không, bất kỳ trợ giúp sẽ được đánh giá cao.

Edit:

dựa trên câu trả lời william của tôi quản lý để giải quyết nó bằng cách thực hiện nó theo cách này:

var context, compressor, gain, source, audio; 
context = new (window.AudioContext || window.webkitAudioContext)(); 
compressor = context.createDynamicsCompressor(); 
gain = context.createGain(); 
audio = new Audio(); 

source = context.createMediaElementSource(audio) 

// Connecting source directly 
source.connect(context.destination); 

// Connecting source the the compresor -> muted gain 
source.connect(compressor); 
compressor.connect(gain); 
gain.connect(context.destination); 

gain.gain.value = 0; // muting the gain 
compressor.threshold.value = -100; 

var playNext = function() { 
    var pickedSong; 
    // chooses a song from an api with several 
    // thousands of songs and store it in pickedSong 
    audio.src = pickedSong; 
    audio.play(); 
} 

audio.addEventListener('ended', playNext); 

playNext(); 

var isInSilence = function(){ 
    return compressor.reduction.value >= -50; 
} 

var tries = 0; 

var checker = function() { 
    tries = isInSilence() ? tries + 1 : 0; 
    if(tries >= 5) playNext(); 
    setTimeout(checker, 1000); 
} 

checker(); 
+0

Bạn có thể sử dụng ctx.source.stop (0) hoặc một cái gì đó như thế – Akxe

+0

context.source là không xác định –

+0

Bạn có thể thử http://toys.eise.cz/Equaliser, có chức năng dừng, điều đó sẽ dừng nhạc cố gắng tìm nó ở đó nếu bạn thất bại Tôi sẽ cố gắng để có được nó bản thân mình – Akxe

Trả lời

4

Đây là một giải pháp có thể sử dụng một cách tiếp cận khác nhau - nút nén. Đó là mô tả ngắn gọn nhưng phải đủ để cho phép bạn điền chi tiết cho trường hợp sử dụng của bạn:

Tạo nút máy nén và kết nối nguồn vào của bạn với nó. Sau đó kết nối máy nén với nút tăng và tắt nút tăng (đặt thành 0). Kết nối nút tăng tới số audioContext.destination

Lấy nguồn đầu vào của bạn và kết nối với audioContext.destination.

Đặt giá trị thuộc tính của máy nén để phát hiện tín hiệu (để nó kích hoạt giá trị giảm).

Wrap compressor.reduction.value trong setInterval hoặc requestAnimationFrame để kiểm tra các thay đổi.

Mã logic cần thiết để thực hiện bất kỳ điều gì bạn muốn khi giá trị này thay đổi (hoặc không thay đổi).

+0

tắt tiếng tăng âm thanh đích, còn giá trị giảm compresion đo lượng giảm được thực hiện với máy nén chứ không phải chính bản thân âm thanh, tui bỏ lỡ điều gì vậy? –

+0

Tắt âm thanh trong trường hợp này tắt âm thanh đi qua máy nén nhưng điều này là mong muốn vì trong trường hợp này bạn không muốn nghe âm thanh bị ảnh hưởng bởi máy nén, bạn chỉ sử dụng máy nén làm công cụ để phát hiện tín hiệu . Bạn sẽ vẫn nghe thấy âm thanh ban đầu bởi vì nó được kết nối với bối cảnh âm thanh trực tiếp.Bạn đang phải rằng máy nén không "đo chính âm thanh" nhưng bạn vẫn có thể sử dụng nó để phát hiện xem biên độ tín hiệu có vượt quá hay thấp hơn một ngưỡng mà bạn muốn. – William

+0

vì vậy tôi nên kết nối âm thanh đến đích trực tiếp và sau đó cũng kết nối nó với máy nén để đo? –

1

Để tham khảo trong tương lai - các giá trị mà trình phân tích trả về cho getFloatFrequencyValues ​​là decibels của tín hiệu cụ thể đó - vì vậy "0" sẽ là một tín hiệu giả định đầy đủ, "-96" thấp hơn phạm vi động bình thường cho con người.

Có thể dễ dàng hơn cho bạn khi chỉ sử dụng getByteFrequencyValues, trước khi đưa các giá trị vào 0-255; 0 là một sàn tiếng ồn hợp lý. Nếu bạn đang tìm kiếm sự im lặng thực sự, chỉ cần tìm số không trong tất cả các thùng phân tích - nếu bạn đang tìm kiếm tín hiệu yên tĩnh, giá trị mặc định -100 cho minDecibels có thể quá thấp, vì vậy hãy tìm số thấp (10 trở xuống ? Bạn phải thử nghiệm). Hoặc thay đổi minDecibels - xem spec.

Các vấn đề liên quan