为了账号安全,请及时绑定邮箱和手机立即绑定

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

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创意变为现实!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消