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

时间:2024-10-26 10:12:27

效果图

什么是 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

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

  1. const {
  2.    data: { text: prompt },
  3. } = await (
  4.   (fileName),
  5.   "whisper-1"
  6. );

实现文字转语音(TTS

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

如果你有国外信用卡,可以考虑使用微软推出 Azure,很多电报机器人就是用的它来开发的,免费使用 12个月。

所以在这里还是使用科大讯飞的 TTS

文字生成音频文件

音频没有直接返回流,而是直接生成一个音频返回文件路径给前端播放。

回复音频存放在 chat-audio/client/audio 中

先在 讯飞TTS[2] 中获取需要的 keys

  1. const tts = promisify(require("./utils/tts"));
  2. // 环境变量
  3. require("dotenv").config();
  4. // 生成音频
  5. const generateAudio = (text) => {
  6.   return new Promise((resolve, reject) => {
  7.     const auth = {
  8.       app_id: .TTS_APP_ID,
  9.       app_skey: .TTS_API_SECRET,
  10.       app_akey: .TTS_API_KEY
  11.     };
  12.     // 讯飞 api 参数配置
  13.     const business = {
  14.       aue: "lame",
  15.       sfl: 1,
  16.       speed: 50,
  17.       pitch: 50,
  18.       volume: 100,
  19.       bgs: 0,
  20.     };
  21.     const id = new Date().getTime()
  22.     // 存储文件的路径
  23.     const file = (__dirname, `client/audio/${id}.m4a`);
  24.     try {
  25.       // 执行请求
  26.       tts(auth, business, text, file).then((res) => {
  27.         // 返回静态文件地址
  28.         resolve(`audio/${id}.m4a`)
  29.       });
  30.     } catch (e) {
  31.       reject(e)
  32.     }
  33.   })
  34. };

封装好的讯飞的语音包 TTS,放在 ChatAudio 仓库[3] 里面。这里就不展示出来了

调用 STT & TTS

音频对话接口

通过 api/audio,让客户端调用此方法

  1. (fileUpload());
  2. ("api/audio", async (req, res) => {
  3.   // 没有上传音频抛出异常
  4.   if (!) return (400).send({ message: "缺少参数"errortrue });
  5.   const file = ;
  6.   // 存放用户上传的文件
  7.   const fileName = "audio.m4a";
  8.   (fileName, async (err) => {
  9.     if (err) {
  10.       return (500).send(err);
  11.     }
  12.         // 使用ChatGPT 的 STT 机器人(Whisper)
  13.     const {
  14.       data: { text: prompt },
  15.     } = await (
  16.       (fileName),
  17.       "whisper-1"
  18.     );
  19.     ("解析的音频内容是>>>", prompt);
  20.     // 判断用户上传音频是否存在内容
  21.     if (!().length)
  22.       return ({ message: "未识别到语音内容"errortrue });
  23.     // 将转用户提问的文本内容,去调用 ChatGPT 的回复
  24.     const chatReply = await handleIssueReply(prompt);
  25.     // 将 ChatGPT 的回复通过 TTS 转化为语音
  26.     const content = await generateAudio(chatReply);
  27.     ("生成的音频是>>>", content);
  28.     ([
  29.       { type"system", content, chatReply, infoType: "audio", playStatus: false },
  30.     ]);
  31.   });
  32. });

ChatGPT 回复问题能力

不管是 TTSSTT还是TTT,最核心对话功能还是通过 ChatGPT实现的。

ChatGPT 配置就不细说了,配置一个 KEY 然后封装一个回复问题的方法

获取 ChatGPT KEY [4]

  1. const { Configuration, OpenAIApi } = require("openai");
  2. // openai 配置
  3. const configuration = new Configuration({
  4.   apiKey: .OPENAI_API_KEY,
  5. });
  6. // 创建 openai 实例
  7. const openai = new OpenAIApi(configuration);
  8. const handleIssueReply = async (prompt) => {
  9.   const {
  10.     data: { choices },
  11.   } = await ({
  12.     model: "text-davinci-003",
  13.     prompt,
  14.     temperature: 0.5,
  15.     max_tokens: 1000,
  16.     top_p: 1.0,
  17.     frequency_penalty: 0.0,
  18.     presence_penalty: 0.0,
  19.   });
  20.   const chat = choices[0].text?.trim();
  21.   ("生成的文本内容是>>>", chat);
  22.   return chat;
  23. };

实现效果如下,没有录屏可以自行感受下。

补充功能 Text To Text

前面做的语音对话,只是为了让你不再孤单寂寞,但是在日常开发工作中基本上不会使用到语音对话,所以单独做了个可以直接使用的文字聊天功能。

所以新开了一个接口直接调用 ChatGPT 的回复。

  1. ("/api/issue", async (req, res) => {
  2.   // 从 query 中取出用户提出的问题
  3.   const { issue } = ;
  4.     if (!()) return (400).send({ message: "缺少参数"errortrue });
  5.   const chatReply = await handleIssueReply(issue);
  6.   return ([{ type"system", content: chatReply }]);
  7. });

前端实现

前端没什么太多需要注意的,列一下依赖吧,均采用的 CDN

  • Vue

  • Elment UI

代码在 chat-audio/client/ 这里

使用 ChatAudio

克隆

git clone git@:CrazyMrYan/

配置 Key

在 ENV 文件中配置 科大讯飞OpenAIkey

安装启动

  1. yarn install
  2. yarn start

使用

浏览器打开 localhost:3000

就可以看到聊天界面了

tips:

开下 ke xue shang wang

最好是 ???????? 节点

参考资料

[1]

TTS: /services/tts

[2]

讯飞TTS: /services/tts

[3]

ChatAudio 仓库: /CrazyMrYan/chat-audio

[4]

获取 ChatGPT KEY : /account/api-keys