我的工程师爸爸 - 音频应用DIY系列之四:慢速英语

本文记录了一位工程师父亲如何利用音频处理技术,通过调节节拍(tempo)来减慢学校英语听力材料的速度,以帮助女儿提高听力理解。通过soundtouch库和实时播放及文件转换路由,实现了从signed 16bit integer格式到float数据的转换,并最终将音频减速至0.8倍速。
摘要由CSDN通过智能技术生成

女儿:爸爸,最近我在练英语听力,可是学校发的听力课文说的太快了,我听不懂,能让听力语音说慢点吗?

爸爸:嗯… 这个容易,马上给你做一个。

<思路>

  • 调节节拍(tempo)可实现减速或加速播放,同时声音不变调。
  • 先做一个实时播放的路由,实时调节节拍(tempo),当女儿觉得节拍速度OK了,把这个节拍的参数记住,再做一个文件到文件的转换路由,并应用此节拍参数。
  • 因为soudtouch只吃float数据,听力材料是signed 16bit integer格式,所以在其前加一个格式转换器。

图4-1

<代码实现>

MyEngineerDaddy_3.cpp的基础上做简单修改,变成MyEngineerDaddy_4-1.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 = 44100;
    const lark::SampleFormat format = lark::SampleFormat::S16_LE;
    const unsigned int chNum = 1;
    const unsigned int frameDuration_ms = 20;
    const lark::samples_t frameSizeInSamples = frameDuration_ms * rate / 1000;

    // 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 = "libblkfilereader" SUFIX;
    lark::Parameters args;
    args.push_back("./english_listening_material-44100Hz-S16_LE-1ch.pcm");
    lark::Block *blkFileReader = playbackRoute->NewBlock(soFileName, true, false, args);
    if (!blkFileReader) {
   
        KLOGE("Failed to new a block from %s", soFileName);
        return -1;
    }

    soFileName = "libblkformatadapter" SUFIX;
    lark::Block *blkFormatAdapter0 = playbackRoute->NewBlock(soFileName, false, false);
    if (!blkFormatAdapter0) {
   
        KLOGE("Failed to new a block from %s", soFileName);
        return -1;
    }

    soFileName = "libblksoundtouch" SUFIX;
    lark::Block *blkSoundTouch = playbackRoute->NewBlock(soFileName, false, false);
    if (!blkSoundTouch) {
   
        KLOGE("Failed to new a block from %s", soFileName);
        
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值