You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分双声道Joint-Stereo MP3通话录音的单/双方录制类型

区分两类Joint-Stereo双声道MP3通话录音的方法

我们有两类Joint-Stereo双声道MP3通话录音:

  • 第一类:完整录制对话双方音频,双声道分别对应不同说话人
  • 第二类:仅录制被叫方(员工)音频,双声道内容完全一致,另一方为静音

目前尝试过用Java的JAudioTagger读取元数据、C#的NAudio计算声道字节总和,但均未找到有效区分方法,现有代码如下:

已尝试的Java代码

public static void checkMp3Sides(File mp3File) {
    try {
        MP3File mp3 = new MP3File(mp3File);
        mp3.getAudioHeader().getChannels();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

已尝试的C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NAudio.Wave;

namespace CheckAudioChannelsEquality
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = "";
            Mp3FileReader file = new Mp3FileReader(fileName);

            int _Bytes = (int)file.Length;
            byte[] Buffer = new byte[_Bytes];

            int leftSum = 0;
            int rightSum = 0;

            int read = file.Read(Buffer, 0, (int)_Bytes);
            for (int i = 0; i < read; i += 4)
            {
                Int16 leftSample = BitConverter.ToInt16(Buffer, i);
                Int16 rightSample = BitConverter.ToInt16(Buffer, i + 2);

                leftSum += leftSample;
                rightSum += rightSample;
            }

            Console.WriteLine("Left: " + leftSum + " | Right: " + rightSum);
        }
    }
}

可行区分方法

1. 改进声道能量计算(解决正负抵消问题)

原代码的字节总和会因采样值正负抵消导致结果失真,改用绝对值平均或**均方根(RMS)**计算声道能量,能准确反映声道差异:

using System;
using NAudio.Wave;

namespace CheckAudioChannelsEquality
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = "目标音频文件路径.mp3";
            using (Mp3FileReader file = new Mp3FileReader(fileName))
            {
                WaveFormat format = file.WaveFormat;
                if (format.BitsPerSample != 16 || format.Channels != 2)
                {
                    Console.WriteLine("非目标双声道16位音频");
                    return;
                }

                long leftAbsSum = 0;
                long rightAbsSum = 0;
                int sampleCount = 0;
                byte[] buffer = new byte[4096];
                int bytesRead;

                while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0)
                {
                    for (int i = 0; i < bytesRead; i += 4)
                    {
                        short leftSample = BitConverter.ToInt16(buffer, i);
                        short rightSample = BitConverter.ToInt16(buffer, i + 2);

                        leftAbsSum += Math.Abs(leftSample);
                        rightAbsSum += Math.Abs(rightSample);
                        sampleCount++;
                    }
                }

                double leftAvg = (double)leftAbsSum / sampleCount;
                double rightAvg = (double)rightAbsSum / sampleCount;
                double energyDiff = Math.Abs(leftAvg - rightAvg) / Math.Max(leftAvg, rightAvg);

                Console.WriteLine($"左声道平均绝对值: {leftAvg:F2}, 右声道平均绝对值: {rightAvg:F2}");
                if (energyDiff < 0.05)
                {
                    Console.WriteLine("仅录制被叫方音频(双声道内容一致)");
                }
                else
                {
                    Console.WriteLine("完整录制对话双方音频");
                }
            }
        }
    }
}

2. 检测声道静音分布差异

  • 第二类录音的双声道静音区间完全一致;第一类录音的双声道会交替出现静音(通话双方轮流说话)
  • 遍历采样点,标记每个声道的静音区间(采样值绝对值低于阈值,如100),对比两个声道的静音分布:
    • 若静音区间高度重合,属于第二类
    • 若静音区间交替出现,属于第一类

3. 解析MP3帧的Joint-Stereo编码标记

Joint-Stereo对内容一致的双声道会采用强冗余编码,可通过解析MP3帧头的Mode Extension字段判断:

  • 读取每个MP3帧的帧头信息,统计Intensity Stereo或MS Stereo标记的占比
  • 若大部分帧都带有强冗余标记且声道能量差异极小,即可判定为第二类录音

内容的提问来源于stack exchange,提问作者JustNeedHelp123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:20:06