ai数字人音频停顿处理,删除无用音频段

打印 上一主题 下一主题

主题 538|帖子 538|积分 1614

您当前的算法中,当静音段被缩短时,天生的静音样本数量是通过比例缩放计算出来的。但这个方法大概会导致一些音频失真,从而产生“沙沙”的噪音。这是因为在处理静音段时,利用了简单的零添补方式,导致音频数据出现突变,从而产生不天然的声音。
为了改进这个算法,可以采用以下思路:
平滑处理:在静音段过渡到有声音的段落时,利用平滑过渡的方式来避免突变,减少噪音。
减少零添补:在静音段缩短时,可以利用更靠近原始音频特性的方式来添补缩短后的静音部分,而不是简单地利用零添补。
public static byte[] ScaleSilence(byte[] inputFile, float silenceThreshold = 0.01f, int silenceDurationMs = 200, int targetSilenceDurationMs = 100)
{
using (var reader = new MyAudioFileReader(inputFile))
{
var samples = new List();
int sampleRate = reader.WaveFormat.SampleRate;
int channels = reader.WaveFormat.Channels;
int silenceSampleCountThreshold = (int)(sampleRate * channels * (silenceDurationMs / 1000.0));
float[] buffer = new float[sampleRate * channels];
int samplesRead;
int silentSampleCount = 0;
List silentSamples = new List();
  1.     while ((samplesRead = reader.Read(buffer, 0, buffer.Length)) > 0)
  2.     {
  3.         for (int i = 0; i < samplesRead; i++)
  4.         {
  5.             if (Math.Abs(buffer[i]) <= silenceThreshold)
  6.             {
  7.                 silentSampleCount++;
  8.                 silentSamples.Add(buffer[i]);
  9.             }
  10.             else
  11.             {
  12.                 if (silentSampleCount >= silenceSampleCountThreshold)
  13.                 {
  14.                     // 计算缩放比例
  15.                     double scale = (double)targetSilenceDurationMs / (silenceDurationMs * (silentSampleCount / (double)silenceSampleCountThreshold));
  16.                     int samplesToKeep = (int)(silentSampleCount * scale);
  17.                     // 使用渐变过渡来处理缩短后的静音部分
  18.                     for (int j = 0; j < samplesToKeep; j++)
  19.                     {
  20.                         float transitionSample = silentSamples[(int)((j / (float)samplesToKeep) * silentSampleCount)];
  21.                         samples.Add(transitionSample);
  22.                     }
  23.                 }
  24.                 else
  25.                 {
  26.                     // 如果静音部分不足以达到阈值,则不做缩短处理,直接添加原始静音样本
  27.                     samples.AddRange(silentSamples);
  28.                 }
  29.                 silentSampleCount = 0;
  30.                 silentSamples.Clear();
  31.                 samples.Add(buffer[i]);
  32.             }
  33.         }
  34.     }
  35.     // 保存处理后的音频
  36.     return SaveToBuferr(samples.ToArray(), reader.WaveFormat);
  37. }
复制代码
}
改进要点:
平滑处理:改进后的代码在静音段的处理上引入了渐变过渡,而不是直接利用零添补。通过逐步调整静音样本的值,可以平滑地过渡到有声音的部分,避免突变带来的噪音。
静音缩短比例:在缩短静音段时,保留了一部分原始的静音样本,通过对样本进行插值计算(逐渐增长或减少静音样本的强度),避免了沙沙噪音的出现。
以上方法可以或许减少音频失真并有用移除静音部分,同时避免沙沙的噪音。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表