树莓派Linux实现ChatGPT语音交互(语音识别,TTS)

打印 上一主题 下一主题

主题 647|帖子 647|积分 1941


前言

ChatGPT利用想必大家都不陌生,进入官网,注册账号即可开始正式的对话聊天,可是如何利用ChatGPT API,且在Linux环境下举行语音交互呢?可巧在今年暑期参加物联网计划竞赛有效到这项功能,本日就来教下大家详细步骤。

一、ChatGPT API获取

如何获取一个ChatGPT账号相比对大家来说不是一件难事,网上教程许多大家可以搜一下,获取到一个账号后,可以进入https://platform.openai.com/account/api-keys页面。

选择创建一个api key 大家一定要生存好这个密钥,后续利用都是利用这个密钥。这里必要注意免费API每个账户都是有限的,五美元,理论上自己日常利用时用不完了的。
二、API利用步骤

接下来就让我们来试验一下API密钥。首先在Linux环境下必要安装openai的包这里我们以树莓派为例。
  1. pip3 install openai
复制代码
成功安装后我们就可以创建一个Python运行一下,而众所周知,ChatGPT是必要必要利用邪术的,API调用也不破例。
  1. # -*- coding: utf-8 -*-
  2. import openai
  3. # 设置OpenAI API密钥
  4. openai.api_key = 'sk-xxxx'#这里需要替换为你的账户API KEY
  5. # 定义初始对话历史
  6. conversation_history = [
  7.     {'role': 'system', 'content': 'You are a helpful assistant.'}
  8. ]
  9. # 循环交互
  10. while True:
  11.     # 处理用户输入
  12.     user_input = input("User: ")
  13.     # 将用户输入添加到对话历史中
  14.     conversation_history.append({'role': 'user', 'content': user_input})
  15.     # 发送聊天请求
  16.     response = openai.ChatCompletion.create(
  17.         model='gpt-3.5-turbo',
  18.         messages=conversation_history,
  19.         max_tokens=100,
  20.         n=1,
  21.         stop=None,
  22.         temperature=0.7
  23.     )
  24.     # 获取助手的回复
  25.     assistant_reply = response['choices'][0]['message']['content']
  26.     # 打印助手的回复
  27.     print("Assistant:", assistant_reply)
  28.     # 将助手的回复添加到对话历史中
  29.     conversation_history.append({'role': 'assistant', 'content': assistant_reply})
  30.     # 检查用户是否选择退出循环
  31.     if user_input.lower() == 'exit':
  32.         break
复制代码
通过以上代码实现简单的API调用,运行。

问出问题,就可以得到你想要的答案。其中的模子大家也可以根据需求选用。
三、语音识别

首先最重要的是外接一个麦克风设备,对外界及时音频举行识别,这里树莓派上利用的无驱的USB麦克风设备。

想要实现真正意义上的语音交互,就只能从及时音频流中读取。
这里我们利用的是Google的语音识别API SpeechRecognition。
首先在终端中安装相关包。
  1. pip3 install SpeechRecognition
复制代码
成功安装,且麦克风设备安装完成,我们就可以进入下一步。
我们利用一个Python程序来举行实现。
  1. import speech_recognition as sr
  2. # 创建一个Recognizer对象
  3. r = sr.Recognizer()
  4. # 使用麦克风录音
  5. with sr.Microphone() as source:
  6.     print("请说话:")
  7.     audio = r.listen(source)
  8. # 将语音转换为文本
  9. try:
  10.     text = r.recognize_google(audio, language='zh-CN')
  11.     print("你说的是:" + text)
  12. except sr.UnknownValueError:
  13.     print("无法识别你的语音")
  14. except sr.RequestError as e:
  15.     print("无法连接到Google API,错误原因:" + str(e))
复制代码
这里是实现及时音频的识别。必要注意的是,speech_recognition的利用也必要Linux环境下的邪术上网。
运行代码会出现许多报错信息,但这些都不影响我们的识别效果。

当体现请说话示例时就可以提出问题了。实测在安静环境下识别速率和识别正确率还是非常高的。
识别返回的效果生存在text中,只要将text赋值给上述GPT的输入即可。
三、TTS(语音合成)

要想实现语音对话,还必要将GPT复兴的问题经过TTS转化为音频。
这里利用的阿里云的Sambert语音合成,实测合成速率很快,且语音天然。
首先必要下载Sambert的包
  1. pip3 install dashscope
复制代码
试验一下
  1. # coding=utf-8
  2. import dashscope
  3. from dashscope.audio.tts import SpeechSynthesizer
  4. dashscope.api_key='your-dashscope-api-key'
  5. result = SpeechSynthesizer.call(model='sambert-zhichu-v1',
  6.                                 text='今天天气怎么样',
  7.                                 sample_rate=48000,
  8.                                 format='wav')
  9. if result.get_audio_data() is not None:
  10.     with open('output.wav', 'wb') as f:
  11.         f.write(result.get_audio_data())
  12. print('  get response: %s' % (result.get_response()))
复制代码
实行代码后就能生成一个output.wav文件,文件内容就是text中问出的问题。
四、音频播放

得到了生成的音频文件,我们还必要将他播放出来。
Linux环境下python播放音频播放我尝过各种方式,末了利用效果最好,延时最低的是利用pygame来播放。
还是以同样的步骤,安装pygame。
  1. pip3 install pygame
复制代码
五、功能整合

将所有功能举行整合,即可实现末了想要实现的功能。
  1. # -*- coding: utf-8 -*-
  2. import openai
  3. import pygame
  4. from pygame import mixer
  5. import dashscope
  6. from dashscope.audio.tts import SpeechSynthesizer
  7. import speech_recognition as sr
  8. import time
  9. # 创建一个Recognizer对象
  10. r = sr.Recognizer()
  11. mixer.init()
  12. # 设置OpenAI API密钥
  13. openai.api_key = 'sk-xx'
  14. dashscope.api_key='sk-xx'
  15. # 定义初始对话历史
  16. conversation_history = [
  17.     {'role': 'system', 'content': 'You are a helpful assistant.'}
  18. ]
  19. # 循环交互
  20. while True:
  21.     # 处理用户输入
  22.     # 使用麦克风录音
  23.     with sr.Microphone() as source:
  24.         print("请开始说话...")
  25.         audio = r.listen(source)
  26.     try:
  27.         # 使用语音识别引擎将音频转换为文字
  28.         text = r.recognize_google(audio, language='zh-CN')
  29.         print("识别结果:", text)
  30.     except sr.UnknownValueError:
  31.         print("无法识别音频")
  32.     except sr.RequestError as e:
  33.         print("请求出错:", e)
  34.     user_input = text
  35.     # 将用户输入添加到对话历史中
  36.     conversation_history.append({'role': 'user', 'content': user_input})
  37.     # 发送聊天请求
  38.     response = openai.ChatCompletion.create(
  39.         model='gpt-3.5-turbo',
  40.         messages=conversation_history,
  41.         max_tokens=100,
  42.         n=1,
  43.         stop=None,
  44.         temperature=0.7
  45.     )
  46.     # 获取助手的回复
  47.     assistant_reply = response['choices'][0]['message']['content']
  48.     result = SpeechSynthesizer.call(model='sambert-zhimiao-emo-v1',
  49.                                 text=assistant_reply,
  50.                                 sample_rate=48000,
  51.                                 format='wav')
  52.     # 打印助手的回复
  53.     print("Assistant:", assistant_reply)
  54.     if result.get_audio_data() is not None:
  55.         with open('output.wav', 'wb') as f:
  56.             f.write(result.get_audio_data())
  57.     mixer.music.load('output.wav')
  58.     mixer.music.play()
  59.     # 将助手的回复添加到对话历史中
  60.     conversation_history.append({'role': 'assistant', 'content': assistant_reply})
  61.     time.sleep(1)
  62.     while pygame.mixer.music.get_busy()!=True:  # 在音频播放完成之前不退出程序
  63.         pass
  64.     print('  get response: %s' % (result.get_response()))
复制代码
运行代码,就可以的到想要得到的效果。因代理问题,末了效果会有短暂的延时。
总结

该案例实现起来不难,找准如何利用才是关键地点,这里实现的用ChatGPT,也可换成文心一言等国内大模子,其效果更好,响应速率更快。本次的分享也就到这里,如果另有什么问题请各位品评指教,大家一起相互学习。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表