audiounit变调变速

以下内容为金山云视频云技术团队提供:
变声效果主要是在频域上对人的声音进行一定的处理,我们知道男声一般比较低沉,女声比较尖锐,这个主要说的是音调。通过对声音音调的调整,可以 让低沉的男声听上去像尖锐女声。
iOS 提供了 kAudioUnitSubType_NewTimePitch 的 unit 来实现音调的调整。值得注意的是 kAudioUnitSubType_NewTimePitch 不是输入 Effect 类的,而是属于 FormatConverter 类的。 通过设置 TimePitch unit 的 kNewTimePitchParam_Pitch 属性即可。
/// pitchShift 为具体数值(0 表示不变,负数表明调低沉,正数调尖锐) AudioUnitSetParameter(pitchUnit, kNewTimePitchParam_Pitch, kAudioUnitScope_Global, 0, pitchShift, 0);
•变男声,需要强化突出低沉的特点,将音调调低,设置负数参数即可;
•变女声,需要强化突出尖锐的特点,将音调调高,设置正数即可;
•机器人音效,机器人的音效是一个组合效果,我们印象中的机器人音效都是老电影中的那种,音调比较高,而且有重音。所以我们采用的是 TimePitch unit + Delay unit 的方式。Delay unit 也是 iOS 提供的一个将声音延时叠加的 unit,但是比混音要简单很多,只有单次叠加;
•庄严宏大音效,想象一下佛祖之类的声音,一般都是自带回声,而且比较男性化,所以我们选择的是 TimePitch unit + Reverb unit 的方式来实现。
这里推荐一个自己调音效的参考软件 voxal voice changer。 大家可以在这个软件上自己将不同的工具组件组合起来,调试参数,实时听到参数对应的结果。当效果满意后再移植到 AudioUnit 中。--(文字内容转载)

------以下自测,---有错请指正-----------------

kAudioUnitSubType_NewTimePitch变调

       AudioComponentDescription convertUnitDescription2;
       convertUnitDescription2.componentManufacturer  = kAudioUnitManufacturer_Apple;
       convertUnitDescription2.componentType          = kAudioUnitType_FormatConverter;
       convertUnitDescription2.componentSubType       = kAudioUnitSubType_NewTimePitch;
       convertUnitDescription2.componentFlags         = 0;
       convertUnitDescription2.componentFlagsMask     = 0;
       AUGraphAddNode (auGraph, &convertUnitDescription2, &convertNode2);
       AUGraphNodeInfo(auGraph,convertNode2,NULL,& converterUnit2);
       
 在采集端或者播放端使用都可以;注意数据;
 AUGraphConnectNodeInput  : io(in)---effect/mix-----convert(格式转换,速率,音调等)---io(out)
对于该convert unit,设置一下音频参数
然后调(tiao)音调:只改变调子,音频参数不会受影响
  Float32 pitchShift = 1000;
  AudioUnitSetParameter(convertAudiounit2, kNewTimePitchParam_Pitch, kAudioUnitScope_Global, 0, pitchShift, 0);
//其他选项

kNewTimePitchParam_Rate,

kNewTimePitchParam_Overlap,

kNewTimePitchParam_EnablePeakLocking


2 变速单元

 

Q:Why do we need a varispeed unit?
    //A:If the input device and the output device are running at different sample rates
    //we will need to move the data coming to the graph slower/faster to avoid a pitch change.
kAudioUnitSubType_Varispeed
                    An audio unit that can be used to control playback rate (as the rate is faster, 
                    the pitch is higher). It provides a generic view, so can be used in both a UI 
                    and programmatic context. It also comes in an Offline version so can be used 
                    to process audio files.

2.1变速的同时,调也会有一定的改变。convert unit 与play unit参数相同的时候,设置速率的结果就是变速变调;

2.2可以用来做samplerate下采样(输入的采样率大于输出的采样率)

2.3可以变速的同时改变采样率(unit节点间设置不同的采样率参数,并设置播放速率);

如果是上采样的使用,会报错误,目前没有做深入研究,报错信息如下:kAudioUnitErr_TooManyFramesToProcess : inFramesToProcess=2048, mMaxFramesPerSlice=1156;kAudioUnitProperty_MaximumFramesPerSlice可以改一下容量,但是em....好像没起作用。这个错误出现在输入采样率比输出采样率小,Varispeed unit的采样率是48000,playunit的采样率设置96000诸如此类,会报这个错误,但是与设置的倍速参数无关;

注意事项:

1 Varispeed unit -----connect -----output unit(play unit); 
2 Varispeed unit输入数据采样率与输出数据采样率不同;也可以相同
3 给Varispeed,注册render回调,然后通过回调拿待播放数据

4 kVarispeedParam_PlaybackRate的参数 0.25~4;官方计算方法是:
 err = AudioDeviceGetCurrentTime(This->mInputDevice.mID, &inTS);
 err = AudioDeviceGetCurrentTime(This->mOutputDevice.mID, &outTS);
rate = inTS.mRateScalar / outTS.mRateScalar;

5 速度变了,调子也有变化
6 降采样时候,假设输入数据48K,输出16K,设置PlaybackRate的参数是3,常理来说(普通软件)48K的数据用16k参数播放应该会非常慢,并且时间拉长。但是这个加速的效果确是让数据快速的播放;
7 假设Varispeed unit 与play unit的各个音频参数(streamformat)是一样的,也可以设置播放速度,0.25~4,效果就是变速变调。
8 convert unit Varispeed的速率参数PlaybackRate,与采样率参数没有直接的联系,起码测试结果来看是这样的。
9 可以快放也可以慢放
10 该参数综上就是即可以变速变调,也可以改采样率;


3 kNewTimePitchParam_Rate变速不变调

一般在播放端使用,调用和设置逻辑与kAudioUnitSubType_Varispeed一样,直接可以进行参数替换;

测试快速播放,并未听到明显的音调变化;Varispeed快速播放时候可以听到明显的由低沉变为尖锐;但是imePitchParam_Rate,测试4倍速仍然是低沉的音调;

测试慢速,文件数据播放,音调没有明显变化,语速变慢

速度范围 (1/32) ~ 32倍速;

playdata--register-->rendercallback(kAudioUnitProperty_SetRenderCallback :convertunit timepitch)---connect augraph->(play unit);两个单元的音频format是一致的;

FormatConverter-kAudioUnitSubType_NewTimePitch-kNewTimePitchParam_Rate;

 

一般做变速:1 添加静音或抽帧,会有明显的声音音质下降

                  2改变速率,16K采样率的音频拿8k采样率 去播放,会有明显感觉内容速度变慢了,但是同样的音调也会变得低沉;16K采样率数据用32K采样率参数进行播放,会明显感觉内容语速变快,但是音调也会变得尖锐。

                  3变速不变调

                  4重采样,从16K里取出同等播放时间长度的8K的数据,音质下降,但是音调和语速变慢,数据量减少;

 

posted on 2020-12-24 21:21  邗影  阅读(40)  评论(0编辑  收藏  举报

导航