// libaudions.cpp : Defines the exported functions for the DLL application. // #ifdef _WIN32 #include "stdafx.h" #endif #include "libaudions.h" #include "signal_processing_library.h" //默认是10ms的帧长度 #ifndef RVC_NS_AUDIO_FRAME_TIME #define RVC_NS_AUDIO_FRAME_TIME 10 #endif AudioNsImpl::AudioNsImpl(audions_callback_t* pCallback) { memcpy(&m_nscallback, pCallback, sizeof(audions_callback_t)); m_NsHandle = NULL; if (0 != WebRtcNs_Create(&m_NsHandle)){ NsLog("AudioNsImpl failed!"); return; } m_audio_sample_rate = 16000; m_audio_capture_peroid = 20; m_ns_policy = 2; } AudioNsImpl::~AudioNsImpl() { if (NULL != m_NsHandle){ WebRtcNs_Free(m_NsHandle); } } int AudioNsImpl::SetNsParams(uint32_t uSampleRate, uint32_t uAudioCapturePeroid, int iMode) { int iRet = -1; m_audio_sample_rate = uSampleRate; m_audio_capture_peroid = uAudioCapturePeroid; m_ns_policy = iMode; if (0 == WebRtcNs_Init(m_NsHandle, uSampleRate)){ iRet = WebRtcNs_set_policy(m_NsHandle, iMode); if (0 != iRet){ NsLog("WebRtcNs set policy failed."); } } else{ NsLog("WebRtcNs Init failed."); } //NsLog("audio sample rate is %d, audio frame time is %dms, noise suppression policy is %d.",m_audio_sample_rate, m_audio_capture_peroid, m_ns_policy); return iRet; } int AudioNsImpl::NsProcess(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen) { int iRet = -1; switch(m_audio_sample_rate) { case 8000: iRet = NsProcess8kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen); break; case 16000: iRet = NsProcess16kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen); break; case 32000: iRet = NsProcess32kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen); break; case 48000: iRet = NsProcess48kAudioSampleRate(pDst, uDstLen, pSrc, uSrcLen); break; default: NsLog("Rvc_NsProcess not support audio sample rate."); break; } return iRet; } //8k采样率,采样间隔20ms,每次传过来音频大小为320字节,10ms缓冲区大小为160字节,WebRtcNs_Process每次处理10ms数据 int AudioNsImpl::NsProcess8kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen) { int iRet = -1; if (NULL == pDst || pSrc == NULL){ return iRet; } if ((uDstLen >= 320) && (320 == uSrcLen)){ for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){ short shBufferIn[80] = {0}; short shBufferOut[80] = {0}; memcpy(shBufferIn, (char*)pSrc+i*80*sizeof(short), sizeof(short)*80); if (iRet = WebRtcNs_Process(m_NsHandle ,shBufferIn ,NULL ,shBufferOut , NULL)){ NsLog("Noise_Suppression WebRtcNs_Process 8k input err!"); } else{ memcpy((char*)pDst+i*80*sizeof(short),shBufferOut,80*sizeof(short)); } } } else if ((160 == uDstLen) && (160 == uSrcLen)){ iRet = WebRtcNs_Process(m_NsHandle, (short*)pSrc, NULL, (short*)pDst, NULL); } return iRet; } //16k采样率,采样间隔20ms,每次传过来音频大小为640字节,10ms缓冲区大小为320字节,WebRtcNs_Process每次处理10ms数据 int AudioNsImpl::NsProcess16kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen) { int iRet = -1; if (NULL == pDst || pSrc == NULL){ return iRet; } if ((640 == uDstLen) && (640 == uSrcLen)){ for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){ short shBufferIn[160] = {0}; short shBufferOut[160] = {0}; memcpy(shBufferIn, (char*)pSrc+i*160*sizeof(short), sizeof(short)*160); if (iRet = WebRtcNs_Process(m_NsHandle ,shBufferIn ,NULL ,shBufferOut , NULL)){ NsLog("Noise_Suppression WebRtcNs_Process 16k input err!"); } else{ memcpy((char*)pDst+i*160*sizeof(short),shBufferOut,160*sizeof(short)); } } } return iRet; } //32k采样率,采样间隔20ms,每次传过来音频大小为1280字节,10ms缓冲区大小为640字节,WebRtcNs_Process每次处理10ms数据 int AudioNsImpl::NsProcess32kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen) { int iRet = -1; if (NULL == pDst || pSrc == NULL){ return iRet; } int filter_state1[6] = {0}, filter_state12[6] = {0}; int Synthesis_state1[6] = {0}, Synthesis_state12[6] = {0}; if ((1280 == uDstLen) && (1280 == uSrcLen)){ for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){ short shBufferIn[320] = {0}; short shInL[160]={0},shInH[160]={0}; short shOutL[160] ={0},shOutH[160] = {0}; memcpy(shBufferIn, pSrc + i*320*sizeof(short), 320*sizeof(short)); //首先需要使用滤波函数将音频数据分高低频,以高频和低频的方式传入降噪函数内部 WebRtcSpl_AnalysisQMF(shBufferIn,320,shInL,shInH,filter_state1,filter_state12); //将需要降噪的数据以高频和低频传入对应接口,同时需要注意返回数据也是分高频和低频 if (iRet == WebRtcNs_Process(m_NsHandle, shInL, shInH, shOutL, shOutH)){ NsLog("Noise_Suppression WebRtcNs_Process 32k input err!"); } else { short shBufferOut[320] = {0}; //如果降噪成功,则根据降噪后高频和低频数据传入滤波接口,然后用将返回的数据写入文件 WebRtcSpl_SynthesisQMF(shOutL,shOutH,160,shBufferOut,Synthesis_state1,Synthesis_state12); memcpy(pDst+i*320*sizeof(short),shBufferOut,320*sizeof(short)); } } } return iRet; } //48k采样率,采样间隔20ms,每次传过来音频大小为1920字节,10ms缓冲区大小为960字节,WebRtcNs_Process每次处理10ms数据 int AudioNsImpl::NsProcess48kAudioSampleRate(char* pDst, uint32_t uDstLen, char* pSrc, uint32_t uSrcLen) { int iRet = -1; if (NULL == pDst || pSrc == NULL){ return iRet; } int filter_state1[6] = {0}, filter_state12[6] = {0}; int Synthesis_state1[6] = {0}, Synthesis_state12[6] = {0}; if ((uDstLen >= 1920) && (1920 == uSrcLen)){ for (int i = 0; i < m_audio_capture_peroid/RVC_NS_AUDIO_FRAME_TIME; i++){ short shBufferIn[480] = {0}; short shInL[240]={0},shInH[240]={0}; short shOutL[240] ={0},shOutH[240] = {0}; memcpy(shBufferIn, pSrc + i*480*sizeof(short), 480*sizeof(short)); //首先需要使用滤波函数将音频数据分高低频,以高频和低频的方式传入降噪函数内部 WebRtcSpl_AnalysisQMF(shBufferIn,480,shInL,shInH,filter_state1,filter_state12); //将需要降噪的数据以高频和低频传入对应接口,同时需要注意返回数据也是分高频和低频 if (iRet == WebRtcNs_Process(m_NsHandle, shInL, shInH, shOutL, shOutH)){ NsLog("Noise_Suppression WebRtcNs_Process 48k input err!"); } else { short shBufferOut[480] = {0}; //如果降噪成功,则根据降噪后高频和低频数据传入滤波接口,然后用将返回的数据写入文件 WebRtcSpl_SynthesisQMF(shOutL,shOutH,240,shBufferOut,Synthesis_state1,Synthesis_state12); memcpy(pDst+i*480*sizeof(short),shBufferOut,480*sizeof(short)); } } } return iRet; } void AudioNsImpl::NsLog(const char* fmt, ...) { if (m_nscallback.debug){ va_list arg; va_start(arg, fmt); (*m_nscallback.debug)(m_nscallback.user_data, fmt, arg); va_end(arg); } } void AudioNsImpl::ReleaseObj() { //NsLog("AudioNsImpl ReleaseObj."); delete this; }