来源:金山云,作者 | 彭斌

01

背 景

在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样,比如演唱类的直播间中, 主播伴随着背景音乐演唱。这时有些主播就会希望能够给自己声音增加混响的效果, 营造出在舞台剧场等环境下演唱的氛围。再比如有些搞笑类的直播间, 主播会希望给自己的声音添加变声的效果, 女变男,男变女或者变成机器人等等。为了实现这些需求我们需要对采集的声音进行处理, 并且考虑到让主播实时听到这些处理后的效果,以便根据效果进行调整,我们也需要提供低延时的回放,将变化后的声音播放给主播听,对声音处理的方案比较多, 这里介绍一下金山云直播SDK中所采用的基于iOS提供的AudioUnit的方案。

iOS系统提供了非常丰富的音频相关的API,涵盖了从采集,处理到播放等各个环节,并且按照需求的层次进行了分组。

图1. Core Audio Overview

其中,离底层的驱动和硬件最近的就是AudioUnit系列的API,很多其他高层的API,都是对AudioUnit的封装,比如 AVFoundation、AudioQueue、AVAudioEngine等。

•   缺点:

– 涉及到的专有概念比较多,接口复杂

– 提供C风格的API

•   优点:

– 低延时,从采集到播放回环可以到10ms的级别

– 可以动态变更配置组合

– 可以直接获得后台执行权限

02

AudioUnit 简介

AudioUnit这个名字取得还是比较形象的,它的主体就是一系列的unit,不同unit能够实现不同的功能,将一个或多个unit添加到AUGraph(Audio Processing Graph)中,并建立unit之间的连接,音频数据顺次通过各个节点即可完成我们最终需求。

图2. AudioUnit in iOS

iOS系统一共提供了如下4类unit。

其中,I/O主要负责和设备打交道,比如采集和播放; Mixing负责将不同来源的音频数据进行混合; Effect是对音频数据进行音效处理; Format Conversion主要是进行格式转换比如重采样等。这里有一个优化的点是音频格式转换 Multichannel Mixer 本身就能够实现格式转换的功能,输入和输出的音频数据格式可以不同,利用这一点可以节省一个格式转换unit。

03

使用AudioUnit进行音频采集

在直播应用中,我们主要是使用Remote I/O unit来进行采集工作。在一个AUGraph中只允许有一个I/O unit。Remote I/O 需要同时负责采集和播放的功能。当用户开启耳返功能时,要将采集到的声音,处理之后再送回当前节点直接播放,这样可以将采集和播放的延时控制在50ms以内,主播才察觉不到声音的延时。基本的步骤如下:

1.  实例化AUGraph,将用到units添加进去;

2. 配置每个AudioUnit的属性;

3. 设置Render Callback Function;

4.将units 建立连接;

5.启动AUGraph。

以上过程大家都可以到Apple官方的文档中找到具体的说明和代码示例。

在直播录制中比较关键的一步就是Render Callback Function。

AudioUnit每次都是处理一段音频数据,每次处理完成一段数据的时候,这个回调函数就会被调用一次。在这个回调函数中,通过AudioUnit的AudioUnitRender方法,可以AUGraph中的某一个节点中获取到一段处理后的音频PCM数据。同时,如果需要进行耳返播放,在这个回调中也需要将取得的音频数据送入到回调函数的最后一个参数ioData对应的buffer中。

在设置unit的属性时,需要注意的是一些公共的属性。比如音频格式属性和MaximumFramesPerSlice。如果音频格式设置错误,往往会出现AUGraph启动失败或者声音异常等问题。比如,使用iOS内置的麦克风或者有线耳机时,设备支持的采样率比较高,44.1KHz 能正常工作,我们整条音频通路上基本上都采用的是44.1KHz。但是当使用蓝牙设备时,一般蓝牙设备无法支持44.1KHz采集和播放,通常都是16KHz甚至更低。此时I/O Unit无法继续使用之前的配置。需要按照实际支持的采样率进行配置。

AudioUnit还要求两个单元衔接处的音频数据格式必须保持一致,当AUGraph中不同unit支持的格式不同时(比如在支持蓝牙设备或者使用回声消除模块时,I/O unit要求的格式和其他单元的有可能不同),此时就需要分别设置格式,并通过格式转换unit或mixer unit对格式进行转换。

如果MaximumFramesPerSlice设置错误,可能会出现声音异常的情况。MaximumFramesPerSlice表示的是每次回调送入或取出的音频数据的长度,在AUGraph的所有节点的这个属性也需要保持一致否则会导致有的unit丢弃数据,而出现声音异常。

04

使用AudioUnit进行音效处理

这里所谓的音效处理,主要是指对原本的声音进行一些改变,比如混响效果,变声效果等。用到手段主要是数字信号处理提供的一系列时间和频域的工具,将输入的PCM数据经过运算后得到变化后的声音。

4.1 混响效果(reverberation)

我们在音乐厅,剧院,礼堂等比较空旷的室内说话或唱歌时,往往能听到和平时不一样的声音,主要是声音在墙壁上多次反射后叠加在一起,听起来就有了混响的效果。在声音处理中,我们可以人为的将声音缓存起来,延时一定时间后,和原声音叠加,就能够模拟出混响的效果。AudioUnit提供了 kAudioUnitSubType_Reverb2来实现混响效果的生成。

将该unit接入到AUGraph中之后,配置参数即可实现混响的效果。虽然混响原理是比较简单,但实际上为了模拟自然界中实际的音效,计算过程还是相当复杂的,要模拟出不同的大小的空间,不同材质的墙壁,障碍物的多少,需要输入比较多的参数来参与运算。iOS的reverb unit提供了7个参数。我们在直播应用中提供了4个不同场景的模拟(录音棚,演唱会,KTV,小舞台),主要是通过调整如下参数实现的:

•  kReverb2Param_DryWetMix混响效果声的大小 与空间大小无关,而只与空间内杂物的多少以及墙壁及物体的材质有关;

•  kReverb2Param_DecayTimeAt0Hz /                            kReverb2Param_DecayTimeAtNyquist 衰减时间,整个混响的总长度,与空间大小比较相关,越空旷越长。

4.2 变声效果

变声效果主要是在频域上对人的声音进行一定的处理,我们知道男声一般比较低沉,女声比较尖锐,这个主要说的是音调。通过对声音音调的调整,可以 让低沉的男声听上去像尖锐女声。iOS提供了kAudioUnitSubType_NewTimePitch的unit来实现音调的调整。值得注意的是 kAudioUnitSubType_NewTimePitch 不是输入Effect类的,而是属于 FormatConverter类的。通过设置TimePitch unit的kNewTimePitchParam_Pitch属性即可。

•  变男声,需要强化突出低沉的特点,将音调调低,设置负数参数即可;

•  变女声,需要强化突出尖锐的特点,将音调调高,设置正数即可;

•  机器人音效,机器人的音效是一个组合效果,我们印象中的机器人音效都是老电影中的那种,音调比较高,而且有重音。所以我们采用的是TimePitch unit +Delay unit的方式。Delay unit也是iOS提供的一个将声音延时叠加的unit,但是比混音要简单很多,只有单次叠加;

•  庄严宏大音效,想象一下佛祖之类的声音,一般都是自带回声,而且比较男性化,所以我们选择的是TimePitch unit + Reverb unit的方式来实现。

这里推荐一个自己调音效的参考软件 voxal voice changer。大家可以在这个软件上自己将不同的工具组件组合起来,调试参数,实时听到参数对应的结果。当效果满意后再移植到AudioUnit中。

图3 voixal voice changer

05

总 结

以上大概介绍了怎么用AudioUnit来实现iOS直播中的音频采集,怎么使用AudioUnit中的音效组件来实现混响和变声效果。但是AudioUnit的潜力还远没有挖掘完,比如还可以将背景音乐播放,混音,回声消除等其他移动多媒体音频相关的功能纳入到这个框架中。

金山云致力于提供业内一流的多媒体SDK,覆盖直播、短视频等50多项功能,涵盖视频拍摄、视频导入、美颜滤镜、背景音乐、倍速录制、断点续拍及回删、MV主题包、转场、片头/片尾、片段编辑、动图/静图、字幕及气泡字幕等。通过底层模块组件化、上层模块源码化,交付强大多媒体功能的同时,助力企业3小时快速对接。在快速变化的视频行业,基于金山云SDK能应对AR贴纸、肢体识别、在线娃娃机和直播答题等多种展现形式的视频业务,让APP紧跟行业发展潮流。

技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

推荐阅读:

音视频面试基础题

OpenGL ES 学习资源分享

一文读懂 YUV 的采样与格式

OpenGL 之 GPUImage 源码分析

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

iOS音频采集技术解读:如何实现男女变声的音效?相关推荐

  1. Windows上的音频采集技术比对

    [转]Windows上的音频采集技术 转自http://blog.csdn.net/wxl1986622/article/details/44230149 前一段时间接到一个任务,需要采集到声卡的输出 ...

  2. Windows上的音频采集技术

    在制作发布端的时候,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音,对于音频处理的技术,主要有如下几种: 采集麦克风输入 采集声卡输出 将音频数据送入声卡进行播放 对多路音频输入进行混音处理 ...

  3. iOS音频采集过程中的音效实现

    1.背景 在移动直播中, 声音是主播和观众互动的重要途径之一, 为了丰富直播的内容,大家都会想要在声音上做一些文章, 在采集录音的基础上玩一些花样. 比如演唱类的直播间中, 主播伴随着背景音乐演唱. ...

  4. Windows平台音频采集技术介绍

    音频处理的相关技术: 采集麦克风输入 采集声卡输出 将音频数据送入声卡进行播放 对多路音频输入进行混音处理 在Windows操作系统上,音频处理技术主要是采用微软提供的相关API:Wave系列API函 ...

  5. 【VS开发】Windows上的音频采集技术

    前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦克风的输入信号进行混音. 之前一直没有研究过音频的相关技术,这次就顺便抽出一点时间去了解了一下Windows上采集音频的相关技术. 对于音频处 ...

  6. matlab中男女变声变调,变声软件哪个好-怎样让男女声进行变换操作

    相信很多的小伙伴都有录音的习惯,比如心情好的时候在家里吼上两首,虽然是杀猪般的声音,我装作没听见!咳咳,言归正传.我们何不把录音变声,即是女声变男声,又或者是男声变女声,想想就觉得好玩有木有,哈哈 ! ...

  7. 【开源项目】AI Vtuber 一个由多LLM驱动的虚拟主播,可以在Bilibili/抖音 直播中与观众实时互动或本地聊天。使用多种TTS技术并可进行AI变声。通过特定指令协同SD绘图。并有循环文案

    AI Vtuber ✨ AI Vtuber ✨ AI Vtuber是一个由 ChatterBot/GPT/Claude/langchain本地or云端/chatglm/text-generation- ...

  8. android手机采集,Android手机直播之采集技术分析

    近两年来直播行业越来越火,图玩智能科技为企业提供直播平台二次开发服务以及各类app的开发,欢迎随时咨询www.toivan.com. 作为Android手机直播的研发,本着技术分享的精神,现在写一系列 ...

  9. 百度语音技术助力“变声神器”让社交更有趣

    价值成果 在百度语音技术的助力下,"变声器"APP通过语音识别能够准确将用户说的话转成文字,并通过语音合成技术,将文字合成多种特色语音对外输出.同时,可根据场景需求对语速.语调等参 ...

  10. 怎样将音频变声?1分钟教你音频变声怎么弄!

    大家平常爱不爱刷短视频呢?不知道你们看短视频的时候有没有注意到,一些视频的配音很是搞怪,常常让人捧腹大笑!那么这些声音是怎么制作出来的呢?其实大部分的搞怪配音,都是借助软件对音频进行变音来实现的~今天 ...

最新文章

  1. Python基本语法_运算符详解
  2. python跟php如何共用mysql_Python 3 多个函数共用一个mysql连接
  3. Ubuntu16.04安装CDH
  4. 干翻Java_Java第三次作业第一题
  5. 云计算中HMI的三大优点
  6. Jensen不等式及其证明
  7. ABP后台服务之作业调度Quartz.NET
  8. web工程was部署
  9. Pycharm 远程连接服务器(ssh)运行深度学习代码 | 详细步骤
  10. iwemeta元宇宙:阿里首任COO:如何打造销售铁军
  11. STM32超低功耗入门之低功耗运行模式
  12. 【C语言】字符串数组按字典升序
  13. 动态规划旅游问题:汽车加满油可以跑n千米,中途有若干个加油站,请用动态规划的方式求解中途加油次数最少的方案。
  14. Paypal 实现自动订阅
  15. ARM Core WFI/WFE
  16. ORBSLAM3编译生成与应用
  17. Linux中利用sed替换字符
  18. 网站出现403 Forbidden错误及解决方法
  19. 圆弧中点坐标值求解(二维平面三维空间)(3.1增加三维部分)-①
  20. 基于MVC架构的百姓物流管理系统

热门文章

  1. 《SuperMap iDesktop的理论知识》
  2. vb/vb.net开发精粹(14)
  3. 微信公共平台开发接口(一)
  4. wordpress主题模板开发制作教程
  5. 【高等数学】微分与全微分的几何意义的不同
  6. xp服务器远程连接设置方法,Windows XP远程桌面连接设置图解教程
  7. Android 图文数据JSON解析,金山词霸每日一句API的调用
  8. NOIP提高组【JZOJ4809】挖金矿
  9. 商务谈判类毕业论文文献有哪些?
  10. python中国地图代码 上色_用Python绘制中国地图