基于express调用chatgpt文字流输出和有道智云语音合成

这篇具有很好参考价值的文章主要介绍了基于express调用chatgpt文字流输出和有道智云语音合成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

express是基于node.js的一个web框架,可以更加简洁的去创建一个后台服务,由于项目的需要,引入和typescript,经过几天的努力实现了chatgpt文字流输出+有道智云语音合成的结合(略有遗憾),下面我记载以下,以供参考

后端实现:

    要出现chatgpt原生接口的流式效果(也就是一个字一个字往外面蹦),就得只能使用SSE(event-stream)和Websocket,其实采用轮询(短轮询和长轮询)也是可以的只是占用资源,下面我先来介绍这记得交互方法

  • 轮询:是由客户端每隔一段时间向服务器发出HTTP请求,服务端接收到请求后向客户端返回最新的数据。 客户端的轮询方式一般分为短轮询和长轮询。

    • 短轮询:一般是由客户端每隔一段时间向服务器发起一次普通HTTP请求。服务端查询当前接口是否有数据更新,若有数据更新则向客户端返回最新数据,若无则提示客户端无数据更新。
      优点:比较简单,通过定时器在固定的间隔里不断发送请求。
      缺点:多条请求并不是每条都是有用的,会有很多无用请求,占据服务器资源和宽带,并且维护困难,响应的结果没有顺寻(因为是异步请求)只适用与小型应用。
    • 长轮询:一般是由客户端向服务器发出一个设置较长网络超时时间的HTTP请求,并在Http连接超时前,不主动断开连接;带颗段超时或有数据返回后,再次建立一个同样的Http请求,重复以上过程。
      优点:无消息时不会频繁请求,占用资源较少。
      缺点:服务器滞留信息会耗费资源,返回信息顺序无法保证,维护困难。
  • SSE(event-stream):SSE(Server-Sent Events)是一种单向通信协议,其中服务器可以将消息推送到客户端。与轮询不同,客户端只需发送一个请求,服务器可以随时发送新消息。这种方法可以减少网络流量和服务器负载。

  • Websocket:WebSocket 是一种双向通信协议,它允许服务器和客户端在连接打开的情况下实时通信。WebSocket 可以减少网络流量和服务器负载,因为它不需要客户端发送大量的 HTTP 请求来获取新消息。

可以看出SSE和Websocket两种协议在实时通讯中起着很大作用,下面介绍这两种协议在express的应用:

SSE:
import { Stream } from 'node:stream';
import api from '../ToolClass/base.js'
async function sendTextBymodel1(req,res){
   const params=res.data   //获取前端传过来的数据,其中包含一个属性Stream,要设置为true
   const {data}=await api.post<Stream>("/v1/chat/completions",params,{
     responseType:"stream"
   })
   res.send(readStream(data))   //这里进行对返回值的处理,可以在前端处理
}
function readStream(decoded) {
  let response=""
  let decodedArray = decoded.split("data: ");
  let longstr = "";
  decodedArray.forEach(decoded => {
    try {
      decoded = decoded.trim();
      if ( longstr == "" ){
        JSON.parse(decoded);
      }else{
        decoded = longstr + decoded;
        longstr = "";
        JSON.parse(decoded);
      }
    }catch ( e ){
      longstr = decoded;
      decoded = "";
    }
    if(decoded!==""){
      if(decoded.trim()==="[DONE]"){
        return;
      }else{
          response = JSON.parse(decoded).choices[0].delta.content ? JSON.parse(decoded).choices[0].delta.content : ""   
          return response
      }
    }
  })
  return response
}
export {sendTextBymodel1}

 返回的就是一个一个字符

前端通过fetch或者EventSource来进行接收,对于普通的浏览器还是行的,不过使用在uniapp中打包成安卓就不行了,此时的解决方案就是Websocket:

下载包:

npm i express-ws

注入,使用:

import expressWs from 'express-ws'
import {sendTextBymodel1} from './Controller/ChatAI.js'
const app=express()
expressWs(app)
app.ws("/chat",sendTextBymodel1)

import { Stream } from 'node:stream';
import api from '../ToolClass/base.js'
async function char(params,ws){ /* <Stream> */
      try {
        // speecher("有道词典API使有道词典API使有道词典API使有")
        const {data}=await api.post<Stream>("/v1/chat/completions",JSON.parse(params),{
          responseType:"stream"
        })
        data.on("data", async (dat)=>{ 
          await ws.send(dat.toString('utf8'))
        })
        data.on('close',async () => {
          await ws.close();
        });
      } catch (error) { 
        ws.send({status:402,meaasge:"Websocket服务出现错误"})
      }
}
 function sendTextBymodel1(ws,res){
   // 使用 ws 的 send 方法向连接另一端的客户端发送数据
  // ws.send("connect to express server with WebSocket success")
  let flag=false
  ws.on("message",async (msg)=>{
    char(msg,ws)
  })
  ws.on("close",(e)=>{
  })
}
export {sendTextBymodel1}

前端实现:

uni.connectSocket({
		url:"ws://43.155.177.34:8085/chat",
		header: {
			'content-type': 'application/json'
		}
})
uni.onSocketOpen((res)=>{
		uni.sendSocketMessage({
			data: param
		});
});
uni.onSocketError((res)=>{
		console.log('WebSocket连接打开失败,请检查!');
	    });
uni.onSocketMessage((res)=>{
		this.readStream(res.data,_this, currentResLocation,"chat");  //与上面SSE的后端代码方法一样
})

关于有道智云语音合成API的代码如下:

import axios from 'axios'
import { generateUUID } from './util.js'
import { config } from 'dotenv';
import crypto from 'crypto'
import id3 from 'node-id3'
import fs from 'fs'
config()
const setting={
  q:"",
  appKey:"",
  salt:"",
  sign:"",
  signType:"v3",
  curtime:"",
  voiceName:"youxiaoqin",
  format:"mp3"
}
async function speecher(q:string){
   initData(q)
   const response=await axios.post("https://openapi.youdao.com/ttsapi",setting,{
    headers:{
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    responseType: 'arraybuffer'
   })
    let name=Math.floor(Date.now() / 1000)
    let outputFilePath = 'public/'+name+'.mp3';
      try {
        fs.writeFileSync(outputFilePath,response.data,'binary');
        // const tags = id3.read(outputFilePath);
        // const durationInSeconds = tags && tags.duration ? tags.duration : 0;
        // console.log(durationInSeconds);
      } catch (error) {
        console.log(error);
      }
       return outputFilePath
}

function calculateSHA256(input) {
  const hash = crypto.createHash('sha256');
  hash.update(input);
  return hash.digest('hex'); // 返回十六进制表示的哈希值
}


function initData(q){
  setting.q=Buffer.from(q, 'utf8').toString();
  setting.appKey="应用key"
  let salt=generateUUID()
  setting.salt=salt
  setting.voiceName="youxiaoqin"
  setting.curtime=Math.floor(Date.now() / 1000).toString()
  let input=getInput(q)
  const hashedData = calculateSHA256("应用key"+input+salt+setting.curtime+"应用秘钥");
  setting.sign=hashedData
  setting.signType="v3"
}

function getInput(q){
    if (q.length<=20) {
        return q
    }
    return q.slice(0, 10)+q.length+q.slice(-10)

}
export default speecher
export function generateUUID() {
  let d = new Date().getTime();
  let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
      let r = (d + Math.random() * 16) % 16 | 0;
      d = Math.floor(d / 16);
      return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
  });
  return uuid;
}
export const AI_HEAD_IMG_URL="https://th.bing.com/th?id=ODL.3e2fbff4543f0d3632d34be6d02adc93&w=100&h=100&c=12&pcl=faf9f7&o=6&dpr=1.5&pid=13.1"

其中有些变量可以不使用硬编码的形式,express可以使用环境变量,使用dotenv包

整个demo做下来,本想做成流式输出文字将文字流传给流式合成语言,然后将语言传给前端,达到实时对话,但是网上找了一遍支持流式语音的API都是国外的谷歌、微软、亚马逊,但是这些调用其API需要进行注册,注册过程中需要用到国外信用卡,悲痛,国内支持的流式传输的有百度,阿里的,只是是百度和阿里的声音比较简单,所以就没做了

本文参考了:

短轮询和长轮询_长轮询和短轮询_白鲸ld的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-608743.html

到了这里,关于基于express调用chatgpt文字流输出和有道智云语音合成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ —— 调用微软语音接口(SAPI),实现文字转语音播放

    SAPI介绍      SAPI(The Microsoft Speech API) ———— 微软语音接口      SAPI中的语音技术包括两部分内容: 语音识别、语音合成 。均需语音引擎的支持。      SAPI包含以下组件对象:           1)、Vocie Commands API.对应用程序进行控制,一般用于语音识别

    2024年02月05日
    浏览(30)
  • 微信小程序调用科大讯飞 在线合成语音接口(文字转语音)

    科大讯飞在线文档 https://www.xfyun.cn/doc/tts/online_tts/API.html 科大讯飞调用接口 地址 https://blog.csdn.net/jinxi1112/article/details/122835386 微信小程序base64转ArrayBuffer替代方案 https://www.homedt.net/43939.html 注意点 调用函数 参考大佬的实例 这里说一下注意的点 微信小程序 不支持在线的 base64

    2024年02月10日
    浏览(31)
  • Java调用ChatGPT(基于SpringBoot),实现可连续对话和流式输出的ChatGPT API(可自定义实现AI助手)

    源码及更详细的介绍说明参见Git上的 README.md 文档 https://github.com/asleepyfish/chatgpt 本文Demo(SpringBoot和Main方法Demo均包括)的Git地址:https://github.com/asleepyfish/chatgpt-demo 流式输出结合Vue前端的Demo的Git地址:https://github.com/asleepyfish/chatgpt-vue 后续使用方法和api版本更新均在Github的READM

    2023年04月13日
    浏览(38)
  • Java调用ChatGPT(基于SpringBoot和Vue)实现连续对话、流式输出和自定义baseUrl

    源码及更详细的介绍说明参见Git上的 README.md 文档 https://github.com/asleepyfish/chatgpt 本文Demo(SpringBoot和Main方法Demo均包括)的Git地址:https://github.com/asleepyfish/chatgpt-demo 流式输出结合Vue前端的Demo的Git地址:https://github.com/asleepyfish/chatgpt-vue 后续使用方法和api版本更新均在Github的READM

    2024年02月16日
    浏览(27)
  • Java调用ChatGPT(基于SpringBoot和Vue),实现可连续对话和流式输出的ChatGPT API(可自定义实现AI助手)

    源码及更详细的介绍说明参见Git上的 README.md 文档 https://github.com/asleepyfish/chatgpt 本文Demo(SpringBoot和Main方法Demo均包括)的Git地址:https://github.com/asleepyfish/chatgpt-demo 流式输出结合Vue前端的Demo的Git地址:https://github.com/asleepyfish/chatgpt-vue 后续使用方法和api版本更新均在Github的READM

    2023年04月24日
    浏览(38)
  • Python调用edge-tts实现在线文字转语音

    edge-tts是一个 Python 模块,允许通过Python代码或命令的方式使用 Microsoft Edge 的在线文本转语音服务。 GitHub - rany2/edge-tts: Use Microsoft Edge\\\'s online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an API key Use Microsoft Edge\\\'s online text-to-speech service from Python WITHOUT needing Micro

    2024年03月27日
    浏览(36)
  • 张赐荣 | C#调用 WINDOWS语音识别将WAV音频转文字

    C#调用 WINDOWS语音识别将WAV音频转文字 作者:张赐荣 本例使用Windows本地语音识别功能实现语音到文本的转换(支持WAV音频文件)。 public static string SpeechRecognition (string wavPath) { try { System.Speech.Recognition.SpeechRecognitionEngine sre = new System.Speech.Recognition.SpeechRecognitionEngine(); sre.LoadGramma

    2023年04月19日
    浏览(27)
  • 实现ChatGPT的文字输出效果

    原文发表于zhu\\\'s Blog       阿猪是计算机业余爱好者,把网页做得美观高大上对阿猪是一种折磨和挑战,所以阿猪做出来的网页都是清一色的word文档风格。为了给low逼的网页提升点儿逼格,阿猪决定模仿一下ChatGPT的文字输出效果。       先上效果图::       以下是完整代

    2024年02月02日
    浏览(27)
  • C# .NET调用OpenAI及微软语音服务实现语音输入及输出

    目前C#调用Open AI有很多的开源库,本文使用的nuget包如下: 都有开源库,所以实现起来就比较简单了,主要难度可能还是注册账号,有能力的可以自己试试,在这儿贴出部分调用的主要代码,项目已开源,Github搜索JamesBaiJun/OpenAI-Azure,记得点个Star。 调用ChatGPT使用Nuget的Open

    2024年02月02日
    浏览(29)
  • PHP实现OpenApi接口ChatGPT回复输出流文字流打字效果

    在做AI聊天时,回复文字时一般用实时打字文字流效果,那PHP实现ChatGPT回复输出流文字流打字效果怎么实现呢? 先看一下效果图: 注意看一下前端ajax请求是EventStream类型。具体什么是EventStream百度了解。 后端PHP配置和实现

    2024年02月12日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包