从科幻到现实:用说话编辑图片
「把这张照片的背景换成海边,然后给人物加一点复古滤镜」——以前这需要打开 Photoshop,熟练操作各种工具。现在,你只需要对着麦克风说出来,AI 帮你完成。
这篇教程演示如何用 Google Gemini API 实现「语音控制图像编辑」工作流。
需要的工具
| 工具 | 说明 |
| Python 3.10+ | 运行脚本 |
| Google AI Studio | 获取 Gemini API Key |
google-generativeai | Gemini 官方 Python SDK |
SpeechRecognition | 语音转文字 |
Pillow | 图像处理 |
pyaudio | 麦克风录音 |
Step 1:获取 Gemini API Key
- 访问 Google AI Studio
- 登录 Google 账号
- 点击「Get API key」→「Create API key」
- 复制 API Key 备用
免费额度:Gemini 1.5 Flash 每分钟 15 次请求,每天 1500 次,适合个人项目。
Step 2:安装依赖
bash
pip install google-generativeai SpeechRecognition Pillow pyaudio requests在 Mac 上安装 pyaudio 可能需要:
bash
brew install portaudio
pip install pyaudioStep 3:核心代码
voice_image_editor.py
python
import speech_recognition as sr
import google.generativeai as genai
from PIL import Image
import base64
import io
import os
# 配置 API Key
genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))
# 使用 Gemini 1.5 Flash(支持图像理解)
model = genai.GenerativeModel('gemini-1.5-flash')
def capture_voice_command():
"""录制语音并转换为文字"""
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("🎤 正在监听,请说出你的指令...")
recognizer.adjust_for_ambient_noise(source, duration=1)
audio = recognizer.listen(source, timeout=10, phrase_time_limit=15)
try:
# 使用 Google Speech Recognition(免费)
command = recognizer.recognize_google(audio, language='zh-CN')
print(f"📝 识别到指令: {command}")
return command
except sr.UnknownValueError:
print("❌ 无法识别语音,请重试")
return None
except sr.RequestError as e:
print(f"❌ 语音识别服务错误: {e}")
return None
def image_to_base64(image_path: str) -> str:
"""将图像转换为 base64 格式"""
with open(image_path, 'rb') as f:
return base64.b64encode(f.read()).decode('utf-8')
def edit_image_with_gemini(image_path: str, instruction: str) -> str:
"""
使用 Gemini 分析图片并给出编辑指令,
返回 Python 代码用于执行编辑操作
"""
img = Image.open(image_path)
prompt = f"""
你是一位专业的图像处理工程师。
用户想要对这张图片执行以下操作:{instruction}
请生成完整的 Python Pillow 代码来实现这个操作。
要求:
1. 只输出可直接运行的 Python 代码,不要任何解释
2. 输入图片变量名为 img(PIL.Image 对象)
3. 输出图片变量名为 result_img
4. 如果操作无法用 Pillow 实现,输出 # UNSUPPORTED
代码示例格式:
from PIL import ImageFilter, ImageEnhance
result_img = img.filter(ImageFilter.BLUR)
"""
# 准备图像数据
img_bytes = io.BytesIO()
img.save(img_bytes, format='PNG')
img_bytes.seek(0)
image_part = {
"mime_type": "image/png",
"data": base64.b64encode(img_bytes.read()).decode('utf-8')
}
response = model.generate_content([prompt, image_part])
return response.text
def execute_edit(image_path: str, code: str) -> Image.Image:
"""执行 Gemini 生成的编辑代码"""
img = Image.open(image_path)
# 安全执行(仅允许 PIL 操作)
local_vars = {'img': img, 'Image': Image}
# 导入常用 PIL 模块
from PIL import ImageFilter, ImageEnhance, ImageOps
local_vars.update({
'ImageFilter': ImageFilter,
'ImageEnhance': ImageEnhance,
'ImageOps': ImageOps,
})
try:
exec(code, {'__builtins__': {}}, local_vars)
return local_vars.get('result_img', img)
except Exception as e:
print(f"❌ 执行编辑失败: {e}")
return img
def main():
"""主循环"""
print("🖼️ AI 语音图像编辑器")
print("=" * 40)
# 选择要编辑的图片
image_path = input("请输入图片路径(例如 photo.jpg):").strip()
if not os.path.exists(image_path):
print(f"❌ 找不到文件: {image_path}")
return
print(f"✅ 已加载图片: {image_path}")
print("\n可用指令示例:")
print(" - 把图片变成黑白")
print(" - 增加亮度,让图片更明亮")
print(" - 添加模糊效果")
print(" - 旋转 90 度")
print(" - 增强对比度")
print("\n输入 'quit' 退出\n")
current_image = image_path
save_count = 0
while True:
print("🎤 请说出你的编辑指令(或按 Enter 用键盘输入):")
use_keyboard = input().strip()
if use_keyboard.lower() == 'quit':
break
if use_keyboard:
command = use_keyboard
else:
command = capture_voice_command()
if not command:
continue
print(f"\n⚙️ 正在处理指令: {command}")
# 调用 Gemini 生成编辑代码
code = edit_image_with_gemini(current_image, command)
if '# UNSUPPORTED' in code:
print("❌ 该操作暂不支持,请尝试其他指令")
continue
# 清理代码(去除 markdown 代码块标记)
code = code.replace('```python', '').replace('```', '').strip()
print(f"📝 生成的代码:\n{code}\n")
# 执行编辑
result_img = execute_edit(current_image, code)
# 保存结果
save_count += 1
base_name = os.path.splitext(image_path)[0]
save_path = f"{base_name}_edited_{save_count}.png"
result_img.save(save_path)
print(f"✅ 已保存到: {save_path}")
# 询问是否在当前结果上继续编辑
continue_edit = input("是否在此基础上继续编辑?(y/n): ").strip().lower()
if continue_edit == 'y':
current_image = save_path
print("\n✨ 感谢使用!")
if __name__ == "__main__":
main()Step 4:运行
bash
export GEMINI_API_KEY="你的API Key"
python voice_image_editor.py支持的编辑操作
通过 Gemini 理解指令,以下操作都能实现:
| 语音指令示例 | 实现方式 |
| 「变成黑白」 | ImageOps.grayscale() |
| 「增加亮度」 | ImageEnhance.Brightness().enhance(1.5) |
| 「模糊处理」 | ImageFilter.GaussianBlur(radius=5) |
| 「顺时针旋转90度」 | img.rotate(-90, expand=True) |
| 「裁剪成正方形」 | img.crop(...) |
| 「镜像翻转」 | ImageOps.mirror(img) |
| 「增强对比度」 | ImageEnhance.Contrast().enhance(2.0) |
进阶:集成 Gemini 图像生成
Gemini 2.0 支持直接图像生成和编辑。当你的指令超出 Pillow 能力(如「换背景」「风格迁移」)时,可以调用 Gemini 的图像生成能力:
python
# 需要 Gemini 2.0 Imagen 功能(需申请访问权限)
model_gen = genai.ImageGenerationModel("imagen-3.0-generate-001")
result = model_gen.generate_images(
prompt=f"基于原图,{user_instruction}",
reference_image=original_image_base64,
)总结
这个工作流展示了「语音 → 理解 → 执行」的 AI 自动化链路。Gemini 在其中承担了最难的部分:理解自然语言意图并将其翻译为可执行的代码。
随着 Gemini 2.0 Ultra 的多模态能力提升,未来的图像编辑可能真的只需要「说一句话」。