女儿:爸爸,汤姆猫你玩过没?

爸爸:爸爸小时候可喜欢看<猫和老鼠>了,我记得里面那个笨猫就叫汤姆,总是想抓聪明的杰瑞,却总是害到自己。bla…bla…

女儿:不是!我是说那个可以学我说话的汤姆猫,在手机上的!

爸爸:哦,好像是有这么个app。

女儿:对,就是那个app。但是它的广告好多,每次都会误点,特别烦人。您能给我做一个一样的属于我的汤姆猫吗?没广告的!

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

<思路>

  • 这个跟前几天做的变声话筒类似,唯一区别是把回声器换成延时器就可以了。相当于录到的声音等一个固定的时长再播放出来。
  • 由于延时器可以支持float数据格式,所以可以把格式转换器去掉。

<代码实现>

由于这版思路图跟<系列之一>的区别仅仅在于RouteB中加了一个延时器,那么利用lkdb,完全可以在运行MyEngineerDaddy_1的实时对路由进行修改,实时产生效果,而不用重新修改代码重新编译运行。

先运行MyEngineerDaddy_1,此时录音出声。查看路由状态:

$ lkdb status
RouteB is RUNNING, 145 frames processed OK, 0 error frameblkpacapture_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblkstreamout_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameRouteA is RUNNING, 144 frames processed OK, 0 error frameblkstreamin_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblksoundtouch_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frame(O00) --> lnk_1    16000Hz FLOAT_LE  1ch   1040samples/frameblkpaplayback_0(I00) <-- lnk_1    16000Hz FLOAT_LE  1ch   1040samples/framefifo_0 0/2560 (0%)

正常。

观察其中的RouteB,只需要四步即可完成延时器的添加:

  1. 把RouteB里的lnk_0先断开
  2. 在RouteB里添加一个延时器块
  3. 建立blkpacapture_0延时器块的链接
  4. 建立延时器块blkstreamout_0的链接
$ lkdb delete RouteB lnk_0   # 删除RouteB里的lnk_0
Deleted lnk_0                # 删除成功,此时声音自动停止输出
$ lkdb status                # 观察到RouteB里的lnk_0已经被成功删除
RouteB is BROKEN_RUNNING, 472 frames processed OK, 0 error frameblkpacapture_0blkstreamout_0RouteA is RUNNING, 472 frames processed OK, 0 error frameblkstreamin_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblksoundtouch_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frame(O00) --> lnk_1    16000Hz FLOAT_LE  1ch   1040samples/frameblkpaplayback_0(I00) <-- lnk_1    16000Hz FLOAT_LE  1ch   1040samples/framefifo_0 0/2560 (0%)$ lkdb newblock RouteB libblkdelay.so false false   # 在RouteB里添加一个延时器块
Created blkdelay_0 from libblkdelay.so on RouteB
$ lkdb status        # 观察到延时器块(blkdelay_0)已经被添加进RouteB
RouteB is BROKEN_RUNNING, 472 frames processed OK, 0 error frameblkpacapture_0blkstreamout_0blkdelay_0RouteA is RUNNING, 472 frames processed OK, 0 error frameblkstreamin_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblksoundtouch_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frame(O00) --> lnk_1    16000Hz FLOAT_LE  1ch   1040samples/frameblkpaplayback_0(I00) <-- lnk_1    16000Hz FLOAT_LE  1ch   1040samples/framefifo_0 0/2560 (0%)$ lkdb newlink RouteB 16000 FLOAT_LE 1 320 blkpacapture_0 0 blkdelay_0 0    # 建立`blkpacapture_0`到`延时器块`的链接
Created lnk_0 on RouteB
$ lkdb status        # 观察到lnk_0已经被创建来连接blkpacapture_0和blkdelay_0
RouteB is BROKEN_RUNNING, 472 frames processed OK, 0 error frameblkpacapture_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblkstreamout_0blkdelay_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameRouteA is RUNNING, 472 frames processed OK, 0 error frameblkstreamin_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblksoundtouch_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frame(O00) --> lnk_1    16000Hz FLOAT_LE  1ch   1040samples/frameblkpaplayback_0(I00) <-- lnk_1    16000Hz FLOAT_LE  1ch   1040samples/framefifo_0 0/2560 (0%)$ lkdb newlink RouteB 16000 FLOAT_LE 1 320 blkdelay_0 0 blkstreamout_0 0  # 建立`延时器块`到`blkstreamout_0`的链接
Created lnk_1 on RouteB   # 此时声音自动开始输出$ lkdb status       # 观察到lnk_1已经被创建来连接blkdelay_0和blkstreamout_0
RouteB is RUNNING, 554 frames processed OK, 0 error frameblkpacapture_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblkstreamout_0(I00) <-- lnk_1    16000Hz FLOAT_LE  1ch    320samples/frameblkdelay_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frame(O00) --> lnk_1    16000Hz FLOAT_LE  1ch    320samples/frameRouteA is RUNNING, 42917 frames processed OK, 0 error frameblkstreamin_0(O00) --> lnk_0    16000Hz FLOAT_LE  1ch    320samples/frameblksoundtouch_0(I00) <-- lnk_0    16000Hz FLOAT_LE  1ch    320samples/frame(O00) --> lnk_1    16000Hz FLOAT_LE  1ch   1040samples/frameblkpaplayback_0(I00) <-- lnk_1    16000Hz FLOAT_LE  1ch   1040samples/framefifo_0 0/2560 (0%)

女儿:“喂!”,咦,没有延时效果哎?

爸爸:延时器的参数还没设定呢!想延时多久?800毫秒试试?

女儿:嗯嗯~

$ lkdb setparam RouteB blkdelay_0 1 800000
Success

注解:该命令表示对RouteB里的blkdelay_0块做1(delay)参数的设定,设定为800000微秒(即800毫秒)。

女儿:“喂!” … 果然800ms之后才听到"喂!"的声音~

爸爸:再提高音调。

$ lkdb setparam RouteA blksoundtouch_0 1 1.4
Success

爸爸:这样就跟汤姆猫的声音一样啦。

女儿:“喂!” … 哈哈,汤姆猫学我说话了! 好像800毫秒感觉还是快了点,再慢点呢?

爸爸:1.1秒看看。

$ lkdb setparam RouteB blkdelay_0 1 1100000
Success

女儿:这样正好~ 哦耶,我有自己的汤姆猫囖!谢谢爸爸!

lark项目地址:https://gitee.com/wksuper/lark-release

我的工程师爸爸 - 音频应用DIY系列之三:汤姆猫相关推荐

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

    女儿:爸爸,最近我在练英语听力,可是学校发的听力课文说的太快了,我听不懂,能让听力语音说慢点吗? 爸爸:嗯- 这个容易,马上给你做一个. <思路> 调节节拍(tempo)可实现减速或加速播 ...

  2. 我的工程师爸爸 - 音频应用DIY系列之五:音乐创作

    女儿:爸爸,今天我在广场上看到一个人拿一把吉他自弹自唱,非常动听! 爸爸:街头艺人呗. 女儿:他的吉他能发出各种各样神奇的音效,一会儿是起势蓬勃的合唱效果,一会儿是余音绕梁的颤抖效果.您能帮我也买一个 ...

  3. 我的工程师爸爸 - 音频应用DIY系列之六:录音棚

    女儿:爸爸,我最近迷上了翻唱,哎,只是可惜~ 爸爸:可惜啥?? 女儿:可惜这么好听的声音不能跟别人一起分享. 爸爸:作为麦霸还有这种苦恼? 女儿:现场唱当然没问题,但总不能想要分享的时候就拉着朋友们去 ...

  4. 前端实战优秀博客每日学习之-----深入Javascript系列(汤姆大叔的博客)------(一)

    ==装载连接-----代码改变世界-https://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 深入理解Javascript系列(1): ...

  5. OC:不会说话的汤姆猫(2014年12月)未添加音频

    代码下载地址:http://download.csdn.net/detail/ytuzhangziyao/8313977 1.第一种方法 /* 不会说话的汤姆猫 1.图片名放在button的title ...

  6. php diy,PHP DIY 系列------基础篇:1. PSR

    PHP DIY系列–一起手写一个api框架 创作初衷 有没有用烦了CURD? 各种框架是不是有点头大? 有没有尝试自己设计一个框架? 学了PHP语法,没有项目去实战,夯实基础 希望能帮助能让你快速地搭 ...

  7. 树莓派slam_SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——6.树莓派USB与tty串口号绑定...

    摘要 通过前面一系列的铺垫,相信大家对整个miiboo机器人的DIY有了一个清晰整体的认识.接下来就正式进入机器人大脑(嵌入式主板:树莓派3)的开发.本章将从树莓派3的开发环境搭建入手,为后续ros开 ...

  8. SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人"miiboo"中的大部分程序也采用ROS进行开发,所 ...

  9. 富爸爸系列之三富爸爸投资指南

    附件是富爸爸系列之三富爸爸投资指南,希望大家喜欢!!! 转载于:https://blog.51cto.com/zhouzhenhua/158215

  10. 软件测试工程师工作日常100问系列三【乐搏TestPRO】

    上两个系列讲了软件测试基本常识问题,包括软件测试概念.流程及工作日常及需要具备的只是体系.请参阅: 软件测试工程师工作日常100问系列一 软件测试工程师工作日常100问系列二 今天我们来讲讲接口测试在 ...

最新文章

  1. 中国AI服务器,刷新全球18项性能基准测试纪录
  2. wpf 用户自定义事件传参
  3. 基于Salmon的转录组定量流程
  4. 立体匹配十大概念综述---立体匹配算法介绍
  5. Verify an App Store Transaction Receipt 【苹果服务端 验证一个应用程序商店交易收据有效性】...
  6. teablue数据分析_基于大数据分析的茶叶质量评估
  7. MongoDB可视化工具RoboMongo----Windows安装
  8. UVA11192 Group Reverse【水题】
  9. Android 7.0(API 24)以上调用系统安装包问题
  10. 人工智能__一种现代方法 绪论导读
  11. IP属地靠谱吗?或是一把双刃剑
  12. 设置计算机网络密码怎么设置路由器,tplink路由器电脑怎么设置密码?
  13. 白杨SEO:品牌口碑业务指什么?企业品牌口碑如何推广与预防公关危机?
  14. [转贴]馒头的N种吃法
  15. max模型怎么导入ue4_请问max的场景怎么完整导入到ue4?
  16. 盒子模型之免费体验登录页面
  17. Java设计一个类代表二维空间的一个点,设计一个类代表二维空间的一个圆,计算面积,,并写程序验证计算一个点(Point对象)是否在圆(Cricle对象)内
  18. 前端学习笔记02--CSS快速了解
  19. 0504工藤新一生日快乐
  20. tensorflow之pb文件保存与载入

热门文章

  1. How browsers work翻译
  2. js和vue的图片加载完成事件
  3. 计算机毕业设计Java宠物收养管理系统(源码+系统+mysql数据库+lw文档)
  4. Jdbc结果集Map映射
  5. AR手游《悠梦2》再获苹果推荐,下载《网易洞见》可免费试玩
  6. 软件的接口设计图_重磅!PKPM 结构设计软件V5.1正式发布
  7. 基于java SSM的仿哔哩哔哩视频分享系统
  8. java workflow 教程_建议收藏,从零开始创建一个Activiti工作流,手把手教你完成...
  9. 行业分析-全球与中国无线键盘和蓝牙耳机市场现状及未来发展趋势
  10. 解决安装Chrome翻译插件总是报CRX_HEADER_INVALID