我的工程师爸爸 - 音频应用DIY系列之二:回音版变声话筒

为了满足女儿的要求,工程师爸爸在原有的变声话筒上增加了回声效果。通过将回声器加入录音线程,并使用sox effect进行处理,同时处理音频格式适配。经过编译运行,成功实现了“啊”一声后持续回声的效果,获得了女儿的认可。
摘要由CSDN通过智能技术生成

女儿:可是…您做的变声话筒感觉少了点什么…

爸爸:少了啥?

女儿:就是那种可以"啊"一声之后,能连续发出"啊啊啊"的那种效果。

爸爸:明白了,加个回声器!

<思路>

  • 回声器可以加在录音线程中也可以加在播放线程中。既然播放线程已经有soundtouch块做变调了,那就把回声器加在录音线程吧,让负载均衡点。
  • 回声器采用sox effect,而sox effect输入输出均为int32_t,而整个链路的音频格式是float,所以还需要在其前后分别加上一个格式适配器。
    图2-1

<代码实现>

MyEngineerDaddy_1.cpp的基础上简单修改一下,变成MyEngineerDaddy_2.cpp

#include <lark/lark.h>
#include <klogging.h>

#if defined(__APPLE__)
#define SUFIX ".dylib"
#elif defined(_WIN32)
#define SUFIX ".dll"
#else
#define SUFIX ".so"
#endif

int main()
{
   
    const unsigned int rate = 16000;
    const lark::SampleFormat format = lark::SampleFormat_FLOAT;
    const unsigned int chNum = 1;
    const unsigned int frameDuration_ms = 20;
    const lark::samples_t frameSizeInSamples = frameDuration_ms * rate / 1000;

    lark::FIFO *fifo = lark::Lark::Instance().NewFIFO(
                                rate,
                                lark::SamplesToBytes(format, chNum, 1),
                                frameSizeInSamples * 8);
    if (!fifo) {
   
        KLOGE("Failed to new a FIFO");
        return -1;
    }

    // Create the playback route named RouteA
    lark::Route *playbackRoute = lark::Lark::Instance().NewRoute("RouteA");
    if (!playbackRoute) {
   
        KLOGE("Failed to create playbackRoute");
        return -1;
    }

    // Create RouteA's blocks
    const char *soFileName = "libblkstreamin" SUFIX;
    lark::Parameters args;
    args.push_back(std::to_string(rate));
    args.push_back(std::to_string(format));
    args.push_back(std::
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值