继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

如何使用Google DeepMind的双子2.0 Flash实时API构建语音互动应用

守着星空守着你
关注TA
已关注
手记 395
粉丝 39
获赞 267

Gemini 2.0

谷歌深度思维的 Gemini 2.0 Flash API 在实时 AI 支持的对话领域中实现了突破性的飞跃。它使开发人员能够构建可以无缝处理实时语音交互的应用程序,提供无与伦比的语音输入和输出的无缝集成。不论是创建客户服务聊天机器人、增强辅助工具,还是开发互动 AI 导师,此 API 是一个坚实的基础。在本文中,我们将探讨 Gemini 2.0 Flash API 的功能,并演示如何有效使用它(Python)。我们将一步步引导您完成实现过程,通过两个不同的脚本 live_test.pyno_queue_version.py,帮助您开始构建动态对话式 AI 解决方案。

在我们继续之前,请先保持联系!不妨在Medium上关注我,并别忘了在我的LinkedIn上与我连接,以获取定期的数据科学和深度学习见解。 🚀📊🤖

前提条件
  1. API密钥: 在Google AI平台上注册以获取你的Google Gemini API密钥。
  2. Python环境: 确保安装了Python 3.8或更高版本。
  3. 依赖项: 安装所需的库。
    pip install websockets pyaudio asyncio

运行此命令来安装websockets、pyaudio和asyncio三个Python库。

  1. 环境变量: 将 API 密钥设置为环境变量。
你的API密钥如下:"your_api_key_here"
脚本的关键特点

两个程序都实现了实时语音交互,但它们的做法有些许差异。

  • **live_test.py**: 使用音频队列功能来管理和播放接收到的音频数据。
  • **no_queue_version.py**: 直接播放接收到的音频流,不使用队列,从而简化了处理过程。
共享组件
  • WebSocket 连接功能: 与 Gemini API 进行通信。
  • 音频采集: 使用 PyAudio 记录用户的语音输入。
  • 音频回放: 将 AI 生成的响应回放给用户。
live_test.py 详细步骤说明
启动
    class GeminiVoice:  
        def __init__(self):  
            self.audio_queue = asyncio.Queue()  # 异步队列
            self.api_key = os.environ.get("GEMINI_API_KEY")  # 获取环境变量中的GEMINI_API_KEY
            self.model = "gemini-2.0-flash-exp"  
            self.uri = f"wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent?key={self.api_key}"  # URI格式为WebSocket连接,包含API密钥
            self.FORMAT = pyaudio.paInt16  # 音频格式
            self.CHANNELS = 1  # 声道数
            self.CHUNK = 512  # 数据块大小
            self.RATE = 16000  # 采样率
  • 音频队列: 存储接收到的音频片段以备播放。
  • API 密钥及模型: 配置访问 Gemini API 所需的密钥和模型。
  • 音频设置: 配置输入和输出参数。
开始连接过程:
    async def start(self):  
        self.ws = await connect(  
            self.uri, additional_headers={"Content-Type": "application/json"}  
        )  
        await self.ws.send(json.dumps({"setup": {"model": f"models/{self.model}"}}))  
        await self.ws.recv(decode=False)  
        print("已经连接到Gemini,现在你可以开始说话了")  
        async with asyncio.TaskGroup() as tg:  
            tg.create_task(self.capture_audio())  
            tg.create_task(self.stream_audio())  
            tg.create_task(self.play_response())
  • WebSocket 连接: 建立与 Gemini 服务的 WebSocket 连接。
  • 任务组: 负责同时管理音频捕获、流传输和播放。
录音
    async def capture_audio(self):  # 捕获音频
        audio = pyaudio.PyAudio()  # 初始化音频流
        stream = audio.open(  
            format=self.FORMAT,  # 音频格式
            channels=self.CHANNELS,  # 音频通道数
            rate=self.RATE,  # 采样率
            input=True,  
            frames_per_buffer=self.CHUNK,  # 每次读取的音频帧数
        )  

        while True:  # 保持循环,持续捕获音频数据
            data = await asyncio.to_thread(stream.read, self.CHUNK)  # 读取音频数据
            data = base64.b64encode(data).decode()  # 将音频数据转换为 base64 编码的字符串
            await self.ws.send(  
                json.dumps(  
                    {  
                        "realtime_input": {  
                            "media_chunks": [  
                                {  
                                    "data": data,  # base64 编码的音频数据
                                    "mime_type": "audio/pcm",  # 音频媒体类型
                                }  
                            ]  
                        }  
                    }  
                )  
            )  # 发送处理后的音频数据到WebSocket
  • 音频记录: 从麦克风获取输入并发送到API。
在线音频
    异步定义 stream_audio(self):  
        async for msg in self.ws:  
            response = json.loads(msg)  
            尝试:  
                audio_data = response["serverContent"]["modelTurn"]["parts"][0]["inlineData"]["data"]  
                self.audio_queue.put_nowait(base64.b64decode(audio_data))  
            除了 KeyError:  
                通过
  • 响应的处理: 解码 API 的音频回复并将其存入队列。
播放回应
    async def play_response(self):  
        audio = pyaudio.PyAudio()  
        # 创建音频流
        stream = audio.open(  
            format=self.FORMAT, channels=self.CHANNELS, rate=24000, output=True  
        )  
        # 无限循环
        while True:  
            data = await self.audio_queue.get()  
            await asyncio.to_thread(stream.write, data)

播放AI生成的音频,就是这个功能。

下面我们会一步步讲解no_queue_version.py这个脚本的内容

no_queue_version.py 脚本直接播放接收到的音频,省去了中间的队列,从而简化了这个过程。

主要区别
  • 简单处理回复:
     async def recv_model_audio(self):  
        audio = pyaudio.PyAudio()  
        stream = audio.open(  
            format=self.FORMAT, channels=self.CHANNELS, rate=24000, output=True  
        )  
        async for msg in self.ws:  
            response = json.loads(msg)  
            try:  
                audio_data = response["serverContent"]["modelTurn"]["parts"][0]["inlineData"]["data"]  
                await asyncio.to_thread(stream.write, base64.b64decode(audio_data))  
            except KeyError:  # 键错误
                pass
运行一下脚本:
  1. 设置环境变量:
export GEMINI_API_KEY="你的API密钥如下"

2. 运行一下脚本:

运行 python live_test.py

3. 对着麦克风说: 脚本会捕捉你的声音输入,然后将其发送到Gemini服务,并然后播放AI的回复。

(Note: The last part "并然后" is redundant, so it should be corrected to just "并".)

Final corrected translation:
3. 对着麦克风说: 脚本会捕捉你的声音输入,然后将其发送到Gemini服务,并播放AI的回复。

结论

使用 Google DeepMind Gemini 2.0 Flash API,您可以构建动态和实时对话支持的创新应用程序。这项尖端技术实现了无缝的音频互动体验,非常适合各种应用场景,如客户支持、互动教程和语言学习。

通过选择不同的 Python 脚本,开发人员可以更好地满足特定需求。选择 live_test.py 可以获得高级队列功能,或者选择 no_queue_version.py 来追求简单。

强大的API功能与Python的灵活性相结合,可以创建高度互动和响应式的应用程序。花些时间去探索脚本,并尝试各种自定义选项,充分发掘AI驱动通信的所有潜力。可能性无穷,借助Gemini 2.0 Flash,您可以将最雄心勃勃的对话式AI创意变为现实!

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP