Là một phần của một dự án nghiên cứu tại nhà, tôi đang cố gắng tìm cách giảm/chuyển đổi bài hát thành tiếng ồn giống như tín hiệu âm thanh (giai điệu cơ bản mà con người chúng ta cảm nhận khi chúng ta nghe một bài hát). Trước khi tôi tiến hành thêm nữa trong việc mô tả nỗ lực của mình về vấn đề này, tôi muốn đề cập đến rằng tôi hoàn toàn mới đối với phân tích âm thanh mặc dù tôi có nhiều kinh nghiệm về phân tích hình ảnh và video.Làm thế nào để chuyển đổi một ca khúc sân từ một thuật toán khai thác giai điệu để một tiếng ồn như tín hiệu âm thanh
Sau khi googling một chút, tôi đã tìm thấy một loạt các thuật toán trích xuất giai điệu. Với một tín hiệu âm thanh đa âm của một bài hát (ví dụ: .wav file), chúng xuất ra một nốt nhạc --- tại mỗi thời điểm, chúng ước tính sân trội (đến từ giọng ca sĩ hoặc một số công cụ tạo giai điệu) và theo dõi ưu thế quảng cáo chiêu hàng theo thời gian.
Tôi đã đọc một vài bài báo và dường như họ tính toán một thời gian ngắn biến đổi Fourier của bài hát, và sau đó thực hiện một số phân tích về quang phổ để nhận và theo dõi sân chính. Khai thác giai điệu chỉ là một thành phần trong hệ thống mà tôi đang cố gắng phát triển, vì vậy tôi không ngại sử dụng bất kỳ thuật toán nào có sẵn cho đến khi thực hiện một công việc tốt trên các tệp âm thanh của tôi và mã có sẵn. Vì tôi mới làm quen với điều này, tôi rất sẵn lòng nghe bất kỳ đề xuất nào về thuật toán nào được biết là hoạt động tốt và tôi có thể tìm mã của nó ở đâu.
tôi thấy hai thuật toán:
tôi đã chọn Melodia như kết quả trên các thể loại âm nhạc khác nhau trông khá ấn tượng. Vui lòng kiểm tra this to see its results. Sự ồn ào mà bạn nghe được đối với từng phần âm nhạc về cơ bản là những gì tôi quan tâm.
"Đây là thế hệ hài hước cho bất kỳ bài hát tùy ý nào mà tôi muốn bạn giúp đỡ trong câu hỏi này".
Thuật toán (có sẵn dưới dạng plugin vamp) xuất ra bản nhạc quảng cáo --- [time_stamp, pitch/frequency] --- ma trận Nx2 trong cột đầu tiên là dấu thời gian (tính bằng giây) và giây cột là mốc chính được phát hiện tại dấu thời gian tương ứng. Hiển thị dưới đây là hình ảnh của ca khúc được lấy từ thuật toán được phủ màu tím với tín hiệu miền thời gian của bài hát (ở trên) và nó phổ/ngắn-thời gian. Giá trị âm của quảng cáo chiêu hàng/tần suất thể hiện ước tính mức độ chi phối của thuật toán cho các phân đoạn không được lồng tiếng/không chuyển động. Vì vậy, tất cả các ước tính sân> = 0 tương ứng với giai điệu, phần còn lại không quan trọng đối với tôi.
Bây giờ tôi muốn chuyển đổi theo dõi sân này trở lại một ồn ào như tín hiệu âm thanh - giống như các tác giả có nó trên trang web của họ.
Dưới đây là một hàm MATLAB mà tôi đã viết để làm điều này:
function [melSignal] = melody2audio(melody, varargin)
% melSignal = melody2audio(melody, Fs, synthtype)
% melSignal = melody2audio(melody, Fs)
% melSignal = melody2audio(melody)
%
% Convert melody/pitch-track to a time-domain signal
%
% Inputs:
%
% melody - [time-stamp, dominant-frequency]
% an Nx2 matrix with time-stamp in the
% first column and the detected dominant
% frequency at corresponding time-stamp
% in the second column.
%
% synthtype - string to choose synthesis method
% passed to synth function in synth.m
% current choices are: 'fm', 'sine' or 'saw'
% default='fm'
%
% Fs - sampling frequency in Hz
% default = 44.1e3
%
% Output:
%
% melSignal -- time-domain representation of the
% melody. When you play this, you
% are supposed to hear a humming
% of the input melody/pitch-track
%
p = inputParser;
p.addRequired('melody', @isnumeric);
p.addParamValue('Fs', 44100, @(x) isnumeric(x) && isscalar(x));
p.addParamValue('synthtype', 'fm', @(x) ismember(x, {'fm', 'sine', 'saw'}));
p.addParamValue('amp', 60/127, @(x) isnumeric(x) && isscalar(x));
p.parse(melody, varargin{:});
parameters = p.Results;
% get parameter values
Fs = parameters.Fs;
synthtype = parameters.synthtype;
amp = parameters.amp;
% generate melody
numTimePoints = size(melody,1);
endtime = melody(end,1);
melSignal = zeros(1, ceil(endtime*Fs));
h = waitbar(0, 'Generating Melody Audio');
for i = 1:numTimePoints
% frequency
freq = max(0, melody(i,2));
% duration
if i > 1
n1 = floor(melody(i-1,1)*Fs)+1;
dur = melody(i,1) - melody(i-1,1);
else
n1 = 1;
dur = melody(i,1);
end
% synthesize/generate signal of given freq
sig = synth(freq, dur, amp, Fs, synthtype);
N = length(sig);
% augment note to whole signal
melSignal(n1:n1+N-1) = melSignal(n1:n1+N-1) + reshape(sig,1,[]);
% update status
waitbar(i/size(melody,1));
end
close(h);
end
Logic cơ bản đằng sau mã này là như sau: tại mỗi thời gian tem, tôi tổng hợp một làn sóng ngắn ngủi (nói một sin -wave) với tần số bằng tần số/tần số chi phối được phát hiện tại thời điểm đó trong một khoảng thời gian bằng khoảng trống của nó với dấu thời gian tiếp theo trong ma trận giai điệu đầu vào. Tôi chỉ tự hỏi liệu tôi có làm đúng không.
Sau đó, tôi lấy tín hiệu âm thanh tôi nhận được từ chức năng này và phát nó bằng bài hát gốc (giai điệu trên kênh bên trái và bài hát gốc trên kênh bên phải).Mặc dù tín hiệu âm thanh được tạo ra dường như phân đoạn các nguồn tạo giai điệu (voice/lead-intstrument) khá tốt - hoạt động của nó ở đó giọng nói và không ở mọi nơi khác --- bản thân tín hiệu không còn ồn ào nữa. beep beep beeeeep beep beeep beeeeeeeep) mà các tác giả hiển thị trên trang web của họ. Cụ thể, dưới đây là hình ảnh hiển thị tín hiệu miền thời gian của bài hát đầu vào ở dưới cùng và tín hiệu miền thời gian của giai điệu được tạo bằng chức năng của tôi.
Một vấn đề chính là - mặc dù tôi đang cho tần số của sóng để tạo ra tại mỗi thời gian tem và cũng là thời gian, tôi không biết làm thế nào để thiết lập biên độ của sóng. Bây giờ, tôi đặt biên độ là giá trị bằng phẳng/không đổi và tôi nghi ngờ đây là vấn đề.
Có ai có bất kỳ đề xuất nào về điều này không? Tôi hoan nghênh các đề xuất trong bất kỳ ngôn ngữ chương trình nào (tốt nhất là MATLAB, python, C++), nhưng tôi đoán câu hỏi của tôi ở đây là tổng quát hơn --- Làm thế nào để tạo ra sóng tại mỗi dấu thời gian?
Một vài ý tưởng/sửa chữa trong tâm trí tôi:
- Đặt biên độ bằng cách nhận một trung bình/ước tính tối đa của biên độ từ tín hiệu miền thời gian của bài hát gốc.
- Thay đổi hoàn toàn cách tiếp cận của tôi --- tính toán phép biến đổi phổ/thời gian ngắn của tín hiệu âm thanh của bài hát. cut-off hầu như không/zero-out hoặc nhẹ nhàng tất cả các tần số khác ngoại trừ những tần số trong ca khúc của tôi (hoặc gần với sân của tôi). Và sau đó tính toán phép biến đổi thời gian ngắn nghịch đảo nghịch đảo để nhận tín hiệu miền thời gian.
Bạn có thể tạo một midi có cùng độ dốc/độ dốc/thời gian/giai điệu như giai điệu của bạn, chọn một công cụ tốt cho nó và hiển thị nó trong một chương trình/thư viện mà bạn chọn. cách khác, bạn có thể đưa ra từng lưu ý một phong bì biên độ bắt đầu mạnh (hoặc xây dựng từ 0 nhanh hoặc bắt đầu mạnh), giảm xuống mức giữ yên tĩnh và giảm dần ở cuối. Đây được gọi là phong bì ADSR. – Patashu
Bằng cách nào đó bảng bên mới của tôi như là một dự án nhà không phải là ấn tượng. -1 để khiến tôi cảm thấy mình giống như một vận động viên thượng lưu của Igor (chỉ đùa thôi). –