如何在 iPhone 的 Core Audio (Audio Unit/ Remote IO) 中将录制的声音更改为男人的声音

Posted

技术标签:

【中文标题】如何在 iPhone 的 Core Audio (Audio Unit/ Remote IO) 中将录制的声音更改为男人的声音【英文标题】:How to change a recorded voice to a man's voice in Core Audio (Audio Unit/ Remote IO) for iPhone 【发布时间】:2010-08-18 15:15:50 【问题描述】:

我是 Core Audio 的新手,我真的迷路了,我正在尝试录制音频,然后对该录音应用语音调制并播放它。我查看了使用音频队列进行音频录制的示例 Speak Here。我被困在如何更改音频样本的部分。我知道可以在回调函数中使用 Audio Unit 来更改音频样本,但我不知道应该对这些样本应用什么来更改它们(改变音高会有帮助吗?)。

如果您可以将我引导到一些源代码或教程或任何解释目标 C 语音调制的网站,真的会帮助我。提前谢谢大家。

【问题讨论】:

相关:***.com/questions/1158950/voice-alteration-algorithm 【参考方案1】:

您在这里尝试做的事情并不是那么简单。基本上,您必须实现声码器(“语音编码器”)来改变声音。 Wikipedia links 应该可以帮助您。

然后,您仍然可以在 CoreAudio 中处理这些样本。你可以使用Audio Queue Services 来做到这一点,但这并不是一个易于使用的 API。实际上,使用更简单的 CoreAudio API 之一并将您的声码器包装在音频单元中可能会更轻松。

您有音频处理方面的经验吗?在没有关于音频处理的先验知识的情况下实现声码器通常是一项艰巨的任务。

【讨论】:

【参考方案2】:

首先,实际回答您的问题:当您调用 AudioQueueNewInput() 函数时,您将向其传递每次数据可用时将调用的例程名称。您可能将其称为 MyInputBufferHandler() 或其他名称。它的第三个参数是一个 AudioQueueBufferRef,它保存传入的数据。

请注意,这并不像查看每个样本(幅度)并降低或提高它那么简单。您接收时域(时间)域中的样本作为幅度。没有可用的音高或频率信息。您需要做的是将传入的样本(波形)移动到频域中,其中该空间中的每个“点”都是一个频率,并且伴随着功率和相位。您可以使用 FFT(快速傅立叶变换)来做到这一点,但数学有些复杂。 Apple 确实在 Acceleration 框架中提供了 FFT 例程,但请注意,您在这里涉水非常深。

【讨论】:

以上是关于如何在 iPhone 的 Core Audio (Audio Unit/ Remote IO) 中将录制的声音更改为男人的声音的主要内容,如果未能解决你的问题,请参考以下文章

iOS:音频单元 vs OpenAL vs Core Audio

使用 Core Audio 从 PCM 原始数据中获取电平值

Core Audio - CARingBuffer 读取音频文件进行回调

如何使用 Core Audio 设置/获取音量级别?

Core Audio 指定要解码的音轨

Core Audio:用于提升信号电平的音频单元