如何区分双声道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
相关产品推荐
相关产品推荐

