使用speex对pcm,wav进行降噪处理

初识 Speex 语音压缩 文章目录初识 Speex 语音压缩Speex 简介Speex 性能Speex 与 OpusSpeex 的 JNI 实现 初识 Speex 语音压缩 Speex 简介 Speex 是一个声音编码格式,目标是用于网络电话、在线广播使用的语音编码,基于 CELP(一种语音编码算法)开发,Speex 宣称可以免费使用,以 BSD 授权条款开放源代码。 Speex 的开发者将这个格式视为 Vorbis(通用... 阅读详情
AI摘要

本文详细介绍Speex的降噪模块,包括libspeexdsp库的使用,预处理模块的API,以及如何调整降噪参数。通过具体示例,展示了如何在C语言中实现音频降噪。

1. speex的降噪模块的简介

speex的语音处理模块要使用独立于 speex codec库的libspeexdsp 库。

这个分离的库是在1.2版本后实现;

它这库包括了: 预处理,回声消除,jitter buffer 和重采样模块;

在Unix/Linux环境下,使用 -lspeexdsp -lm 来编译和链接。

 

和libspeex一样,库libspeexdsp的库函数都是可重入函数。

但它不是线程安全的,所以在多个线程中使用同一个实例时,必须加个线程安全锁。

 

NOTE:

所谓可重入函数就是允许被递归调用的函数。

函数的递归调用是 指当一个函数正被调用尚未返回时,又直接或间接调用函数本身。

一般的函数不能做到这样,只有重入函数才允许递归调用.

 

2. 下载与编译

https://www.speex.org/downloads/

http://downloads.xiph.org/releases/speex/speexdsp-1.2rc3.tar.gz

$ tar -zxvf speexdsp-1.2rc3.tar.gz

$ cd speexdsp-1.2rc3

$./configure --prefix=/data/speexdsp-1.2rc3-install/ --enable-static --disable-shared --with-pic

$ make && make install

 

3. API简介

预处理模块需要添加头文件:

#include <speex/speex_preprocess.h>

 

创建实例:

SpeexPreprocessState *preprocess_state = speex_preprocess_state_init(frame_size,sampling_rate);

参数: frame_size , 建议设置成编码器相同的值。

 

对于每一个输入帧,调用处理的函数:

speex_preprocess_run(preprocess_state, audio_frame);

参数: audio_frame , 即是输入,也是输出。

 

 

在某些场景下,有些降噪的数据并不想输出,可以下面的API:

它会更新处理器内部的状态,但不会将降噪后的数据输出,这样可以节省一些计算量:

speex_preprocess_estimate_update(preprocess_state, audio_frame);

 

 

使用下面API来改变进行预处理器的状态设置,更多的参数见下面的一节:

speex_preprocess_ctl(preprocess_state, request, ptr);

 

实例销毁 :

speex_preprocess_state_destroy(preprocess_state);

 

3.1 Preprocessor options

As with the codec, the preprocessor also has options that can be controlled using an ioctl()-like call. The available options are:

SPEEX_PREPROCESS_SET_DENOISE Turns denoising on(1) or off(2) (spx_int32_t)

SPEEX_PREPROCESS_GET_DENOISE Get denoising status (spx_int32_t)

SPEEX_PREPROCESS_SET_AGC Turns automatic gain control (AGC) on(1) or off(2) (spx_int32_t)

SPEEX_PREPROCESS_GET_AGC Get AGC status (spx_int32_t)

SPEEX_PREPROCESS_SET_VAD Turns voice activity detector (VAD) on(1) or off(2) (spx_int32_t)

SPEEX_PREPROCESS_GET_VAD Get VAD status (spx_int32_t)

SPEEX_PREPROCESS_SET_AGC_LEVEL

SPEEX_PREPROCESS_GET_AGC_LEVEL

SPEEX_PREPROCESS_SET_DEREVERB Turns reverberation removal on(1) or off(2) (spx_int32_t)

SPEEX_PREPROCESS_GET_DEREVERB Get reverberation removal status (spx_int32_t)

SPEEX_PREPROCESS_SET_DEREVERB_LEVEL Not working yet, do not use

SPEEX_PREPROCESS_GET_DEREVERB_LEVEL Not working yet, do not use

SPEEX_PREPROCESS_SET_DEREVERB_DECAY Not working yet, do not use

SPEEX_PREPROCESS_GET_DEREVERB_DECAY Not working yet, do not use

SPEEX_PREPROCESS_SET_PROB_START

SPEEX_PREPROCESS_GET_PROB_START

SPEEX_PREPROCESS_SET_PROB_CONTINUE

SPEEX_PREPROCESS_GET_PROB_CONTINUE

SPEEX_PREPROCESS_SET_NOISE_SUPPRESS Setmaximumattenuation of the noise in dB (negativespx_int32_t)

SPEEX_PREPROCESS_GET_NOISE_SUPPRESS Getmaximumattenuation of the noise in dB (negativespx_int32_t)

SPEEX_PREPROCESS_SET_ECHO_SUPPRESS Setmaximumattenuation of the residual echo in dB (negative spx_int32_t)

SPEEX_PREPROCESS_GET_ECHO_SUPPRESS Setmaximumattenuation of the residual echo in dB (negativespx_int32_t)

SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE Set maximum attenuation of the echo in dB when near

end is active (negative spx_int32_t)

SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE Set maximum attenuation of the echo in dB when near

end is active (negative spx_int32_t)

SPEEX_PREPROCESS_SET_ECHO_STATE Set the associated echo canceller for residual echo suppression (pointer

or NULL for no residual echo suppression)

SPEEX_PREPROCESS_GET_ECHO_STATE Get the associated echo canceller (pointer)

 

4. 应用实例

C语言实现的音频降噪代码如下。

代码中采样率、音频帧大小需要根据实际情况设置,

HEADLEN是WAV格式的文件头,占44个字节,这44个字节是不需要处理的,不然文件头会损坏,

导致得到的结果无法播放。

如果是PCM数据,则没有这个头,直接输入指定长度的数据就行;

 

noiseSuppress的值可以控制减除的噪声强度,负值越小,噪声去除的强度越大,

同时会造成原声的失真,需要作出权衡。

#include <stdio.h>  
#include <stdlib.h>  
#include <stdint.h>  
#include <assert.h>  
#include <string.h>
#include <speex/speex_preprocess.h>

#define HEADLEN 44
#define SAMPLE_RATE   (48000)  
#define SAMPLES_PER_FRAME  (1024)
#define FRAME_SIZE   (SAMPLES_PER_FRAME * 1000/ SAMPLE_RATE)
#define FRAME_BYTES  (SAMPLES_PER_FRAME)
int main()
{
    size_t n = 0;
    FILE *inFile, *outFile;
    fopen_s(&inFile, "./audio/input01L.wav", "rb");
    fopen_s(&outFile, "./audio/output01L.wav", "wb");

    char *headBuf = (char*)malloc(HEADLEN);
    char *dataBuf = (char*)malloc(FRAME_BYTES * 2 );
    memset(headBuf, 0, HEADLEN);
    memset(dataBuf, 0, FRAME_BYTES);
    assert(headBuf != NULL);
    assert(dataBuf != NULL);

    SpeexPreprocessState *state = speex_preprocess_state_init(1024, SAMPLE_RATE);
    int denoise = 1;
    int noiseSuppress = -25;
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_DENOISE, &denoise);
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &noiseSuppress);
    
    int i;
    i = 0;
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_AGC, &i);
    i = 80000;
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_AGC_LEVEL, &i);
    i = 0;
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_DEREVERB, &i);
    float f = 0;
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &f);
    f = 0;
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f);

    //静音检测,效果一般
    /*
    int vad = 1;
    int vadProbStart = 80;
    int vadProbContinue = 65;
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_VAD, &vad); 
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_PROB_START, &vadProbStart); 
    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_PROB_CONTINUE, &vadProbContinue);
    */

    bool flag = true;

    while (1)
    {
        if (flag == true)
        {
            flag = false;
            n = fread(headBuf, 1, HEADLEN, inFile);
            if (n == 0)
                break;
            fwrite(headBuf, 1, HEADLEN, outFile);
        }
        else
        {
            n = fread(dataBuf, 1, SAMPLES_PER_FRAME, inFile);
            if (n == 0)
                break;
            speex_preprocess_run(state, (spx_int16_t*)(dataBuf));
            fwrite(dataBuf, 1, SAMPLES_PER_FRAME, outFile);
        }
    }

    free(headBuf);
    free(dataBuf);
    fclose(inFile);
    fclose(outFile);
    speex_preprocess_state_destroy(state);
    return 0;
}

SpeexDsp回音消除的一些理解 1. 算法的变量定义: SpeexEchoState *echo_state = NULL;//回声消除变量 SpeexPreprocessState *pre_state = NULL;//噪声抑制变量 int sampleRate = 16000;//16k采样率,现在项目用的就是这个采样率 2. 算法的初始化: echo_state = speex_echo_state_init(256... 阅读详情

相关推荐

speexdsp回声消除模块在android中封装及使用例子

前言 本来我只是个纯写一般app的码农,奈何进了这家以音视频为主的公司。刚进公司时,还有好些牛人都没有离职(在音视频方面浸淫以久的同事)。那关于音视频方面的什么传输库,h264,aac编解码等方面的事,有专门的人员来写和维护,我作为移动端的开发人员,只需要用他们提供的传输库,使用他们在pc端的功能模块就可以了。我也可以快乐的下班。可公司发展不景气(没有挣到钱),接下来你们懂的。(人员各种流失。。。)最后,移动原生开发的就剩下两人(我也算在里面)。ios方面的开发,全走了。交接工作全给了我了,OMY,我对苹果

q384264619的专栏 5162

speex 编码简介

Speex 技术介绍 Speex 介绍 speex是近年来开发出的一套功能强大的语音引擎,能够实现高质量和低比特率的编码。它不仅提供了基于码激励线性预测(CELP)算法的编/解码模块,而且在其最新发布的版本中还提供了声音预处理和声学回声消除模块,为保障IP网络中的语音通信质量提供了技术手段。此外,Speex还具有压缩后的比特率低(3~44 kbps)的特点,并支持多种比特率。这些特点使得Speex特别适合VoIP, 音视频系统 宽带和超宽带下的比特率 Speex特点 (1)...

liuxunfei15的博客 1万+

音频(一) - 音频基础知识

版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.youkuaiyun.com/kevindgk GitHub地址:https://github.com/KevinDGK/MyAudioDemo 前言 基础知识点 音频的使用场景 音频开发的具体内容 难点 音频编码 1 概念 2 有损和无损 PCM - 脉冲编码调制 1 抽样 - 采样频率 2 量化 3 编码

一路向东 1万+

speexdsp库实现音频3A算法,speexdsp库编译,C/C++

speexdsp编译,speexdsp库调用,音频3A算法,回声消除,噪声抑制,自动增益,QT+ubuntu环境测试

weixin_40355471的博客 7754

Android手机上跑的Speex实时语音处理Demo:录音降噪+回声消除,带JNI封装和多架构so库

一个开箱即用的Android语音采集增强工具,基于Speex开源库实现录音过程中的实时降噪、语音增强与回声消除。音频数据通过AudioRecord采集后,经JNI调用C层Speex模块处理,输出干净的PCM原始音频(record.pcm)和处理后的effect.pcm,还支持生成Speex压缩格式record.spx。项目已预编译好armeabi、armeabi-v7a、x86三套本地库,适配主流Android设备;Java层代码结构清晰,关键参数如采样率(默认8kHz/16kHz)、噪声门限、回声延迟补偿

cake8的博客 324

基于Speex的AEC回声消除算法MATLAB实现与调参实战

自适应滤波是语音通信中抑制声学回声的核心技术,其本质是通过在线估计扬声器到麦克风之间的传输路径,动态生成与回声分量相匹配的抵消信号。常见的时域NLMS算法因计算复杂度高,难以覆盖长混响尾音;而基于分块频域处理的多延迟自适应滤波(MDF)则利用FFT将卷积运算降至O(NlogN),在保证回声尾音覆盖范围的同时大幅提升实时性。结合双讲检测与非线性处理,可有效避免近端语音被误消除,并抑制扬声器失真带来的残留回声。该技术被广泛应用于网络电话、在线会议、嵌入式音频设备等场景。文章以Speex AEC模块为对象,讲解其

weixin_33508411的博客 239

语音降噪 c语言,使用speex对pcm,wav进行降噪处理

1. speex的降噪模块的简介speex的语音处理模块要使用独立于 speex codec库的libspeexdsp 库。这个分离的库是在1.2版本后实现;它这库包括了: 预处理,回声消除,jitter buffer 和重采样模块;在Unix/Linux环境下,使用 -lspeexdsp -lm 来编译和链接。和libspeex一样,库libspeexdsp的库函数都是可重入函数。但它不是线程安...

weixin_31691749的博客 1556

Android Speex AEC源码编译与调优实战指南

回音消除(AEC)是实时语音通信的核心技术,其本质是基于自适应滤波的声学路径建模与实时信号抵消。Speex AEC 采用定点运算与NLMS算法,在资源受限的Android设备上具备低延迟、低CPU占用的工程优势,尤其适用于需深度定制音频链路或兼容低端SoC的场景。相比系统级AcousticEchoCanceler的黑盒封装和WebRTC AECM的浮点开销,Speex提供可调试、可裁剪、可嵌入预处理流水线的C语言内核能力。本文聚焦Android平台下Speex AEC源码的NDK编译、JNI胶水开发、时序对

weixin_34357887的博客 330

iOS使用speex

为实现类似微信上的对讲机功能,做了两个Demo。一种使用lib-amr库,用amr格式实现。另一个用的是speex库,这个提的人很多,但是出教程的不多,大家有很多不明所以的地方,新手对此较为实现类似微信上的对讲机功能,做了两个Demo。一种使用lib-amr库,用amr格式实现。另一个用的是speex库,这个提的人很多,但是出教程的不多,大家有很多不明所以的地方,新手对此较为困惑。

8089

WebRTC降噪源码包:纯C环境下WAV音频噪声抑制与工程实践

语音处理中,噪声抑制是提升音频质量的关键环节。WebRTC音频引擎的NS(噪声抑制)模块经过大规模验证,可脱离浏览器独立运行。本资源提供一份纯C实现的WebRTC降噪源码包,无需联网,通过命令行即可完成WAV文件的噪声抑制。其核心原理基于频域幅度增益调整,结合噪声谱估计与语音活动检测,能有效降低稳态及部分非稳态噪声。该技术价值在于可轻量嵌入实时音频采集、嵌入式设备或本地录音处理流程,避免引入完整WebRTC引擎的冗余代码。适用于语音采集、实时音视频、嵌入式音频开发等场景。围绕这一源码包,从目录结构、核心实现

weixin_29191761的博客 180

工程级语音降噪方案:48kHz实时处理、ARM优化、C99可嵌入

语音降噪是智能硬件与远程会议系统的关键前端技术,其核心在于平衡算法效果与资源约束。传统方法依赖仿真噪声验证,难以应对真实场景中的非平稳干扰、回声耦合与边缘设备算力限制。本方案基于谱减法原理,融合三维度VAD判决、分段最小统计噪声估计、相位补偿谱减引擎及动态响度控制,实现信噪比提升≥3dB的同时,保障单核CPU占用<35%、端到端延迟≤80ms。技术价值体现在跨平台C99实现、ARM Cortex-M4 SIMD加速、Python零拷贝绑定与C++线程安全SDK封装,广泛适用于语音唤醒、会议终端、嵌入式语音交

weixin_27014595的博客 201

php speex,开源语音格式speex教程

本文由社区会员cxjwin分享这两天在折腾语音的东西,实现类似微信上对讲机的功能,做了两个Demo,一种使用lib-amr库用amr格式实现的,这个网上有现成的教程,所以还是比较好实现的。另一个是用的speex库,这个提的人很多,但是出教程的不多,恨透那个爱图腾的教程了,很多不明所以的地方,让我们这些新手很困惑呀,网上晃了3天终于可以搞出个像样的Demo了。Demo中我将一个录好的.caf格式的P...

weixin_33253331的博客 333

开启虚拟人物互动新时代:探索相芯Avatar SDK驱动功能(Android)

相芯SDK提供了男孩和女孩Avatar驱动模型,这些模型具备半身驱动和全身驱动的功能,使得虚拟角色能够根据用户的面部表情和动作实时模仿和响应。半身驱动功能: 相芯SDK的男孩和女孩Avatar驱动模型具备上身驱动功能,即能够通过用户的面部表情和动作来驱动虚拟角色的上半身行为。这意味着用户的面部表情、头部转动和上半身姿态等动作可以直接映射到虚拟角色上,使得虚拟角色能够栩栩如生地模仿用户的动作。例如,用户微笑时,虚拟角色会展现出笑容;用户转动头部时,虚拟角色也会相应地转动头部。

Faceunity2023的博客 631

开源语音格式speex教程(for iOS)

为实现类似微信上的对讲机功能,做了两个Demo。一种使用lib-amr库,用amr格式实现。另一个用的是speex库,这个提的人很多,但是出教程的不多,大家有很多不明所以的地方,新手对此较为困惑。 网上晃了3天终于搞出个像样的Demo了,Demo中我将一个录好的.caf格式的PCM音频 编码成speex格式然后将speex格式的再转回PCM。当然Demo只是实现了音频的编码解码,并没有增加过多的

Saick的专栏 694

贝叶斯神经网络(Bayesian Neural Network)

最近在研究贝叶斯神经网络,一些概念一直搞不清楚,这里整理一下相关内容,方便以后查阅。

梁小憨憨的博客 3655

护网日志分析基础

简要介绍日志分析,给出日志分析的步骤和思路。要求根据日志中的字符串特征,识别攻击者的攻击工具;根据日志中的行为特征,确定攻击者可能的攻击手段等。总结归纳护网中常见的中间件Tomcat、Apache、Weblogic、Nginx、Apache、IIS、MySQL、SQL Server、Oracle的日志路径和日志配置文件路径等。

m0_59302403的博客 3699

Android 与 iOS 下 Speex的使用

首先,在现在这个微信的时代,做一个IMapp,绝对不能少了语音通讯这个功能,如果没有了语音通讯功能我相信在当下已经不能算是一个IM了。由于前段时间在忙碌一个新的项目,导致这个模块已经耽误了一个月了。终于在今天另一个项目上线之后我从新开始这个模块的研究。在研究开始之前,我首先去市场下载了几个目前比较流行IM,然后通过强大的反编译和文件查找能力,发现即使是陌陌这个app ,他们的语音传输都是没有经过比较

进击中的Park哥 6592

dreamerv3复现教程

由于dreamerv3存在很多版本冲突问题,所以很难直接使用和复现。

无人机飞啊飞啊飞 2835

speex 笔记(一)

不是做android啊! 准备用speex做音频编码,软编码啊,之前研究过嵌入式设备编码10s中的文件大概需要30min左右,后来对.configure 进行配置后去掉 float api 配置后编码速率提升了。 Usage: speexenc [options] input_file output_file Encodes input_file using Speex. It can re

朔望两弦的专栏 1551

国内优秀MES开源框架

一套springboot 开源框架 代码标准规范化。 界面展示 演示地址 http://wangziyangmes.pzzd.xyz 用户名admin 密码123 系统管理 工艺管理 计划管理 物料管理 *用户管理* *工艺路线管理* 工单下达...

q707231019的博客 2万+

uniapp - 强力解决H5网页浏览器跨域问题,如何解决uniapp请求接口在浏览器跨域问题,UniApp H5 跨域代理配置详细教程完美解决所有uniapp跨域(调用第三方接口或服务器api跨域)

uni-app 跨域,uniApp解决h5跨域问题,解决uni-app请求接口在浏览器跨域问题,uni.request请求跨域问题解决方案,uni-app-跨域解决方法,彻底解决uniapp发布为H5的跨域问题,uniapp H5页面设置跨域请求_uniapp h5跨域配置,uniapp开发 H5 解决跨域问题,uniApp请求解决跨域问题,uniapp request如何实现前端请求跨域,解决uniapp调试过程中的请求跨域和环境配置,Uniapp调用外部api接口跨域请求,uni-app发布H5页面跨域

🏆 前端领域优质创作者 5354

Speexdsp中的噪音消除(denoise)的应用

由于libspeex库中的testdenoise文件中是不存在wav文档的读写的,所以我们要先进行的一步操作是wav文档的读写。总所周知的是,wav文档就是一个wav文件头后面接着音频数据的一种文件格式,如果不理解的话,完全可以百度一下,网上也有很多相关的描述。为此在这里不进行过多的描述。/* data *///RIFF//"WAVE"//"fmt"//"data"以上即为我们所定义的wav文件的文件头结构体,紧接着我们将进一步定义读取wav文件的文件头,以及写入wav文件的文件头。

weixin_47398361的博客 1102

手把手教你学SOME/IP「1.0•概述」

本文介绍了SOME/IP协议的基本概念和主要特点。SOME/IP全称为"Scalable service-Oriented MiddlewarE over IP",是一种面向服务的车载嵌入式通信协议,支持远程过程调用、事件通知等功能。文章指出SOME/IP是AUTOSAR标准的一部分,在车载以太网架构中处于应用层位置,负责服务调度和通信封装。协议具有可扩展性强、资源消耗低、兼容性好等优势,能满足汽车电子领域对实时性、可靠性的严格要求。同时,文章也说明了SOME/IP的正确书写规范,并解释

nihaoljq2010的博客 679

开源语音格式speex教程(for iOS)

为实现类似微信上的对讲机功能,做了两个Demo。一种使用lib-amr库,用amr格式实现。另一个用的是speex库,这个提的人很多,但是出教程的不多,大家有很多不明所以的地方,新手对此较 为实现类似微信上的对讲机功能,做了两个Demo。一种使用lib-amr库,用amr格式实现。另一个用的是speex库,这个提的人很多,但是出教程的不多,大家有很多不明所以的地方,新手对此较为困惑。...

weixin_30551947的博客 268

具身智能:原理、算法与系统 第3章 具身智能的感知-认知-行为框架

具身智能的PCB框架源于对生物智能系统的观察:动物通过感官接收环境信息(感知),基于内部模型进行预测和决策(认知),并通过身体执行动作改变环境(行为),而这一改变又通过感知反馈形成闭环。这一框架在两篇核心文献中得到了深入阐述:提出了系统的数学形式化和工程实现,则从认知科学角度强调了归纳偏置和双过程理论的重要性。

VectorShift的博客 155

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 基于FFmpeg-4.0 SDK的PCM编码成AAC
下一篇: FFmpeg-4.0 的filter机制的架构与实现.之一 Filter原理
北雨南萍
北雨南萍 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄20年 2665粉丝 453原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北雨南萍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值