Phân tách channel của audio stereo với thư viện fluent-ffmpeg

Ngữ cảnh tôi có 1 file audio là file ghi âm cuộc gọi từ tổng đài viên và người dân. Đây là 1 file stereo.
Nhiệm vụ của tôi phải tách được ra thành 2 file với giọng của tổng đài viên và người dân riêng biệt nhau.
Từ file stereo phải tách thành 2 file mono:


Vậy Stereo và mono là gì?

Stereo (Âm thanh nổi) là loại âm thanh sử dụng hai kênh riêng biệt, thường được gọi là trái và phải, để truyền tải tín hiệu âm thanh. Điều này tạo ra trải nghiệm nghe đa chiều và chân thực hơn, giống như cách tai người nghe âm thanh trong thực tế. Ví dụ, trong bản nhạc stereo, tiếng hát có thể được đặt chủ yếu ở kênh giữa, trong khi tiếng trống và guitar ở các kênh trái và phải, đem lại cảm giác như nhạc cụ đang ở vị trí riêng biệt xung quanh bạn.

Mono (Âm thanh đơn kênh) chỉ sử dụng một kênh duy nhất để truyền tải tín hiệu âm thanh. Do đó, âm thanh phát ra từ một nguồn duy nhất, không có hiệu ứng định vị hoặc chiều sâu. Mặc dù đơn giản hơn, âm thanh mono vẫn được sử dụng trong một số trường hợp, chẳng hạn như podcast, thông báo trên máy bay hoặc radio AM.

Tính năngStereoMono
Số kênhHaiMột
Hiệu ứng chiều sâuKhông
Định vị âm thanhKhông
Trải nghiệm ngheĐa chiều, chân thựcPhẳng, thiếu chiều sâu
Ứng dụngNhạc, phim, game, videoPodcast, thông báo, radio AM

Tóm lại:

  • Stereo mang đến trải nghiệm nghe đa chiều và chân thực hơn, nhưng đòi hỏi thiết bị tương thích với hai kênh âm thanh.
  • Mono đơn giản hơn và dễ sử dụng hơn, nhưng âm thanh thiếu chiều sâu và hiệu ứng định vị.

Sau đây tôi sẽ thực hiện tách file , tôi sử dụng thư viện node-fluent-ffmpeg :
Sau khi tách, sẽ có được 3 file: 1 là file gốc, 2 là file giọng của tổng đài viên, 3 là file giọng của công dân.
Nếu ko dùng nodejs, có thể dùng trực tiếp command theo https://trac.ffmpeg.org/wiki/AudioChannelManipulation

async splitWav(filePath) {
        const folderPath = this.configService.get('PATH_FOLDER_FILE')
        const file = Ffmpeg(filePath);
        const leftChannel = `${folderPath}/left-channel.wav`
        const rightChannel = `${folderPath}/right-channel.wav`
        const originalChannel = `${folderPath}/original-channel.wav`
        await file.complexFilter([
            {filter: '[0:a]channelsplit', options: 'channel_layout=stereo[left][right]'},
        ]).output(originalChannel).outputOptions([
            '-map [left]',
            leftChannel,
            '-map [right]',
            rightChannel,
        ])
            .run()
        return {
            original: originalChannel,
            leftChannel: leftChannel,
            rightChannel: rightChannel
        }
    }

Một dev quèn kiếm tiền nuôi gia đình