准备工作
一.OpenAi的Api
1.登录openai
2.点击Develovpers的overview
### 3.点击右上角的Login in
### 4.点击右上角的view apikey
### 5.点击Creat new secret key
这样就会得到一个chatgpt的api,请妥善保存这个api,当你关闭这个网页的时候,api就不可再见了。
二. 准备百度云的api
1.登录百度云
2.点击右上角登录或者注册账户即可
3.进入控制台,找到下图所示的语音技术
这个一般会有免费的资源赠送,点击领取后再创建资源。注意找到下图所示的AppID,API Key和Screat Key。妥善保存这三个,后面代码中会用到。
三.科学上网
这个不细说了,没有的话可以去网上搜一下教程,可能会用到。
代码部分
1.导入必须的库
下载导入下述的库
import speech_recognition as sr
from aip import AipSpeech
import openai
import pygame
import asyncio
import edge_tts
可以直接用pip下载,如果国内下载不成功的话可以试着用下面的命令下载。
pip install xxx(包名) -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
2.更换上面得到的api信息到代码中
APP_ID = 'XXX'
API_KEY = 'XXX'
SECRET_KEY = 'XXX'
openai.api_key = "XXX"
3.完整代码如下(可能需要用到全局代理)
import speech_recognition as sr
from aip import AipSpeech
import openai
import pygame
import asyncio
import edge_tts
APP_ID = 'XXX'
API_KEY = 'XXX'
SECRET_KEY = 'XXX'
allresult=""
def rec(rate=16000):
"""从系统麦克风拾取音频数据并保存为 wav 格式文件"""
r = sr.Recognizer()
with sr.Microphone(sample_rate=rate) as source:
print("连接到麦克风...")
print("请说话进行录音...")
audio = r.listen(source)
print("正在上传录音文件到百度语音服务...")
with open("recording.wav", "wb") as f:
f.write(audio.get_wav_data())
return 1
def listen():
"""上传录音文件到百度语音服务,返回语音识别结果"""
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
with open('recording.wav', 'rb') as f:
audio_data = f.read()
results = client.asr(audio_data, 'wav', 16000, {'dev_pid': 1537})
if 'result' in results:
print("你说的是:" + results['result'][0])
return results['result'][0]
else:
print("出现错误,错误代码:" , results['err_no'])
def chat(prompt):
"""与 OpenAI 文本 AI 进行聊天"""
openai.api_key = "XXX"
prompt = prompt
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
max_tokens=1024,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
temperature=0.5,
messages=[{"role": "user", "content": prompt}],
timeout={"with":1000},
)
result = response.choices[0].message.content
print("AI 回复:" + result)
return result
except Exception as e:
print("API调用失败:", e)
return None
async def speak(text=""):
voice = "zh-TW-HsiaoChenNeural"
output_file = "audio.mp3"
communicate = edge_tts.Communicate(text, voice)
await communicate.save(output_file)
print(f"\n已将文本“{text}”转换为语音并保存为文件“{output_file}”。")
def play():
"""播放语音"""
pygame.mixer.init()
pygame.mixer.music.load("C:/Users/Emails/Desktop/py/audio.mp3")
pygame.mixer.music.set_volume(0.5)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
pass
pygame.mixer.music.unload()
# 语音识别并与 AI 进行聊天
def speech():
while True:
rec() # 保存录音文件:recording.wav
text = listen() # 自动打开录音文件recording.wav进行识别,返回 识别的文字存到text
if '结束程序' in text: #这里我设置了一个结束语,说“结束程序”的时候就结束,你也可以改掉
return "对话结束"
text_1 = chat(text) # 将text中的文字发送给机器人,返回机器人的回复存到text_1
asyncio.run(speak(text_1))
play() #播放audio.mp3文件
if __name__ == '__main__':
speech()
4.将其保存为.py文件,点击运行即可
语音播放使用的是edge-tts,所以播放速度达到瓶颈,目前还没想到办法优化。
如果代码运行的过程出错,请查看上述的库是否正确安装。
代码正确运行截图如下:
如果有什么好的优化方案,可以直接私我,哥们高强度在线!