当前位置: 首页 > 工具软件 > Speex > 使用案例 >

Speex的安装使用

芮意
2023-12-01
  1. 从链接中https://www.speex.org/downloads/下载Speex 1.2.0SpeexDSP 1.2rc3  
  2.   
  3. 编译和安装  
  4.   
  5. 下载以后解压,然后点击INSTALL,根据其中的命令进行安装,具体的安装方式也可以看解压后doc目录中manual.pdf的第3章。  
  6.   
  7. % ./configure [--prefix=<install-path>]  
  8. %make  
  9. %make install  
  10. 其设置支持是通过Speex配置脚本的,这些命令选项跟在 ./configure设置   
  11. -prefix=<path> 指定Speex安装其本路径(如 /usr  
  12. -enable-shared/-disable-shared  是否编译共享库  
  13. -enable-static/-disable-static  是否编译静态库  
  14. -disable-wideband 取消Speex的宽带部分(典型的节省空间)  
  15. -enable-valgrind  为调试目的启用额外valgrind的命中率  
  16. -enable-sse  启用SSE指令(只在 x86/浮点)  
  17. -enable-fixed-point 编译Speex为无浮点单位(FPU)处理器  
  18. -enable-arm4-asm 启用汇编指定为ARMv4架构(只在gcc  
  19. -enable-arm5e-asm 启用汇编指定为ARMv5E架构(只在gcc  
  20. -enable-fixed-point-debug 只使用调试定点码(非常慢)  
  21. -enable-epic-48k 启用一个专门(不兼容)4.8kbps窄带模式(在1.1.x1.2beta  
  22. -enable-ti-c55x 启用支持TI C5x  
  23. -enable-blackfin-asm 启动汇编指定为Blackfin DSP架构  
  24. -enable-vorbis-psycho 使编码器使用Vorbis心理学模型。这是非常实验性,可能在将来会被移除  
  25.   
  26. 对于去除音频中的噪声,manual.pdf中第6章有写到语音处理的API,即libspeexdsp。在1.2rc3版本中,speex中和编码无关的部分被分离出来作为单独的库-libspeexdsp,在speexdsp压缩包里面。这个库包含了预处理(去噪在里面),回声消除,jitter buffer和重采样。UNIX系统中可以通过添加-lspeexdsp -lm到编译器命令行链接到一个program  
  27.   
  28. 6.1节中 Preprocessor  
  29. 要在程序中使用speex preprocessor,需要添加头文件  
  30. #include <speex/speex_preprocess.h>  
  31.   
  32. 然后创建preprocessor state的方式为:  
  33. SpeexPreprocessState*preprocess_state=speex_preprocess_state_init(frme_size,sampling_rate);  
  34.   
  35. frme_size建议设置为和编码器相同的值,对每个输入的帧,应该这样声明:  
  36. speex_preprocess_run(preprocess_state, audio_frame);   
  37.   
  38. 这里的audio_frame在输入和输出中都被使用,在输出音频对某一帧没有用处的情况下,可以使用:  
  39.   
  40. speex_preprocess_estimate_update(preprocess_state, audio_frame);   
  41.   
  42. 这将更新所有预处理器内部状态变量,而不用计算输出音频,因此节省CPU计算时间。  
  43.   
  44. 预处理器的方式更改为:  
  45. speex_preprocess_ctl(preprocess_state, request, ptr);   
  46.   
  47. 这和编码、解码器使用的方式相同,具体选项在6.1.1节中,这个预处理器的状态能被销毁:  
  48. speex_preprocess_state_destroy(preprocess_state);   
  49.   
  50. 6.1.1  
  51.   
  52. As with the codec, the preprocessor also has options that can be controlled using an ioctl()-like call. The available options are:  
  53.   
  54. 和编解码器相同,预处理器可以使用ioct1()-like声明,选项为:  
  55. SPEEX_PREPROCESS_SET_DENOISE Turns denoising on(1) or off(2) (spx_int32_t)  
  56. SPEEX_PREPROCESS_GET_DENOISE Get denoising status (spx_int32_t)  
  57. SPEEX_PREPROCESS_SET_AGC Turns automatic gain control (AGC) on(1) or off(2) (spx_int32_t)  
  58. SPEEX_PREPROCESS_GET_AGC Get AGC status (spx_int32_t)  
  59. SPEEX_PREPROCESS_SET_VAD Turns voice activity detector (VAD) on(1) or off(2) (spx_int32_t)  
  60. SPEEX_PREPROCESS_GET_VAD Get VAD status (spx_int32_t)  
  61. SPEEX_PREPROCESS_SET_AGC_LEVEL  
  62. SPEEX_PREPROCESS_GET_AGC_LEVEL  
  63. 19  
  64. 6 Speech Processing API (libspeexdsp)  
  65. SPEEX_PREPROCESS_SET_DEREVERB Turns reverberation removal on(1) or off(2) (spx_int32_t)  
  66. SPEEX_PREPROCESS_GET_DEREVERB Get reverberation removal status (spx_int32_t)  
  67. SPEEX_PREPROCESS_SET_DEREVERB_LEVEL Not working yet, do not use  
  68. SPEEX_PREPROCESS_GET_DEREVERB_LEVEL Not working yet, do not use  
  69. SPEEX_PREPROCESS_SET_DEREVERB_DECAY Not working yet, do not use  
  70. SPEEX_PREPROCESS_GET_DEREVERB_DECAY Not working yet, do not use  
  71. SPEEX_PREPROCESS_SET_PROB_START  
  72. SPEEX_PREPROCESS_GET_PROB_START  
  73. SPEEX_PREPROCESS_SET_PROB_CONTINUE  
  74. SPEEX_PREPROCESS_GET_PROB_CONTINUE  
  75. SPEEX_PREPROCESS_SET_NOISE_SUPPRESS Set maximum attenuation of the noise in dB (negativespx_int32_t  
  76. )  
  77. SPEEX_PREPROCESS_GET_NOISE_SUPPRESS Get maximum attenuation of the noise in dB (negativespx_int32_t  
  78. )  
  79. SPEEX_PREPROCESS_SET_ECHO_SUPPRESS Set maximum attenuation of the residual echo in dB (negative spx_int32_t  
  80. )  
  81. SPEEX_PREPROCESS_GET_ECHO_SUPPRESS Set maximum attenuation of the residual echo in dB (negativespx_int32_t  
  82. )  
  83. SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE Set maximum attenuation of the echo in dB when near  
  84. end is active (negative spx_int32_t)  
  85. SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE Set maximum attenuation of the echo in dB when near  
  86. end is active (negative spx_int32_t)  
  87. SPEEX_PREPROCESS_SET_ECHO_STATE Set the associated echo canceller for residual echo suppression (pointer  
  88. or NULL for no residual echo suppression)  
  89. SPEEX_PREPROCESS_GET_ECHO_STATE Get the associated echo canceller (pointer)  
  90.   
  91.   
  92.   
  93. Eclipse库中添加speexdsp的步骤:  
  94.   
  95. 添加Include链接:Project->Property->C/C++ Build->Setting->Tool Settings->GCC C Compiler->Includes,将编译好的include/speex目录放进来。  
  96. 添加静态库:Project->Property->C/C++ Build->Setting->Tool Settings->GCC C Linker->Miscellaneous->other Objects:在文件系统中找到**.a加入。这里添加静态库编译没有通过,动态库才通过。  
  97.   
  98.   
  99. 静态库编译报错以后,就编译的动态库,如果编译的是动态库,就需要添加动态库:Project->Property->C/C++ Build->Setting->Tool Settings->GCC C Linker->Libraries  
  100. 其中Libraries.so的动态库名称,Librarysearch path是包含动态库的路径  
  101.   
  102. 编写c文件时,speexdsp_config_types.h增加#include <stdint-gcc.h>头文件  
  103.   
  104.   
  105.   
  106. main.c   
  107.   
  108. #include <stdio.h>  
    #include <stdlib.h>  
    #include <stdint.h>  
    #include <assert.h>  
    #include <string.h>  
    #include <stdbool.h>  
    #include <speex/speex_preprocess.h>  
      
    #define HEADLEN 44  
    #define SAMPLE_RATE   (16000) #采样率  
    #define SAMPLES_PER_FRAME  (1024) #每帧的采样数  
    #define FRAME_SIZE   (SAMPLES_PER_FRAME * 1000/ SAMPLE_RATE) #每帧的时长ms  
    #define FRAME_BYTES  (SAMPLES_PER_FRAME)   
    //typedef enum {false, true} bool;  
    char *splitword(char *word,char *neword){    
        char *out="out_";  
        for(int j=0;j<strlen(word)+4;j++){  
            if (j<4)  
                neword[j]=out[j];  
            else  
                neword[j]=word[j-4];  
        }  
        return neword;  
    }  
    int main(int argc,char ** argv){  
        size_t n = 0;  
        FILE *inFile, *outFile;  
        char * copy = malloc(sizeof(char)*(strlen(argv[1]) + 1));  
        strcpy(copy, argv[1]);  
        char *neword;  
        neword=(char *)malloc(strlen(argv[1])+4);  
        char *output=splitword(copy,neword);  
      
        inFile=fopen(argv[1], "rb");  
        outFile=fopen(output, "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 = 9000;  
        speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_AGC_LEVEL, &i);  
    //    i = 10000;  
    //    speex_preprocess_ctl(state, SPEEX_PREPROCESS_SET_DEREVERB, &i);  
        //静音检测的效果一般  
        /*  
        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;  
    }  

  109. 编译以后的使用方法   
  110.   
  111. ./可执行文件 *.wav  
  112. Speex文档:https://www.speex.org/docs/api/speex-api-reference/modules.html  
  113. 参考的内容:  
  114. https://blog.csdn.net/zsJum/article/details/7555025  
  115. https://blog.csdn.net/fireroll/article/details/83347795  

 类似资料: