
本文介绍如何绕过 Google Vertex AI 要求云存储 URI 的限制,直接将本地音频文件(如 MP3、WAV)传入 Gemini-1.5 模型完成语音转录,核心是使用 Part.from_data() 配合二进制读取与 MIME 类型声明。
本文介绍如何绕过 google vertex ai 要求云存储 uri 的限制,直接将本地音频文件(如 mp3、wav)传入 gemini-1.5 模型完成语音转录,核心是使用 `part.from_data()` 配合二进制读取与 mime 类型声明。
Google Vertex AI 的官方示例默认要求音频资源通过 gs:// URI 从 Cloud Storage 加载(如 Part.from_uri("gs://...", "audio/mpeg")),但实际开发中,频繁上传本地音频至云端既低效又增加成本。幸运的是,Vertex AI 的 generative_models.Part 类提供了 from_data() 方法——它接受原始字节数据和明确的 MIME 类型,从而完美支持本地文件直传。
以下是完整、可运行的本地音频转录代码(适配 Gemini-1.5 Flash 或 Pro):
用于在用户想通过浏览器自动化与 Google Gemini 或 ChatGPT 交互时。触发短语包括“ask Gemini”“ask ChatGPT”“ask GPT”“让...”。
import vertexai
from vertexai.generative_models import GenerativeModel, GenerationConfig, Part
import base64
# 初始化 Vertex AI(请替换为你的项目 ID 和区域)
vertexai.init(project="your-project-id", location="us-central1")
model = GenerativeModel("gemini-1.5-flash-002") # 或 "gemini-1.5-pro-002"
prompt = """
请将此访谈音频转录为带时间戳和说话人标识的格式:
[HH:MM:SS] Speaker A: 内容...
[HH:MM:SS] Speaker B: 内容...
若能区分说话人请标注 A/B/C;若无法区分,请统一标为 Speaker X。
"""
# ✅ 关键:读取本地音频文件为 bytes,并显式指定 MIME 类型
audio_path = "./interview.mp3" # 替换为你的本地路径
with open(audio_path, "rb") as f:
audio_bytes = f.read()
# 构建 Part 对象(无需 base64 编解码!更简洁高效)
audio_part = Part.from_data(data=audio_bytes, mime_type="audio/mpeg")
contents = [audio_part, prompt]
# 启用音频时间戳(必需,否则不返回时间信息)
response = model.generate_content(
contents,
generation_config=GenerationConfig(audio_timestamp=True)
)
print(response.text)⚠️ 重要注意事项:
-
MIME 类型必须准确匹配文件格式:MP3 用
"audio/mpeg",WAV 用"audio/wav",FLAC 用"audio/flac"。错误类型会导致400 Bad Request。 - 文件大小限制:Gemini-1.5 Flash 支持最长约 30 分钟音频(取决于模型版本与上下文长度),超长文件需预分割。
-
无需 base64 中转:答案中提到的“先编码再解码”是冗余操作;
Part.from_data()直接接收bytes,应避免无谓的base64.b64encode/decode循环(既降低性能,又可能引入编码错误)。 -
认证与权限:确保服务账号拥有
roles/aiplatform.user权限,且已配置有效的 Application Default Credentials(如gcloud auth application-default login)。
总结:通过 Part.from_data(data=bytes, mime_type=...),你完全跳过了云存储依赖,实现端到端本地音频处理。这是生产环境快速验证、隐私敏感场景及离线调试的理想方案。

















