ChatAudio 通过TTS + STT + GPT 实现语音对话(低仿微信聊天)

本文介绍了如何通过STT(语音转文字)、TTS(文字转语音)和GPT实现类似微信聊天的语音对话功能。利用OpenAI的GPT进行核心对话,科大讯飞的API处理音频转换,并提供了前端实现的详细步骤,包括Vue和Element UI的使用。
摘要由CSDN通过智能技术生成

0c56e479e297eff90b5a614f4a544239.png

效果图

什么是 STT 和 TTS?

  • STT 是语音转文字(Speech To Text)

  • TTS 是文字转语音(Text To Speech)

为什么要使用 SST + TTS 如果用户直接输入音频,OpenAIAPI 中并没有直接使用语音和 GPT 进行对话的功能。

所需依赖

  • express

  • express-fileupload

  • openai

  • websocket

  • nodemon

  • dotenv

实现语音转文字(STT)

前面说到了,OpenAI 中不存在这种 API,但是提供了一个 Whisper 机器人,支持将音频流转化为文本,也就是 STT

aa2b3e73d64fb1df4d079ace9fdca761.png

实现如下返回的 text 就是识别的语音内容

const {
   data: { text: prompt },
} = await openai.createTranscription(
  fs.createReadStream(fileName),
  "whisper-1"
);

实现文字转语音(TTS)

OpenAI 目前只提供了 STT,如果需要返回给用户一个音频的话。就需要用到国内的 科大讯飞 每天有

以下是一个使用Python编写的程序,将OpenCV、YOLO、STTGPT组合在一起,实现图像目标检测、语音转文字和自然语言生成的功能。 ```python import cv2 import time import speech_recognition as sr import openai import numpy as np # 加载YOLO模型 net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg") # 加载类名 with open("coco.names", "r") as f: classes = [line.strip() for line in f.readlines()] # 配置OpenAI openai.api_key = "YOUR_API_KEY" # 初始化语音识别器 r = sr.Recognizer() # 初始化摄像头 cap = cv2.VideoCapture(0) while True: # 读取图像帧 ret, frame = cap.read() if not ret: break # 将图像帧转换为Blob格式 blob = cv2.dnn.blobFromImage(frame, 1/255, (416, 416), swapRB=True) # 输入图像到YOLO模型中,得到检测结果 net.setInput(blob) output_layers = net.getUnconnectedOutLayersNames() layer_outputs = net.forward(output_layers) # 解析检测结果 boxes = [] confidences = [] class_ids = [] for output in layer_outputs: for detection in output: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(detection[0] * frame.shape[1]) center_y = int(detection[1] * frame.shape[0]) w = int(detection[2] * frame.shape[1]) h = int(detection[3] * frame.shape[0]) x = center_x - w // 2 y = center_y - h // 2 boxes.append([x, y, w, h]) confidences.append(float(confidence)) class_ids.append(class_id) # 应用非极大值抑制(NMS)来去除重叠的边界框 indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) # 显示检测结果 for i in indices: i = i[0] box = boxes[i] x, y, w, h = box label = f"{classes[class_ids[i]]}: {confidences[i]:.2f}" cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(frame, label, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 显示图像帧 cv2.imshow("frame", frame) # 检测是否有语音输入 with sr.Microphone() as source: audio = r.listen(source, timeout=1, phrase_time_limit=5) try: # 语音转文字 text = r.recognize_google(audio, language="zh-CN") print("You said:", text) # 使用OpenAI生成回复 prompt = f"我看到了一个{classes[class_ids[0]]},它是{confidences[0]:.2f}的置信度。你说:{text}" response = openai.Completion.create(engine="davinci", prompt=prompt, max_tokens=50) reply = response.choices[0].text.strip() print("AI said:", reply) except sr.UnknownValueError: pass # 按下q键退出程序 if cv2.waitKey(1) == ord("q"): break # 释放摄像头和窗口 cap.release() cv2.destroyAllWindows() ``` 这个程序使用了OpenCV的dnn模块加载YOLO模型进行目标检测,使用SpeechRecognition库进行语音转文字,使用OpenAI API进行自然语言生成。 程序通过摄像头读取图像帧,在图像帧中进行目标检测,并通过语音输入获取用户的输入。然后程序使用OpenAI API生成回复,并将回复输出到控制台。程序将不断循环执行这些步骤,直到用户按下q键退出程序。 请注意,这个程序仅仅是一个示例,您需要自己修改和优化程序,以适应您的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值