如何给音频降噪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何给音频降噪相关的知识,希望对你有一定的参考价值。

给音频降噪:以Adobe Audition CS6为例给声音降噪(其他版本操作基本相同):
1:运行Audition CS6,并在单轨打开要处理的音频文件;
2:在波形上选取一段有代表性的噪音部分(这一步很重要,降噪效果的好坏和采样样本的选取有直接关系,可对整个音频文件的波形仔细观察、聆听后,选有代表性的一段);
3:点:效果--降噪/修复--降噪;在弹出的效果-降噪对话框里点:捕捉样本特性,等采样完毕点应用;
4:关闭效果-降噪对话框后,全选波形,点:效果--降噪/修复--降噪;点应用;
4:处理完试听满意保存文件就可以了。
满意我的回答请及时采纳!
参考技术A 1,巧用edius音频轨波形图降噪(除噪)。
当我们用edius分离音频后,不难看出噪音全部在1a轨道上,这时只需我们把1a轨道上的音频全部删除(噪音自然不复存在,剩下的将会只有我们需要的音频),接下来需要的就是把单声道音频变成我们需要的效果即可,这时可以用edius音频特效里面的“音量电位均衡”来进行相应调节。当然应用这种直观简便的方法,我们还可以手动删除剪辑替换一些其它方式产生的噪音。
2,应用vts插件降噪(除噪)。
新的edius
软件附带了一款强大的vst音频效果器——izotope音频插件包,包括了eq、合唱&镶边器、压限器等等实用工具。在这个示例中,我们就来看看如何使用其中的audio
restore音频还原来去除录音噪音。
首先请正确安装izotope音频效果器。
将素材放置到时间线上。这是我们在工作中会经常遇到的一段绿屏前的采访视频,用耳机听的话,这类素材通常会有一些“丝丝”的背景噪音。
现在我们就来去噪。为素材应用:特效︱音频特效︱vst︱audio
restore。直接拖拽到素材上即可。
在信息面板双击滤镜名称,打开设置面板。先在第一项:denoiser降噪器一栏取消automatic
mode自动模式。我们来手动调节噪音阈值。
不要退出滤镜的设置面板,直接在edius的轨道上移动时间线指针。需要为滤镜找些噪音采样,这里我们选择采访对象讲话停顿处,此时录音里只有需要去除的噪音。
切换回滤镜的设置面板,勾选train选项。
在edius轨道上,用键盘上的左右箭头键来移动时间线指针,这个时候,audio
restore会进行自动采样。可以看到噪音主要集中在中低频区域。
取消勾选train选项。播放时间线试试,是不是现在的背景听上去“干净”多了?
如果仍然希望做进一步调整,可以使用threshold修改阈值或者amount来修改降噪器的强度。但是要小心,过高的数值会令你的音频“电声味”过重。
audio
restore中的其他参数。
declipper:一定程度上修复某些经过削波或者限幅而失真的音频,使其音色变得均匀。
declicker:去嘀嗒声,就是指瞬间的杂音。
参考技术B 回答

亲,借助第三方工具闪电音频剪辑软件

提问

手机上可以吗

回答

方法步骤如下:第一步、首先,双击打开音频剪辑软件,选择“添加文件”将需要剪辑的音频添加到软件中。第二步选择一个降噪样本,点击“降噪”。第三步、此时,噪声特征已经选择完毕,关掉此窗口。第四步、回到主界面中,选择需要降噪的段落(ctrl+A全选),再点击“降噪”。第五步选择“确定”进行降噪第六步、降噪过程中需要一点时间,请耐心等候。第七步、完成后,可点击播放预览,确认后点击“导出”即可。

亲,得用电脑哦

提问

手机上操作行不行

那手机上的怎么导出来

回答

你可以在手机上试试能下载下软件吗?担心软件系统不兼容,不能运行

提问

手机软件还有没有其他降噪软件

回答

存成录音文件,通过微信文件传输助手分享到电脑

蜜蜂剪辑

可以在手机上运行

提问

还有没有其他方法呢或是设备降噪也行

回答

步骤:1.打开软件,点击软件右上方的设置选项。

2.在设置下滑至“配音”,勾选“录音降噪”

3.点击“录音”功能,然后就会显示“已开启录音降噪功能”。

亲,目前降噪只能借助第三方软件哦

参考技术C 浮云音频降噪是一款智能化的音频增益软件,可实现音频降噪和调高音量等功能。程序采用最先进的人工智能算法,可以极大消除音频中的风声、水声、电流声等多种噪声,与此同时,还可以调高音量,最终导出高品质的音频文件。适用于喜马拉雅、懒人听书、蜻蜓FM等录制的音频文件降噪及音频文件调高音量等场景。 参考技术D   在音频制作中,音频降噪是一个关键步骤,音频降噪的操作将影响到整个音频文件的质量问题。在日常生活中,降噪是指消除噪音,而在音频制作中则也是相似的概念。不过在音频制作中的噪音是由电平引起的。
  在音频制作中,音频降噪除噪的常用方法有采样除燥法、噪声门等。是专业音频处理软件比较有效除去持续稳定的背景噪音的一种方法,除噪的原理就是对噪音的波形样本进行取样,然后对整段素材的波形和采样噪音样本分析,自动去除噪音。噪声门则是设定一个电平的门限值,低于这个门限的信号电平全部过滤掉,高于门限值的信号电平全部通过。
  这两种音频降噪的处理方法各有优缺点,前者能彻底除去噪音,缺点是对原始人声音质有破坏作用,信噪比越底破坏性越大。经过这种除噪后的声音金属味很浓。所以一般不推荐这种方法对唱歌的人声除噪,尽可能在前期录音控制到最高的信噪比才是真正解决问题的关键。而后者能很有效地除去演唱间歇的背景底噪,并且对原始声音无破坏作用,但是当人声出来的时候噪声门打开,噪音信号也跟着进来了,不能去掉整个素材的底噪。
  另外,在音频制作的过程中,用频谱分析噪音所在的频段,通过对EQ的调整,衰减底噪所在的频段信号电平也能起到音频降噪的作用。这对原始人声这频段的信号也衰减了,形成新的问题,也用的比较少。
  还有一种是针对录音成品的消除噪音的简单方法,不过对于音频文件有所要求,除噪的对象是在一个噪音相对稳定的情况下,录制出来的音频。将文件用adobe
audition
3.0
打开,采取一段作为噪音样本,保证这一段是最具代表性的噪音然后:在左侧effects栏里,选择capture
noise
reduction
process(采集噪音样本),左键双击,出来ok框,点击ok,等待采集结束。接着,我们将需要消除噪音的音频部分,全部选定,选择effects栏的,noise
reduction
process(消除噪音)双击左键,选择ok,等待消除噪音
最后,我们看到的成品,就是比较干净的音频了!

音频降噪算法 附完整C代码

降噪是音频图像算法中的必不可少的。

目的肯定是让图片或语音 更加自然平滑,简而言之,美化。

图像算法和音频算法 都有其共通点。

图像是偏向 空间 处理,例如图片中的某个区域。

图像很多时候是以二维数据为主,矩形数据分布。

音频更偏向 时间 处理,例如语音中的某段时长。

音频一般是一维数据为主,单声道波长。

处理方式也是差不多,要不单通道处理,然后合并,或者直接多通道处理。

只是处理时候数据参考系维度不一而已。

一般而言,

图像偏向于多通道处理,音频偏向于单通道处理。

而从数字信号的角度来看,也可以理解为聚类,频率归一化之类的。

总之就是对一些有一定规律的数字数据进行计算处理。

图像降噪被磨皮美颜这个大主题给带远了。

音频降噪目前感觉大有所为,像前面分享的《基于RNN的音频降噪算法 (附完整C代码)

能达到这样的降噪效果,深度学习 确实有它独到的一面。

但是无可厚非,做机器学习之前还是要基于前人很多 基础算法进行数据的预处理等操作。

才能达到至善至美。

各有优劣,所谓算法肯定是互相配合为主,没有说谁能替换掉谁。

做算法最核心的思路就是使用各个算法的核心思想,放大它的优点,弱化它的缺点。

当然,做人也是如此。

音频降噪算法,网上公开的算法不多,资源也比较有限。

还是谷歌做了好事,把WebRTC开源,确实是一个基础。

前人种树,后人乘凉。

花了点时间,把WebRTC的噪声抑制模块提取出来,方便他人。

噪声抑制在WebRTC中有两个版本,一个是浮点,一个是定点。

一般定点做法是为了在一些特定环境下牺牲极少的精度,提升计算性能。

这个就不展开了,涉及到算法性能优化方面的一些知识点。

至于算法的实现,见源代码:

浮点版本:

noise_suppression.c 

定点版本:

noise_suppression_x.c

算法提供4个降噪级别,分别是:

enum nsLevel {
kLow,
kModerate,
kHigh,
kVeryHigh
};

实测效果还是很不错的,不过在一些特定的应用场景下,
其实这个算法还可以进一步调优。
改进思路,很多时候是基于需求来的,
打住打住,不细说了。

完整示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//采用https://github.com/mackron/dr_libs/blob/master/dr_wav.h 解码
#define DR_WAV_IMPLEMENTATION

#include "dr_wav.h"
#include "noise_suppression.h"

#ifndef nullptr
#define nullptr 0
#endif

//写wav文件
void wavWrite_int16(char *filename, int16_t *buffer, size_t sampleRate, size_t totalSampleCount) {
    drwav_data_format format = {};
    format.container = drwav_container_riff;     // <-- drwav_container_riff = normal WAV files, drwav_container_w64 = Sony Wave64.
    format.format = DR_WAVE_FORMAT_PCM;          // <-- Any of the DR_WAVE_FORMAT_* codes.
    format.channels = 1;
    format.sampleRate = (drwav_uint32) sampleRate;
    format.bitsPerSample = 16;
    drwav *pWav = drwav_open_file_write(filename, &format);
    if (pWav) {
        drwav_uint64 samplesWritten = drwav_write(pWav, totalSampleCount, buffer);
        drwav_uninit(pWav);
        if (samplesWritten != totalSampleCount) {
            fprintf(stderr, "ERROR\\n");
            exit(1);
        }
    }
}

//读取wav文件
int16_t *wavRead_int16(char *filename, uint32_t *sampleRate, uint64_t *totalSampleCount) {
    unsigned int channels;
    int16_t *buffer = drwav_open_and_read_file_s16(filename, &channels, sampleRate, totalSampleCount);
    if (buffer == nullptr) {
        printf("读取wav文件失败.");
    }
    //仅仅处理单通道音频
    if (channels != 1) {
        drwav_free(buffer);
        buffer = nullptr;
        *sampleRate = 0;
        *totalSampleCount = 0;
    }
    return buffer;
}

//分割路径函数
void splitpath(const char *path, char *drv, char *dir, char *name, char *ext) {
    const char *end;
    const char *p;
    const char *s;
    if (path[0] && path[1] == \':\') {
        if (drv) {
            *drv++ = *path++;
            *drv++ = *path++;
            *drv = \'\\0\';
        }
    } else if (drv)
        *drv = \'\\0\';
    for (end = path; *end && *end != \':\';)
        end++;
    for (p = end; p > path && *--p != \'\\\\\' && *p != \'/\';)
        if (*p == \'.\') {
            end = p;
            break;
        }
    if (ext)
        for (s = end; (*ext = *s++);)
            ext++;
    for (p = end; p > path;)
        if (*--p == \'\\\\\' || *p == \'/\') {
            p++;
            break;
        }
    if (name) {
        for (s = p; s < end;)
            *name++ = *s++;
        *name = \'\\0\';
    }
    if (dir) {
        for (s = path; s < p;)
            *dir++ = *s++;
        *dir = \'\\0\';
    }
}

enum nsLevel {
    kLow,
    kModerate,
    kHigh,
    kVeryHigh
};

static float S16ToFloat_C(int16_t v) {
    if (v > 0) {
        return ((float) v) / (float) INT16_MAX;
    }

    return (((float) v) / ((float) -INT16_MIN));
}

void S16ToFloat(const int16_t *src, size_t size, float *dest) {
    size_t i;
    for (i = 0; i < size; ++i)
        dest[i] = S16ToFloat_C(src[i]);
}

static int16_t FloatToS16_C(float v) {
    static const float kMaxRound = (float) INT16_MAX - 0.5f;
    static const float kMinRound = (float) INT16_MIN + 0.5f;
    if (v > 0) {
        v *= kMaxRound;
        return v >= kMaxRound ? INT16_MAX : (int16_t) (v + 0.5f);
    }

    v *= -kMinRound;
    return v <= kMinRound ? INT16_MIN : (int16_t) (v - 0.5f);
}

void FloatToS16(const float *src, size_t size, int16_t *dest) {
    size_t i;
    for (i = 0; i < size; ++i)
        dest[i] = FloatToS16_C(src[i]);
}

int nsProcess(int16_t *buffer, size_t sampleRate, int samplesCount, enum nsLevel level) {
    if (buffer == nullptr) return -1;
    if (samplesCount == 0) return -1;
    size_t samples = WEBRTC_SPL_MIN(160, sampleRate / 100);
    if (samples == 0) return -1;
    const int maxSamples = 320;
    int num_bands = 1;
    int16_t *input = buffer;
    size_t nTotal = (samplesCount / samples);

    NsHandle *nsHandle = WebRtcNs_Create();

    int status = WebRtcNs_Init(nsHandle, sampleRate);
    if (status != 0) {
        printf("WebRtcNs_Init fail\\n");
        return -1;
    }
    status = WebRtcNs_set_policy(nsHandle, level);
    if (status != 0) {
        printf("WebRtcNs_set_policy fail\\n");
        return -1;
    }
    for (int i = 0; i < nTotal; i++) {
        float inf_buffer[maxSamples];
        float outf_buffer[maxSamples];
        S16ToFloat(input, samples, inf_buffer);
        float *nsIn[1] = {inf_buffer};   //ns input[band][data]
        float *nsOut[1] = {outf_buffer};  //ns output[band][data]
        WebRtcNs_Analyze(nsHandle, nsIn[0]);
        WebRtcNs_Process(nsHandle, (const float *const *) nsIn, num_bands, nsOut);
        FloatToS16(outf_buffer, samples, input);
        input += samples;
    }
    WebRtcNs_Free(nsHandle);

    return 1;
}

void noise_suppression(char *in_file, char *out_file) {
    //音频采样率
    uint32_t sampleRate = 0;
    //总音频采样数
    uint64_t inSampleCount = 0;
    int16_t *inBuffer = wavRead_int16(in_file, &sampleRate, &inSampleCount);

    //如果加载成功
    if (inBuffer != nullptr) {
        nsProcess(inBuffer, sampleRate, inSampleCount, kVeryHigh);
        wavWrite_int16(out_file, inBuffer, sampleRate, inSampleCount);

        free(inBuffer);
    }
}

int main(int argc, char *argv[]) {
    printf("WebRtc Noise Suppression\\n");
    printf("博客:http://cpuimage.cnblogs.com/\\n");
    printf("音频噪声抑制\\n");
    if (argc < 2)
        return -1;
    char *in_file = argv[1];
    char drive[3];
    char dir[256];
    char fname[256];
    char ext[256];
    char out_file[1024];
    splitpath(in_file, drive, dir, fname, ext);
    sprintf(out_file, "%s%s%s_out%s", drive, dir, fname, ext);
    noise_suppression(in_file, out_file);

    printf("按任意键退出程序 \\n");
    getchar();
    return 0;
}

 项目地址:https://github.com/cpuimage/WebRTC_NS

 

示例具体流程为:

加载wav(拖放wav文件到可执行文件上)->降噪->保存wav

 

若有其他相关问题或者需求也可以邮件联系俺探讨。

邮箱地址是: 
gaozhihan@vip.qq.com

以上是关于如何给音频降噪的主要内容,如果未能解决你的问题,请参考以下文章

怎么用视频编辑软件给音频降噪

流式音频中的降噪和压缩

音频降噪算法 附完整C代码

如何用python svd降噪

在android上使用FFT进行实时音频降噪

Audio-音频降噪回声消除处理