ChatGPT搭建语音智能助手

news2024/10/5 23:28:17

环境

python:3+
ffmpeg:用于处理视频和语音
gradio:UI界面和读取语音

概述

我们的目的是做一个语音智能助手
在这里插入图片描述
下面我们开始

准备工作

下载Visual Studio Code

Visual Studio Code

因为需要写python代码,用Visual Studio Code比较方便。

安装python

python官网
在这里插入图片描述

执行下载好的exe文件,可以建议选择自定义安装,这样可以修改安装路径,只要别安装到C盘就行。

记得勾选添加到环境变量

添加环境变量

假设在安装时候,忘记了勾选添加到环境变量,那么我们可以自己配置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修改subprocess.py文件

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

安装ffmpeg

https://ffmpeg.org/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将下载好的安装包,进行解压,然后将解压后的文件夹放到平时自己喜欢的安装目录里。

比如:我的是D盘:D:\Program Files\ffmpeg

WINDOWS系统文字转语音WSAY

https://github.com/p-groarke/wsay/releases/tag/v1.5.0

点击下图进行下载:
在这里插入图片描述

在这里插入图片描述

使用GRADIO建立用户界面

先创建一个项目文件夹,比如我的:E:\openai\project\Chatbot

在这里插入图片描述
然后打开我们之前下载好的vsCode,并打开相关目录。

参照gradio官网写测试代码

https://gradio.app/quickstart/

测试代码1:页面

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

demo.launch()   

执行代码:

PS E:\openai\project\Chatbot> python ui.py

可以看到控制台会打印如下信息:

Running on local URL:  http://127.0.0.1:7860

然后浏览器打开网址http://127.0.0.1:7860

在这里插入图片描述

但是我们是需要做成语音的,所以我们需要调整下;

在官网找到:
https://gradio.app/docs/#audio

在这里插入图片描述

测试代码2:

import gradio as gr

def transcribe(audio):
    print(audio)
    return "这里显示音频"

demo = gr.Interface(
    fn=transcribe, 
    inputs=gr.Audio(source="microphone"), 
    outputs="text")

demo.launch()   

在这里插入图片描述

执行命令:py uimp.py

浏览器刷新地址如下页面:
在这里插入图片描述

接入openAI:

测试代码3:

在这里插入图片描述

执行命令:py uifinish.py

# 最终稿:

import gradio as gr
import openai, subprocess
from pathlib import Path

# 换成你自己的api_key
openai.api_key = "XXXXXXXXXXXXXXXXXXXXXX"

messages = [{"role": "system", "content": '你是一名知识渊博,乐于助人的智能聊天机器人.你的任务是陪我聊天,请用简短的对话方式,用中文讲一段话,每次回答不超过50个字!'}]

def transcribe(audio):
    global messages

    myfile=Path(audio)
    myfile=myfile.rename(myfile.with_suffix('.wav'))
    audio_file = open(myfile,"rb")
    transcript = openai.Audio.transcribe("whisper-1", audio_file)

    messages.append({"role": "user", "content": transcript["text"]})

    response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=messages)

    system_message = response["choices"][0]["message"]
    # print(response)
    messages.append(system_message)

    subprocess.call(["wsay", system_message['content']])

    chat_transcript = ""
    for message in messages:
        if message['role'] != 'system':
            chat_transcript += message['role'] + ": " + message['content'] + "\n\n"

    return chat_transcript

ui = gr.Interface(fn=transcribe, inputs=gr.Audio(source="microphone", type="filepath"), outputs="text")
ui.launch()

效果如下:

在这里插入图片描述

总结

  1. ffmpeg 来处理语音
  2. 利用WSAY,将文字转成语音
  3. 利用gradio,来生成UI页面,并提供语音输入

参考地址:

https://updayday.notion.site/Chat-GPT-WHISPER-API-GPT-3-5-TURBO-2af2630c857a4f0da92abcc763b4fd48

Whisper API cannot read files correctly

Renaming file extension using pathlib (python 3)

Path not found in Python

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

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

相关文章

( “树” 之 DFS) 101. 对称二叉树 ——【Leetcode每日一题】

101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 提示&#xff1a…

webgl-画任意多边形

注意: let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let radio window.innerWidth/window.innerHeight; let ctx canvas.getContext(webgl) 由于屏幕长宽像素不一样,导致了长宽像素…

移远云服务QuecCloud正式发布,一站式为全球客户提供创新有效的解决方案

4月12日,在“万物智联共数未来”移远通信物联网生态大会上,移远通信宣布正式推出其物联网云服务——QuecCloud。QuecCloud具备智能硬件开发、物联网开放平台、行业解决方案三大能力,可为开发者和企业用户提供从硬件接入到软件应用的全流程解决…

Java 进阶(5) Java IO流

⼀、File类 概念:代表物理盘符中的⼀个⽂件或者⽂件夹。 常见方法: 方法名 描述 createNewFile() 创建⼀个新文件。 mkdir() 创建⼀个新⽬录。 delete() 删除⽂件或空⽬录。 exists() 判断File对象所对象所代表的对象是否存在。 getAbsolute…

4.2 方差

学习目标: 我认为学习方差需要以下几个步骤: 确定学习目标:在开始学习方差之前,需要明确学习的目标和意义,例如,理解方差的定义、掌握方差的计算方法、了解方差在实际问题中的应用等。 学习相关数学概念&…

宝塔Linux面板安装命令脚本大全(Centos/Ubuntu/Debian/Fedora/Deepin)

宝塔面板Linux服务器操作系统安装命令大全,包括Centos、Alibaba Cloud Linux、Ubuntu、TencentOS Server、Deepin、Debian和Fedora安装脚本,云服务器吧分享宝塔面板Linux服务器系统安装命令大全: 目录 宝塔面板Linux系统安装命令 Centos安…

【Vue】学习笔记-事件处理

事件的基本用法 使用v-on:xxx 或xxx 绑定事件,其中xxx是事件名事件的回调需要配置在methods对象中,最终会在vm上methods中配置的函数,不要用箭头函数,否则this就不是vm了methods中配置的函数,都是被vue所管理的函数。…

Pandas库:从入门到应用(三)——多表连接操作

一 、concat数据连接 1.1、concat()函数参数 pd.concat(objs, axis0, joinouter, ignore indexFalse, keysNone, levelsNone, namesNoneverify integrityFalse, sort False, copyTrue)objs:多个 DataFrame 或者 Series axis:0-行拼接 1-列拼接 join&am…

011:Mapbox GL两种方式隐藏logo和版权,个性化版权的声明

第011个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中用两种方式隐藏logo和版权,并个性化版权的声明 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共91行)相关API参考:专栏目标示例效果 配置方式…

2023高性价比学生手机选购攻略,预算不多入手这3款超值

学生党在预算不多的情况,想要换颜值高的新手机,应该选什么样的手机才实惠? 手机已经成为生活中的必需品,市场上的手机品牌和型号多种多样,价格逐年攀升,对于预算有限的学生党来说,在保证性能和…

编译原理期末速成笔记

哈喽大家好,又要考试了,在这里分享一下我的两天速成笔记,参考视频为哔站 Deeplei_ 的《编译原理期末速成》。本文仅是知识点总结,至于考试内容待我研究一下,后续我会再发文对考试的各个模块做详细分析,欢迎…

JavaWeb开发 —— Ajax

目录 一、介绍 二、原生Ajax 三、Axios 四、案例分析 一、介绍 ① 概念:Asynchronous JavaScript And XML,异步的JavaScript和XML。 ② 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。…

多元函数的基本概念——“高等数学”

各位CSDN的uu们你们好呀,今天,小雅兰的内容是多元函数的基本概念,下面,让我们一起进入多元函数的世界吧 平面点集 多元函数的概念 多元函数的极限 多元函数的连续性 有界闭区域上多元连续函数的性质 平面点集 第一个是坐标平…

中间表示- 到达定义分析

基本概念 定义(def):对变量的赋值 使用(use):对变量值的读取 问题:能把上图中的y替换为3吗?如果能,这称之为“常量传播”优化。 该问题等价于,有哪些对变量y…

R730服务器热插拔换磁盘(raid阵列)

r730服务器发现磁盘闪橙等,说明磁盘报警了,这时候我们就要换磁盘了。 由于本服务器磁盘是raid5的阵列磁盘,所以要采用热插拔的方式换磁盘。 这边要注意的是,不能关机的时候,直接来换磁盘。 因为关机换磁盘&#xff0c…

golang指针相关

指针相关的部分实在是没有搞太明白,抽时间来总结下。 1.指针相关基础知识 比如现在有一句话:『谜底666』,这句话在程序中一启动,就要加载到内存中,假如内存地址0x123456,然后我们可以将这句话复制给变量A&…

什么是服务架构?微服务架构的优势又是什么?

文章目录1.1 单体架构1.2 分布式架构1.3 微服务架构1.4 单体架构和分布式架构的区分1.4 服务架构的优劣点1.4.1 单体架构1.4.2 分布式架构1.4.3 微服务架构1.5 总结1.1 单体架构 单体架构(Monolithic Architecture)是一种传统的软件架构,它将…

算法学习day56

算法学习day561.力扣583. 两个字符串的删除操作1.1 题目描述1.2分析1.3 代码2.力扣72. 编辑距离2.1 题目描述2.2 分析2.3 代码3.参考资料1.力扣583. 两个字符串的删除操作 1.1 题目描述 题目描述: 给定两个单词word1和word2,找到使得word1和word2相同…

探索数据结构之精髓:单链表解密

文章目录1. 前言2. 单链表的特点3. 单链表的基础操作🍑 接口总览🍑 初始化操作🍑 插入操作🍅 优化操作🍑 删除操作🍅 优化操作🍑 获取元素🍅 按置查找🍅 按值查找&#x…

从C出发 20 --- 函数参数深度剖析

我们在编写这个函数的时候参数 n 的值具体是多少? 在编写一个函数的时候参数值是没法确定的,所以将 (int n) 这个参数命名为形参 那么这个参数的值什么时候指定,具体函数调用的时候指定 比如 在main 里面调用 实参用来初始化形参 初始化之…