Bagaimana cara mengekstrak bagian vokal dari sinyal audio stereo?

15

Saya sekarang sedang memproses file MP3 dan menghadapi masalah ini. MP3 saya dikodekan stereo. Yang ingin saya lakukan adalah mengekstrak bagian vokal untuk diproses lebih lanjut (mode apa pun dari sinyal output, mono atau stereo keduanya OK).

Sejauh yang saya tahu, audio dikodekan ke dalam sub-band frekuensi dis-sambungan yang berbeda dalam MP3. Saya pikir saya dapat membatasi sinyal ke kisaran vokal melalui high-pass / low-pass filter dengan frekuensi cut-off yang tepat. Namun, hasilnya harus mengandung bagian dari sinyal musik murni dalam kasus ini. Atau setelah googling, saya pikir saya dapat menghitung sinyal latar belakang terlebih dahulu (dengan membalik satu saluran menambahkan dengan sinyal dari saluran lain dengan asumsi bagian vokal berpusat di audio stereo yang disebut pembatalan fase). Setelah transformasi ini, sinyalnya mono. Maka saya harus menggabungkan stereo asli menjadi mono dari mana mengekstraksi sinyal latar belakang.

Mengingat keefektifannya, mana yang lebih disukai (atau solusi lain :)? Jika yang ke-2, biarkan dua saluran A dan B, akankah (BA) atau (AB) digunakan saat menghitung latar belakang? Seperti halnya penggabungan dua saluran, apakah aritmatika cukup akurat? Atau saya bisa mengurangi setiap saluran dengan faktor dua dan menyisipkan sinyal downsampled sebagai hasil mono?

Terima kasih dan salam hangat.

Summer_More_More_Tea
sumber

Jawaban:

21

Pertama-tama, bagaimana data dikodekan dalam file mp3 tidak relevan dengan pertanyaan kecuali Anda bertujuan melakukan pemrosesan domain-terkompresi (yang akan sangat bodoh). Jadi, Anda dapat menganggap algoritma Anda akan bekerja dengan data domain waktu yang didekompresi.

Jumlah / perbedaan adalah trik yang sangat, sangat mendasar untuk penekanan vokal (bukan ekstraksi). Hal ini didasarkan pada asumsi bahwa vokal tercampur di tengah bidang stereo, sementara instrumen lainnya digeser secara lateral. Ini jarang benar. LR dan RL akan terdengar sama (telinga manusia tidak peka terhadap perubahan fase global) dan akan memberi Anda campuran mono tanpa instrumen bercampur di tengah. Masalahnya adalah, setelah Anda memulihkan latar belakang, apa yang akan Anda lakukan dengannya? Cobalah untuk menekannya dari sinyal tengah (rata-rata)? Ini tidak akan berhasil, Anda akan melakukan (L + R) / 2 - (L - R), ini tidak terlalu menarik ... Anda dapat mencoba kombinasi linear dari mereka (rata-rata dan "dihapus dari pusat"), tidak ada akan keluar dari situ!

Mengenai pendekatan penyaringan: f0 suara jarang melebihi 1000 Hz tetapi harmoniknya bisa melampaui itu. Menghapus frekuensi tertinggi akan membuat konsonan (terutama sss, chhh) tidak menyenangkan. Beberapa suara pria di bawah 100 Hz. Anda dapat memotong dengan aman apa pun yang di bawah 50 atau 60 Hz (bas, tendangan)

Beberapa perkembangan baru-baru ini dalam pemisahan suara perlu dijelajahi:

pichenettes
sumber
4

Terima kasih untuk referensi! Anda lupa menyebutkan pekerjaan Anda tentang peningkatan drum , yang mungkin juga menarik untuk aplikasi Summer_More_More_Tea. Nah, itu semua sangat tergantung pada apa yang ingin Anda lakukan dengannya. Apakah Anda memiliki "aplikasi akhir" tertentu dalam pikiran?

Saya sepenuhnya setuju dengan pernyataan pichenettes di atas. Untuk lebih lengkap, saya harus mengatakan bahwa peningkatan vokal yang Anda sebutkan juga telah digunakan dalam beberapa karya oleh Matti Ryynänen, pada pembuatan trek Karaoke, untuk meningkatkan hasil.

Untuk menjawab pertanyaan Anda:

Mengingat keefektifannya, mana yang lebih disukai (atau solusi lain :)?

Seperti kata pichenettes, tampaknya tidak sesuai dengan kebutuhan Anda: pemfilteran low-pass / high-pass pasti akan gagal karena struktur harmonik suara manusia (dan lebih umum dari suara "menarik" - yaitu apa pun di luar sinusoid ... ).

Jika yang ke-2, biarkan dua saluran A dan B, akankah (BA) atau (AB) digunakan saat menghitung latar belakang? Seperti halnya penggabungan dua saluran, apakah aritmatika cukup akurat?

Sekali lagi, metode kedua yang Anda sebutkan tidak akan berhasil karena Anda hanya dapat menghapus sinyal yang ada di tengah, bukan mengambilnya. Dengan kata lain, bahkan vokal berada di "tengah", tidak ada matematika sederhana untuk mendapatkan sinyal hanya vokal.

Atau saya bisa mengurangi setiap saluran dengan faktor dua dan interleave sinyal downsampled sebagai hasil mono?

er ... rata-rata saluran untuk mendapatkan sinyal mono-channel, seperti yang disarankan di atas, masuk akal, dan tidak akan merusak karakteristik spektral sinyal Anda (dengan asumsi sinyal stereo tidak mengalami degenerasi). Jadi Anda mendapatkan sinyal mono di mana Anda pada dasarnya memiliki konten musik yang sama seperti sebelumnya.

Menurunkan setiap saluran dengan benar berarti Anda pertama-tama menerapkan filter low-pass (dengan frekuensi cut-off sampling_rate / 4 dalam kasus Anda), dan kemudian Anda dapat dengan aman mengambil setiap 2 sampel. Namun, tidak banyak yang bisa dikatakan tentang interleaving saluran yang downsampled: dalam kebanyakan kasus umum, ini melanggar karakteristik spektral sinyal Anda. Anda mungkin tidak menginginkan itu.

Memang, operasi penyaringan low-pass diikuti dengan menetapkan ke 0 setiap 2 sampel, dan menjaga 0 lead ini, dalam domain Fourier, untuk "mirroring" komponen frekuensi rendah yang disimpan ke yang frekuensi tinggi. Ingat Anda memberi sinyal pada pelajaran pemrosesan pada teori sampling: dikalikan dengan urutan impuls (atau diracs) menghasilkan konvolusi dengan urutan diracs lain dalam domain Fourier, yaitu, dalam hal itu, spektrum frekuensi sinyal diulangi (periodized) sepanjang sumbu frekuensi, dengan periode yang sama dengan laju sampling.

Biasanya, ketika downsampling, Anda menghapus 0 (karena Anda mengasumsikan laju sampling baru). Tapi di sini, menjaga mereka menghasilkan komponen frekuensi tinggi tambahan yang sangat mengganggu. Menyatukan sinyal-sinyal ini tidak akan memperbaikinya.

Yah, semuanya, jawaban singkatnya: jangan lakukan itu . :-)

Akhirnya, saya mungkin juga menyarankan Anda untuk menggunakan GUI yang saya kembangkan untuk konferensi LVAICA 2012: ada repo git untuk itu. Saya masih men-debug dan memperbaikinya, jadi komentar dipersilahkan: D

Semoga itu bisa membantu!

Jean-louis Durrieu
sumber