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

OpenHarmony NativeC++应用开发speexdsp噪声消除案例

随着5.0的版本的迭代升级,笔者感受到了开源鸿蒙前所未有大的版本更替速度。5.0出现了越来越多的C API可以调用,极大的方便了native c++应用的开发。笔者先将speexdsp噪声消除的案例分享,老规矩,还是开源!!!

开源地址:https://gitee.com/from-north-to-north/OpenHarmony_p7885/tree/3b8ffd1c5223688f0b1e1f011187a6a392b4fcdf/hap/easy_demo/speexdsp
编译好的hap:https://gitee.com/from-north-to-north/OpenHarmony_p7885/blob/3b8ffd1c5223688f0b1e1f011187a6a392b4fcdf/hap/easy_demo/speexdsp/hap/speexdsp.hap

声明:本案例基于 https://gitee.com/harmonyos_samples/audio-native 开源案例的基础上修改,增加speexdsp噪声消除功能

一、speexdsp交叉编译

https://gitcode.com/openharmony-sig/tpc_c_cplusplus/tree/master/community/speexdsp

image.png

教程请参考:
https://gitcode.com/openharmony-sig/tpc_c_cplusplus/blob/master/community/openssl_1_1_1w/docs/hap_integrate.md

二、核心实现代码
核心代码:https://gitee.com/from-north-to-north/OpenHarmony_p7885/blob/master/hap/easy_demo/speexdsp/entry/src/main/cpp/AudioRecording.cpp

#include <iostream>
#include <speex/speex_preprocess.h>

#define FRAME_SIZE 160
#define SAMPLE_RATE 8000

bool denoisePCMFile(const char* filePath) {
    // 以读写二进制模式打开文件
    FILE* file = fopen(filePath, "rb+");
    if (!file) {
        LOGI("denoisePCMFile open files failed");
        return false;
    }

    // 初始化speex预处理状态
    SpeexPreprocessState* st = speex_preprocess_state_init(FRAME_SIZE, SAMPLE_RATE);
    if (!st) {
        LOGI("denoisePCMFile 无法初始化speex预处理状态");
        fclose(file);
        return false;
    }

    // 设置降噪参数
    int denoise = 1;
    speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DENOISE, &denoise);

    short frame[FRAME_SIZE];
    size_t readSize;
    while ((readSize = fread(frame, sizeof(short), FRAME_SIZE, file)) == FRAME_SIZE) {
        // 对帧进行降噪处理
        speex_preprocess_run(st, frame);

        // 将文件指针移动到当前帧的起始位置
        fseek(file, -static_cast<long>(readSize * sizeof(short)), SEEK_CUR);

        // 将处理后的帧写回文件
        fwrite(frame, sizeof(short), FRAME_SIZE, file);
    }

    // 释放speex预处理状态
    speex_preprocess_state_destroy(st);

    // 关闭文件
    fclose(file);
    
    LOGI("denoisePCMFile 降噪处理完成,已覆盖原文件");
    return true;
}

napi_value DenoisePCMFile(napi_env env, napi_callback_info info) {
    if ((nullptr == env) || (nullptr == info)) {
        LOGE("GetUptime: env or info is null");
        return nullptr;
    }

    napi_value thisArg;
    if (napi_ok != napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr)) {
        LOGE("GetUptime: napi_get_cb_info fail");
        return nullptr;
    }
    
    
    std::string time ;
    
    const char* filePath = "/data/storage/el2/base/haps/entry/files/oh_test_audio.pcm";

    if (denoisePCMFile(filePath)) {
        LOGI("denoisePCMFile success");
        time = "success";
    }else{
        LOGI("denoisePCMFile failed");
        time = "failed";
    }
    
    LOGI("getUptime success! %{public}s", time.c_str());
    napi_value res;
    napi_create_string_utf8(env, time.c_str(), strlen(time.c_str()), &res);
    return res;
}

snapshot_20250327_144159.jpg

相关文章:

  • word光标一直闪的解决办法
  • 【TCP】三次握手,四次挥手详解--UDP和TCP协议详解
  • 推荐一个好用的文字转语音网站
  • 林曦:在枯燥里积累能力,把平常过成精进的日常
  • 基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案
  • electron打包vue2项目流程
  • 【Java】——程序逻辑控制(构建稳健代码的基石)
  • unity实现图片查看器有限制的移动缩放功能
  • Axure项目实战:智慧运输平台后台管理端-母版、登录(文本框高级交互)
  • 【C++】AVL树
  • 音视频 一 看书的笔记 基础视频知识
  • 电话号码的字母组合组合总和II 回溯注意事项(Java)
  • AI玩具迎来爆发式增长,IoT行业如何抓住机遇?
  • Linux 目录结构(文件系统结构)示例说明
  • Python第六章15:字典(dict)定义
  • XCode中使用MonkeyDev开发iOS版的Comand-line Tool的daemon程序
  • IntelliJ IDEA(2024版) 的安装、配置与使用教程:常用配置、创建工程等操作(很详细,你想要的都在这里)
  • Redis 和 MySQL双写一致性的更新策略有哪些?常见面试题深度解答。
  • vue3 vite mock实践
  • 使用 Docker 18 安装 Eureka:解决新版本 Docker 不支持的问题
  • 长沙好的做网站品牌/广东seo网站推广代运营
  • 汉中建网站/seo网站关键词优化工具
  • 网站未授权cas要怎么做/活动宣传推广方案怎么写
  • 南宁网站推广公司/大数据培训机构排名前十
  • p2p网站建设/广东近期新闻
  • 做网站用什么插件/seo搜索培训