当前位置: 首页 > article >正文

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

您当前的算法中,当静音段被缩短时,生成的静音样本数量是通过比例缩放计算出来的。但这个方法可能会导致一些音频失真,从而产生“沙沙”的噪音。这是因为在处理静音段时,使用了简单的零填充方式,导致音频数据出现突变,从而产生不自然的声音。

为了改进这个算法,可以采用以下思路:

平滑处理:在静音段过渡到有声音的段落时,使用平滑过渡的方式来避免突变,减少噪音。
减少零填充:在静音段缩短时,可以使用更接近原始音频特性的方式来填充缩短后的静音部分,而不是简单地使用零填充。
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();

    while ((samplesRead = reader.Read(buffer, 0, buffer.Length)) > 0)
    {
        for (int i = 0; i < samplesRead; i++)
        {
            if (Math.Abs(buffer[i]) <= silenceThreshold)
            {
                silentSampleCount++;
                silentSamples.Add(buffer[i]);
            }
            else
            {
                if (silentSampleCount >= silenceSampleCountThreshold)
                {
                    // 计算缩放比例
                    double scale = (double)targetSilenceDurationMs / (silenceDurationMs * (silentSampleCount / (double)silenceSampleCountThreshold));
                    int samplesToKeep = (int)(silentSampleCount * scale);

                    // 使用渐变过渡来处理缩短后的静音部分
                    for (int j = 0; j < samplesToKeep; j++)
                    {
                        float transitionSample = silentSamples[(int)((j / (float)samplesToKeep) * silentSampleCount)];
                        samples.Add(transitionSample);
                    }
                }
                else
                {
                    // 如果静音部分不足以达到阈值,则不做缩短处理,直接添加原始静音样本
                    samples.AddRange(silentSamples);
                }

                silentSampleCount = 0;
                silentSamples.Clear();
                samples.Add(buffer[i]);
            }
        }
    }

    // 保存处理后的音频
    return SaveToBuferr(samples.ToArray(), reader.WaveFormat);
}

}
改进要点:
平滑处理:改进后的代码在静音段的处理上引入了渐变过渡,而不是直接使用零填充。通过逐步调整静音样本的值,可以平滑地过渡到有声音的部分,避免突变带来的噪音。

静音缩短比例:在缩短静音段时,保留了一部分原始的静音样本,通过对样本进行插值计算(逐渐增加或减少静音样本的强度),避免了沙沙噪音的出现。

以上方法能够减少音频失真并有效移除静音部分,同时避免沙沙的噪音。


http://www.kler.cn/a/288352.html

相关文章:

  • 离线 快速搭建 docker docker-compose k8s 环境
  • 【项目组件】第三方库——websocketpp
  • Vue.js 项目创建流程
  • 【LeetCode】【算法】581. 最短无序连续子数组
  • Go语言 实现将中文转化为拼音
  • ubuntu连接orangepi-zero-2w桌面的几种方法
  • 【C++拓展(一)】后端开发常用的技术栈
  • 在随机点实现凸包包围游戏地区
  • 产品概述Tektronix泰克TCP0030A电流探头TCP0030原装二手
  • 前端bug:v-show嵌套组件外层,页面扩大后,组件被遮挡
  • 使用支持UDP协议的IP是否更加快速?
  • 使用Python+docx+openpyxl将Word表格转换为Excel表格
  • EI论文被引多少次算高引?
  • div嵌套img,去除img下的小空隙
  • <Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?
  • 笔记:《利用Python进行数据分析》之透视表和交叉表
  • 了解Python中如何实现多线程,并讨论GIL的影响
  • 机器学习:opencv--图像边缘检测
  • 机器学习——集成学习
  • 9.2C++
  • 【LeetCode】温度转换 最小偶倍数 二叉树判断根节点
  • 演示:基于WPF的DrawingVisual和谷歌地图瓦片开发的地图(完全独立不依赖第三方库)
  • 2024最受欢迎的蓝牙耳机是?百元价不输千元机的开放式耳机推荐
  • 深入解析 MapStruct Plus 的 @AutoMapper 注解及其对象映射机制
  • 【零知识证明】MiMC哈希函数电路
  • DOM树和CSS树解读