为什么 FLAC 是 AI 语音应用的理想音频格式
我最近构建了 Prosody Coach,这是一个 Python CLI 工具,旨在帮助非英语母语者提高他们的发音。该应用会录制您的语音,使用科学算法(Praat)进行分析,并通过 Google 的 Gemini API 提供 AI 驱动的指导。
我早期必须做出的一个决定是使用哪种音频格式。我以前用过 MP3 和 WAV,但对于这个用例,两者都不太合适。经过一番研究,我选择了 FLAC,事实证明它是完美的选择。
常见音频格式的问题
让我向您解释一下为什么那些常见的格式行不通。
MP3 随处可见。它体积小、兼容性强,非常适合在车里听音乐。但 MP3 是一种有损格式。它会丢弃音频数据以实现压缩。对于语音分析来说,这是一个问题。当您测量低至特定 Hz 频率的音高变化或分析音节时间模式时,您需要保留所有数据。
WAV 则是另一个极端。它完全未压缩,这意味着音质完美。但文件大小非常大。以 16 kHz 单声道录制 30 秒的音频,WAV 格式大约为 1 MB。当您存储多条录音以跟踪进度时,这会迅速累积,并且对于发送到云 API 来说效率低下。
为什么 FLAC 适用于语音应用
FLAC(Free Lossless Audio Codec,无损音频编码)恰到好处。它像 WAV 一样是无损的,意味着您获得了完美的音频保真度。但它使用的压缩算法可以在不丢弃任何数据的情况下将文件大小减少 50-60%。
它的工作原理是:FLAC 使用预测编码。它分析音频波形中的模式,并存储与预测值之间的差异,而不是原始样本。当您解压缩 FLAC 文件时,您会得到与原始音频完全相同的比特流。
对于 Prosody Coach 来说,这意味着:
- 准确的音高分析:测量音高(75-500 Hz 范围)的 Praat 算法获得了干净、未压缩的数据
- 精确的时间测量:音节检测和节奏分析(nPVI 计算)依赖于精确的波形数据
- 更小的存储空间:与 WAV 相比,用户录音占用的空间大约只有一半
- API 兼容性:Google 的 Gemini API 原生接受 FLAC,MIME 类型为
audio/flac
Prosody Coach 中的实现
Prosody Coach 中的音频管道工作流程如下:
- 以 16 kHz 采样率从麦克风录制(最适合语音)
- 以 float32 格式捕获,以实现处理灵活性
- 修剪开头和结尾的静音
- 保存为 FLAC 格式进行存储
- 为了进行 AI 分析,将音频转换为 base64 编码的 FLAC 并发送到 Gemini
保存录音的代码如下所示:
import soundfile as sf
def save_recording(audio_data, sample_rate, filepath):
sf.write(filepath, audio_data, sample_rate, format='FLAC')
以及发送到 Gemini API 的代码:
import base64
import io
def prepare_audio_for_api(audio_data, sample_rate):
buffer = io.BytesIO()
sf.write(buffer, audio_data, sample_rate, format='FLAC')
buffer.seek(0)
return base64.b64encode(buffer.read()).decode('utf-8')
soundfile 库处理 FLAC 编码,生成的 base64 字符串直接与 audio/flac MIME 类型一起发送到 Gemini。
实时流式传输:不同的情况
有一个有趣的例外:对于使用 Gemini Live API 的实时反馈会话,我使用原始 PCM 而不是 FLAC。实时流式传输需要最小的延迟,对每 100 毫秒的音频块进行 FLAC 编码/解码会增加不必要的开销。
对于流式传输,音频会被转换为 16 位 PCM:
import numpy as np
def convert_to_pcm(audio_float32):
# Convert float32 [-1.0, 1.0] to int16 [-32768, 32767]
return (audio_float32 * 32767).astype(np.int16).tobytes()
因此,格式的选择取决于上下文:存储和批量分析使用 FLAC,实时流式传输使用 PCM。
何时使用 FLAC
根据我构建 Prosody Coach 的经验,当出现以下情况时,FLAC 是合理的选择:
- 您需要保留音频质量以供分析或处理
- 存储空间很重要,但您不能牺牲保真度
- 您正在向支持 FLAC 的 API 发送音频(Google 的 AI 服务支持)
- 您想要一个开放的、免版税的格式
如果文件大小是首要考虑因素(请使用有损格式),或者您需要具有最小延迟的实时编码(请使用 PCM),那么 FLAC 可能不是最佳选择。