深度学习实战19(进阶版)-SpeakGPT的本地实现部署测试,基于ChatGPT在自己的平台实现SpeakGPT功能

news2024/11/16 5:44:18

大家好,我是微学AI,今天给大家带来SpeakGPT的本地实现,在自己的网页部署,可随时随地通过语音进行问答,本项目项目是基于ChatGPT的语音版,我称之为SpeakGPT。

ChatGPT最近大火,其实在去年12月份就想做一期关于ChatGPT的文章。

ChatGPT是美国OpenAI公司研发的功能强大的聊天机器人,他于2022年11月30日发布。ChatGPT是自然语言处理的天花板,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至可以完成论文、文案,代码的编写。

ChatGPT(全称:Chat Generative Pre-trained Transformer),发展于GPT系列,GPT由1代发展到3代,到现在的ChatGPT,ChatGPT的基本原理是基于Transformer的解码器部分来做的,主要是文本生成任务模型。

一、ChatGPT模型训练的步骤:

数据收集:ChatGPT的训练数据通常是从互联网上收集的大量文本数据,如维基百科、新闻文章、小说、论坛帖子等数据,数据量有45TB之多。这些数据需要进行清洗和预处理,例如去除无效字符、标点符号、停用词等。

数据处理:ChatGPT使用的是基于字符级别的模型,因此需要将原始文本数据进行分割,转换成单个字符的形式。同时,还需要对这些字符进行编码,以便于模型处理。

构建模型:ChatGPT模型是基于Transformer架构构建的,它包含多层Transformer编码器和解码器,以及多头注意力机制、残差连接等组件。在构建模型之前,需要确定模型的超参数,例如层数、隐层维度、注意力头数等。

无监督训练:ChatGPT的训练过程是无监督的,采用了基于最大似然估计的语言模型训练方法。训练时,模型根据先前的字符序列来预测下一个字符,然后与实际下一个字符进行比较,并计算预测误差。训练的目标是最小化所有预测误差的累积和。

预训练微调:在完成无监督训练后,ChatGPT还可以通过预训练微调来进一步提高性能。微调的过程是在有标注的任务上进行的,例如文本分类、命名实体识别等。在微调过程中,ChatGPT模型使用预训练好的权重作为初始权重,并通过有监督学习来进一步调整模型参数。

强化学习:除了无监督训练和预训练微调外,ChatGPT还可以通过强化学习来进一步优化模型的性能。在强化学习中,通过人工标注的数据对生成文本进行打分,例如生成四种结果,人工对这四种结果进行排序,排出人类最想要的答案。通过人工打分训练出可以对生成文本进行自动打分的模型。通过打分模型进一步对ChatGPT进行优化。

二、SpeakGPT模型

SpeakGPT是一种基于GPT-3的生成式对话模型,它可以生成自然、流畅的语音对话。与传统的语音对话系统不同,SpeakGPT可以在没有预定义规则和流程的情况下进行对话,并根据用户的输入和上下文信息生成符合语境和语义的回复。

SpeakGPT的工作原理类似于文本对话模型,它使用了GPT-3模型的结构和参数,并基于大量的语音对话数据进行训练和优化。具体而言,SpeakGPT的训练数据包括了大量的语音对话记录,其中包括了各种类型的对话,如电话对话、语音助手对话、实时聊天对话等。这些数据被用于训练SpeakGPT模型,从而使其能够自动学习语音对话的规律和模式。

SpeakGPT的使用方法与其他对话系统类似,用户可以使用语音输入进行对话,并在SpeakGPT的回复中获得自然、流畅的语音输出。

三、SpeakGPT模型代码实现

实现SpeakGPT之前需要获取一个Openai账号,详细可私信,一般小伙伴都可以获取,然后代码中写入OPENAI_API_KEY = '你的API_KEY'。

# coding=utf-8/gbk
import os
import openai
import json
import gradio as gr
import base64
from tts_ws_python3_demo import text2speak
import websocket
import ssl
global latest_data

OPENAI_API_KEY = '你的API_KEY'

def chats(message, history):
    history = history or []
    message_new = message
    if len(history)>0:
       if  message == history[0][0] or message =='继续':
           for hos in history:
               message = message + hos[1]

    responses = chatgpt(message)
    print(responses)
    if len(responses)<4:
        responses ='\n 已经回答完成!'
    history.append((message_new, responses))

    context = ''
    for tex in history:
        texs =tex[1]
        texs =texs.replace('\n\n','\n')
        context =context+texs

    path = text2speak(context)
    return path


def chatgpt(prompt):
    openai.api_key = OPENAI_API_KEY
    response = openai.Completion.create(
      model="text-davinci-003",
      prompt= prompt,
      temperature=0.7,
      max_tokens=512,
      top_p=1,
      frequency_penalty=0,
      presence_penalty=0
    )
    res = response["choices"][0]["text"]
    res.encode().decode("unicode_escape")

    return res

# 清除输入输出
def clear_input():
    return ""

if __name__ == '__main__':

    with gr.Blocks(title='SpeakGPT', css=".gradio-container #Button {background-color: #03a9f4} #Clear {background-color: #fe3829} #mar {color: #03a9f4} " ) as demo:

        with gr.Row():
            gr.Markdown("""# SpeakGPT""" )

        gr.Markdown("""输入问题, SpeakGPT可以进行回答""")
        with gr.Box():
            with gr.Row() as row:
                with gr.Column():
                    gpt_text = gr.Textbox(label="问题", lines=2)
                    gpt_stats = gr.State()
                    with gr.Row():
                        gpt_btn = gr.Button("提问", elem_id="Button")
                        clear = gr.Button("清除", elem_id="Clear")
                with gr.Column():
                    out_Audio = gr.Audio(label="语音",type='filepath')
                 
        gpt_btn.click(fn=chats,
                      inputs=[gpt_text, gpt_stats],
                      outputs=[out_Audio])

        # chatgpt
        clear.click(fn=clear_input, inputs=[], outputs=[out_Audio])

    demo.launch(share=True,show_api=False)

tts_ws_python3_demo.py代码,这边生成语言采用科大讯飞文本转语言功能,你也可以选择其他方式转换,这里需要填写修改:APPID='你的APPID',APISecret='你的APISecret',APIKey='你的APIKey'

import websocket
import datetime
import hashlib
import base64
import hmac
import json
from urllib.parse import urlencode
import time
import ssl
from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime
import _thread as thread
import os
import time

STATUS_FIRST_FRAME = 0  # 第一帧的标识
STATUS_CONTINUE_FRAME = 1  # 中间帧标识
STATUS_LAST_FRAME = 2  # 最后一帧的标识

APPID='你的APPID'
APISecret='你的APISecret'
APIKey='你的APIKey'

class Ws_Param(object):
    # 初始化
    def __init__(self, APPID, APIKey, APISecret, Text):
        self.APPID = APPID
        self.APIKey = APIKey
        self.APISecret = APISecret
        self.Text = Text

        # 公共参数(common)
        self.CommonArgs = {"app_id": self.APPID}
        # 业务参数(business),更多个性化参数可在官网查看
        self.BusinessArgs = {"aue": "raw", "auf": "audio/L16;rate=16000", "vcn": "aisjinger", "tte": "utf8"}
        self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-8')), "UTF8")}
        #使用小语种须使用以下方式,此处的unicode指的是 utf16小端的编码方式,即"UTF-16LE"”
        #self.Data = {"status": 2, "text": str(base64.b64encode(self.Text.encode('utf-16')), "UTF8")}

    # 运行

    # 生成url
    def create_url(self):
        url = 'wss://tts-api.xfyun.cn/v2/tts'
        # 生成RFC1123格式的时间戳
        now = datetime.now()
        date = format_date_time(mktime(now.timetuple()))

        # 拼接字符串
        signature_origin = "host: " + "ws-api.xfyun.cn" + "\n"
        signature_origin += "date: " + date + "\n"
        signature_origin += "GET " + "/v2/tts " + "HTTP/1.1"
        # 进行hmac-sha256进行加密
        signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
                                 digestmod=hashlib.sha256).digest()
        signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')

        authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (
            self.APIKey, "hmac-sha256", "host date request-line", signature_sha)
        authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
        # 将请求的鉴权参数组合为字典
        v = {
            "authorization": authorization,
            "date": date,
            "host": "ws-api.xfyun.cn"
        }
        # 拼接鉴权参数,生成url
        url = url + '?' + urlencode(v)
        # print("date: ",date)
        # print("v: ",v)
        # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
        # print('websocket url :', url)
        return url

def on_message( ws, message):
    try:
        message =json.loads(message)
        code = message["code"]
        sid = message["sid"]
        audio = message["data"]["audio"]
        audio = base64.b64decode(audio)

        status = message["data"]["status"]
        #print(message)
        if status == 2:
            print("ws is closed")
            ws.close()
        if code != 0:
            errMsg = message["message"]
            print("sid:%s call error:%s code is:%s" % (sid, errMsg, code))
        else:

            with open('demo.pcm', 'ab') as f:
                f.write(audio)

            import wave
            # 打开pcm文件
            f = open("demo.pcm", 'rb')
            # 读取文件
            params = f.read()
            # 写入wav文件
            # 参数
            nchannels = 1
            sampwidth = 2
            framerate = 16000
            nframes = len(params)
            comptype = "NONE"
            compname = "not compressed"
            # 写入
            wav_file = wave.open("demo.wav", 'w')
            wav_file.setparams((nchannels, sampwidth, framerate, nframes, comptype, compname))
            wav_file.writeframes(params)
            wav_file.close()

    except Exception as e:
        print("receive msg,but parse exception:", e)

# 收到websocket错误的处理
def on_error( ws, error):
    print("### error:", error)

# 收到websocket关闭的处理
def on_close(self, ws):
    print("### closed ###")

    # 收到websocket连接建立的处理
def on_open(ws, wsParam):
    def run(*args):
        d = {"common": wsParam.CommonArgs,
             "business": wsParam.BusinessArgs,
             "data": wsParam.Data,
             }
        d = json.dumps(d)
        print("------>开始发送文本数据")
        ws.send(d)

        if os.path.exists('demo.pcm'):
            os.remove('demo.pcm')

    thread.start_new_thread(run,())


def text2speak(text):
    wsParam = Ws_Param(APPID=APPID, APISecret=APISecret,
                       APIKey=APIKey,
                       Text=text)

    websocket.enableTrace(False)
    wsUrl = wsParam.create_url()

    ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
    ws.on_open = lambda ws: on_open(ws, wsParam)
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

    path = 'demo.wav'
    return path

if __name__ == "__main__":
    # 测试时候在此处正确填写相关信息即可运行
    text ="大家好,我是微学AI"
    text2speak(text)

运行结果:

电脑端:

手机端:

点击语音就可收听,用于旅途中智能问答快速获取信息,成为你的智能背囊,行走的“军师”。

 往期作品:

深度学习实战项目

1.深度学习实战1-(keras框架)企业数据分析与预测

2.深度学习实战2-(keras框架)企业信用评级与预测

3.深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

4.深度学习实战4-卷积神经网络(DenseNet)数学图形识别+题目模式识别

5.深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

6.深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

7.深度学习实战7-电商产品评论的情感分析

8.深度学习实战8-生活照片转化漫画照片应用

9.深度学习实战9-文本生成图像-本地电脑实现text2img

10.深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)

11.深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

12.深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

13.深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

14.深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

15.深度学习实战15(进阶版)-让机器进行阅读理解+你可以变成出题者提问

16.深度学习实战16(进阶版)-虚拟截图识别文字-可以做纸质合同和表格识别

17.深度学习实战17(进阶版)-智能辅助编辑平台系统的搭建与开发案例

18.深度学习实战18(进阶版)-NLP的15项任务大融合系统,可实现市面上你能想到的NLP任务

19.深度学习实战19(进阶版)-ChatGPT的本地实现部署测试,自己的平台就可以实现ChatGPT

...(待更新)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「架构」全链路异步模式

总结自尼恩的全链路异步&#xff1a;网关纯异步化网关层的特点&#xff1a;不需要访问业务数据库只做协议转换和流量转发特点是 IO 密集型&#xff0c;特别适合纯异步的架构&#xff0c;可以极大的节省资源。如何进行网关异步化&#xff1f;使用高性能的通信框架Netty&#xff…

CSS3新增的视口单位Vh、Vw单位

定义vw&#xff1a;浏览器可见视口【宽度】的百分比&#xff08;1vw代表视窗【宽度】的1%&#xff09;vh&#xff1a;浏览器可见视口【高度】的百分比&#xff08;1vw代表视窗【高度】的1%&#xff09;vmin&#xff1a;当前 vw 和 vh 较小的一个值。vmax&#xff1a;当前 vw 和…

现在入行软测=49年入国军?三句话,让面试官再掏2K!

还有三五天就步入金三银四&#xff0c;很多软测人吐槽因为疫情&#xff0c;公司都在裁员&#xff0c;别说跳槽涨薪&#xff0c;能保住现在的工作就不错了。但也有那么一批人&#xff0c;凭借自己口才与实力拿到年薪近50W的offer。面试是初见1小时就要相互了解优缺点的过程&…

软考知识笔记 2023.2.24 2018下半年真题

答案&#xff1a; A BIOS (BasicInputOutputSystem) (基本输入输出系统) 是一组固化到计算机内主板上一个ROM芯片上的程序&#xff0c; 它保存着计算机最重要的基本输入输出的程序&#xff0c; 开机后自检程序和系统自启动程序&#xff0c; 它可从CMOS中读写系统设置的具体信息…

SpringBoot整合(六)多数据源和 JPA、MyBatis、JdbcTemplate 的集成

在springboot项目中&#xff0c;我们可能会碰到需要多数据源的场景。例如说&#xff1a; 读写分离&#xff1a;数据库主节点压力比较大&#xff0c;需要增加从节点提供读操作&#xff0c;以减少压力。多数据源&#xff1a;一个复杂的单体项目&#xff0c;因为没有拆分成不同的…

PPP简介,PPP分层体系架构,PPP链路建立过程及PPP的帧格式

PPP&#xff08;Point-to-Point Protocol&#xff09;是一种用于在两个网络节点之间传输数据的通信协议。它最初是为在拨号网络上进行拨号连接而开发的&#xff0c;现在已经被广泛应用于各种网络环境中&#xff0c;例如在宽带接入、虚拟专用网&#xff08;VPN&#xff09;等场景…

在linux中使用lftp和sftp下载文件(夹)

一、首先确保你的系统中已经下载了lftp和sftp。 1.安装lftp sudo apt install lftp sudo apt install screen 2.安装sftp 在Linux系统中&#xff0c;一般RedHat系统默认已经安装了openssh-client和openssh-server&#xff0c;即默认已经集成了sftp服务&#xff0c;不需要重…

LVGL8.3 集成 ST7789V 显示驱动和 CST816T 触摸屏驱动

LVGL8.3 集成 ST7789V 显示驱动和 CTS816S 触摸屏驱动起因效果&#xff08;正常显示&#xff0c;触摸屏可调换X&#xff0c;Y轴&#xff09;使用方式前提操作步骤最后参考起因 LVGL的ESP32 Drivers库中已经包含了大多数显示和触摸芯片的驱动&#xff0c;基本上只需要在MenuCon…

高级前端面试题汇总

iframe 有那些优点和缺点&#xff1f; iframe 元素会创建包含另外一个文档的内联框架&#xff08;即行内框架&#xff09;。 优点&#xff1a; 用来加载速度较慢的内容&#xff08;如广告&#xff09;可以使脚本可以并行下载可以实现跨子域通信 缺点&#xff1a; iframe 会…

【ssm框架】从0开始搭建ssm框架(idea版本)

SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架集由Spring、MyBatis两个开源框架整合而&#xff08;SpringMVC是Spring中的部分内容&#xff09;&#xff0c;常作为数据源较简单的web项目的框架。 一、 环境介绍 先创建一个web工程。这里使用SSM最终完成一个员工信息的…

驾驭云端之风1——Spring Cloud微服务架构实践指南

本博客纯属个人总结&#xff0c;非原创。喜欢技术交流的&#xff0c;可关注博主&#xff0c;武汉有后端开发群&#xff0c;可支持内推&#xff0c;了解武汉行情等。 前沿 优惠卷平台项目的整体功能和模块&#xff0c;以及每个功能点的技术选型和背后的依据。 搭建一个简化版的…

窃密恶意软件Raccoon最新样本Stealer v2分析

Raccoon 是一个恶意软件家族&#xff0c;2019 年来一直在地下犯罪论坛中以恶意软件即服务的身份进行售卖。2022 年 7 月&#xff0c;该恶意软件家族发布了 C 语言编写的新版本 Raccoon Stealer v2&#xff0c;打破了以往使用 C 开发的传统。 Raccoon 是一个信息窃密恶意软件&a…

JavaEE高阶---Redis

一:缓存简介 1.1 缓存定义 缓存是一个高速数据交换的存储器&#xff0c;使用它可以快速的访问和操作数据 . 1.2 程序中的缓存 当没有使用缓存时 : 但随着业务的发展&#xff0c;公司的框架慢慢变成了多个程序调用一个数据库的情况了&#xff1a; 这是大部分公司的普遍的架构…

设备加密狗

场景描述 随着科技的飞速发展&#xff0c;越来越多的智能设备走进生产加工车间。例如智能雕刻机、钣金机、榫槽机、钻孔机、磨刀机等等。 这些智能设备存在很大共性&#xff0c;就是都内嵌完整的操作系统。有的是windows&#xff0c;有的是linux。设备制造商提供的专业软件运…

pycharm的下载讲解以及安装步骤

目录 Python安装 这时&#xff0c;有人要问了&#xff0c;下载pycharm一定要下载Python么&#xff1f; Python官网 Pycharm安装 完成 推荐书籍 写在最后 Python安装 首先我们进入Python的官方下载网站 这时&#xff0c;有人要问了&#xff0c;下载pycharm一定要下载Py…

算法设计与分析期末考试复习(五)

回溯法 回溯法是一种试探法&#xff0c;将n元问题P的状态空间E表示成为一棵高为n的带权有序数T&#xff0c;把在E中求问题P的解转换为在T中搜索问题P的解。 解题方法&#xff1a;按选优条件对T进行深度优先搜索&#xff0c;以达到目标。 从根节点出发深度优先搜索解空间树。当…

初学网络安全不可不知的:10款开源安全工具

随着互联网的不断发展&#xff0c;安全问题也越来越受到企业的重视。但安全问题往往需要大量资金的投入&#xff0c;例如聘请安全工程师&#xff0c;产品研发&#xff0c;测试等流程。这对于那些原本就资金紧缺的企业而言&#xff0c;是绝对无法接受的。因此&#xff0c;为了减…

Python3+Selenium3自动化测试-(准备)

最近在学习selenium自动化测试相关的内容&#xff0c;所以将实际准备情况做一记录&#xff0c; # 系统&#xff1a;win10(64位) # 浏览器&#xff1a;Chrome(67.0)、Firefox(61.0)、IE # python版本&#xff1a;3.6.5 # Selenium&#xff1a;3.13.0Selenium简介 Selenium是一…

JUC并发编程——线程安全问题

目录一、共享问题1.1 共享带来的问题1.2 临界区与竞态条件二、解决方案2.1 上下文切换——synchronized-解决2.2 上下文切换——synchronized-理解2.3 上下文切换——synchronized-思考2.4 锁面向对象改进2.5 方法上的 synchronized三、synchronized习题3.1 synchronized-加在方…

记住这些快捷键,让你轻松玩转mac(macOS 常用快捷键分享)

适当运用键盘快捷键可以帮助用户提高效率&#xff0c;这里小编为大家带来了一些macOS 常用快捷键&#xff0c;掌握这些快捷键可以帮你解放鼠标手&#xff0c;成为键盘侠&#xff0c;一起来看看吧&#xff01; 快捷键标识简介 当你在应用菜单中发现部分操作项后边有一些特殊标…