Python实现可以语音聊天的桌面宠物程序

目录

简介

程序

源代码

GUI

        DesktopWife.py

        MusicPlayer.py

        WeatherGui.py

语音


简介

        普通的桌面宠物程序只能动一动,于是我给程序添加了语言,既可以聊天,也可以实现一些自动功能,不如搜索,打开程序什么的。


程序


源代码

        gui界面都是使用PyQt5开发的,语音唤醒功能也是使用的第三方库和api   

GUI

        DesktopWife.py

import sys
import osfrom PyQt5.QtGui import QCursor
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QPainterPath
from PyQt5.QtGui import QRegion
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QRectF
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QDesktopWidget
from PyQt5.QtWidgets import QMenu
from PyQt5.QtWidgets import QAction
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import QMessageBoximport requestsimport WeatherGui
import MusicPlayer
import Tray
import VoiceToTextVoiceToText.run()"""主界面"""
class DesktopWife(QWidget):def __init__(self):super(DesktopWife, self).__init__()self.UI()def UI(self):self.Image = QPixmap(".\image\\bg.png")self.WindowSize = QDesktopWidget().screenGeometry()self.setWindowTitle("DesktopWife")self.resize(int(self.Image.width()), int(self.Image.height()))self.move(int((self.WindowSize.width() - self.Image.width()) / 2), int((self.WindowSize.height() - self.Image.height()) / 2))self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)# setAutoFillBackground(True)表示的是自动填充背景,False为透明背景self.setAutoFillBackground(False)# 窗口透明,窗体空间不透明self.setAttribute(Qt.WA_TranslucentBackground, True)self.PlayLabel = QLabel(self)self.PlayLabel.setPixmap(self.Image)self.WindowMessage = QLabel("我好困", self)self.WindowMessage.setGeometry(int((self.Image.width() - 80) / 2) + 10, 10, 200, 40)self.WindowMessage.setStyleSheet("color: white;")self.setContextMenuPolicy(Qt.CustomContextMenu)self.customContextMenuRequested.connect(self._WindowMenu)self.Timer = QTimer()self.Timer.start(5000)self.Timer.timeout.connect(self.RandomWindowMessage)"""右键菜单"""def _WindowMenu(self):self.Menu = QMenu(self)self.Menu.setStyleSheet("background-color: black; color: white;")self.WeatherForecastQAction = QAction(QIcon(".\image\Button.png"), u"查看天气", self)self.Menu.addAction(self.WeatherForecastQAction)self.PlayMusicQAction = QAction(QIcon(".\image\Button.png"), u"播放音乐", self)self.Menu.addAction(self.PlayMusicQAction)self.StartTray = QAction(QIcon(".\image\\bg.png"), u"退置托盘", self)self.Menu.addAction(self.StartTray)self.CloseWindowAction = QAction(QIcon(".\image\Quit.png"), u"退出程序", self)self.Menu.addAction(self.CloseWindowAction)self.WeatherForecastQAction.triggered.connect(self.WeatherForecast)self.PlayMusicQAction.triggered.connect(self.MusicPaly)self.StartTray.triggered.connect(self.SetTray)self.CloseWindowAction.triggered.connect(self.ColseWindowActionEvent)self.Menu.popup(QCursor.pos())# 圆角rect = QRectF(0, 0, self.Menu.width(), self.Menu.height())path = QPainterPath()path.addRoundedRect(rect, 10, 10)polygon = path.toFillPolygon().toPolygon()region = QRegion(polygon)self.Menu.setMask(region)def ColseWindowActionEvent(self):VoiceToText._conent = Falseself.close()sys.exit()"""系统托盘"""def SetTray(self):self._Tray = Tray.TrayIcon(self)self._Tray.show()self.hide()"""随机一诗"""# 因为csdn的智障检测,这里无法查看"""音乐播放"""def MusicPaly(self):self.file, _Type = QFileDialog.getOpenFileName(self, u"选择音乐文件", f"{os.path.split(__file__)[0]}\\music")if os.path.isfile(self.file):self._MusicPlayGui = MusicPlayer.MusicGui(self.file)self._MusicPlayGui.show()else:QMessageBox.information(self, "提示", f"文件:{self.file} 无法识别")"""天气预报"""def WeatherForecast(self):self.WeatherForecastGUI = WeatherGui.WeatherGUI()self.WeatherForecastGUI.show()"""重写移动事假,更改鼠标图标"""def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.m_flag = Trueself.m_Position = event.globalPos() - self.pos()  # 获取鼠标相对窗口的位置event.accept()self.setCursor(QCursor(Qt.OpenHandCursor))  # 更改鼠标图标def mouseMoveEvent(self, QMouseEvent):if Qt.LeftButton and self.m_flag:self.move(QMouseEvent.globalPos() - self.m_Position)  # 更改窗口位置QMouseEvent.accept()def mouseReleaseEvent(self, QMouseEvent):self.m_flag = Falseself.setCursor(QCursor(Qt.ArrowCursor))if __name__ == '__main__':app = QApplication(sys.argv)Window = DesktopWife()Window.show()app.exec_()

        MusicPlayer.py

import osfrom PyQt5 import QtMultimedia
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QRegion
from PyQt5.QtGui import QCursor
from PyQt5.QtGui import QPainterPath
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QUrl
from PyQt5.QtCore import QSize
from PyQt5.QtCore import QRectF
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QSlider
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QPushButtonfrom mutagen import File"""音乐播放界面"""
class MusicGui(QWidget):def __init__(self, _file):super(MusicGui, self).__init__()self.file = _fileself.GetMusicIcon()self.UI()self.Music = QUrl.fromLocalFile(_file)self.Content = QtMultimedia.QMediaContent(self.Music)self.player = QtMultimedia.QMediaPlayer()self.player.setVolume(100)self.player.setMedia(self.Content)def UI(self):self.setWindowTitle("DesktopWife-MusicPlayGui")self.resize(240, 135)self.QuitButton = QPushButton(self)self.QuitButton.setIcon(QIcon(".\image\MusicQuit.png"))self.QuitButton.setIconSize(QSize(200, 200))self.QuitButton.setGeometry(208, 10, 20, 20)QuitButtonRect = QRectF(0, 0, self.QuitButton.width(), self.QuitButton.height())QuitButtonPath = QPainterPath()QuitButtonPath.addRoundedRect(QuitButtonRect, 10, 10)QuitButtonPolgon = QuitButtonPath.toFillPolygon().toPolygon()QuitButtonRegion = QRegion(QuitButtonPolgon)self.QuitButton.setMask(QuitButtonRegion)self.QuitButton.clicked.connect(self.QuitButtonEvent)self.WindowMinimizedButton = QPushButton(self)self.WindowMinimizedButton.setIcon(QIcon(".\image\WindowMinimized.png"))self.WindowMinimizedButton.setIconSize(QSize(20, 20))self.WindowMinimizedButton.setGeometry(180, 10, 20, 20)WindowMinimizedButtonRect = QRectF(0, 0,  self.WindowMinimizedButton.width(), self.WindowMinimizedButton.height())WindowMinimizedButtonPath = QPainterPath()WindowMinimizedButtonPath.addRoundedRect(WindowMinimizedButtonRect, 10, 10)WindowMinimizedButtonPolgon = QuitButtonPath.toFillPolygon().toPolygon()WindowMinimizedButtonRegion = QRegion(WindowMinimizedButtonPolgon)self.WindowMinimizedButton.setMask(WindowMinimizedButtonRegion)self.WindowMinimizedButton.clicked.connect(self.SetWindowMin)self.MusicIconLabel = QPushButton(self)self.MusicIconLabel.setGeometry(20, 20, 30, 30)self.MusicIconLabel.setStyleSheet("color: blue;")if os.path.isfile(".\music\MusicIcon\MusicIcon.jpg"):self.MusicIconLabel.setIcon(QIcon(".\music\MusicIcon\MusicIcon.jpg"))self.MusicIconLabel.setIconSize(QSize(30, 30))else:self.MusicIconLabel.setText("无法提取音频图片")self.MusicIconLabel.setGeometry(20, 20, 120, 30)self.MusicNameLabel = QLabel(self)self.MusicNameLabel.setGeometry(20, int((self.height() - 30) / 2), 250, 30)self.MusicNameLabel.setStyleSheet("font-size:10px;")self.MusicNameLabel.setText(os.path.split(self.file)[-1])self.volume = QSlider(Qt.Horizontal, self)self.volume.setMinimum(0)self.volume.setMaximum(100)self.volume.setValue(50)self.volume.setTickInterval(5)self.volume.setTickPosition(QSlider.TicksBelow)self.volume.setGeometry(10, 100, 150, 30)self.volume.valueChanged.connect(self.VolumeNumber)self.VolumeNumberLabel = QLabel(f"{self.volume.value()}", self)self.VolumeNumberLabel.setGeometry(175, 100, 20, 20)self.PlayButton = QPushButton(self)self.PlayButton.setIcon(QIcon(".\image\stop.png"))self.PlayButton.setIconSize(QSize(200, 200))self.PlayButton.setGeometry(200, 100, 30, 30)self.IS_PlayMusic = Falseself.PlayButton.clicked.connect(self.PlayButtonEvent)# 圆角rect = QRectF(0, 0, self.width(), self.height())path = QPainterPath()path.addRoundedRect(rect, 10, 10)polygon = path.toFillPolygon().toPolygon()region = QRegion(polygon)self.setMask(region)def SetWindowMin(self):self.setWindowState(Qt.WindowMinimized)def QuitButtonEvent(self):self.hide()if os.path.isfile(".\music\MusicIcon\MusicIcon.jpg"):os.remove(".\music\MusicIcon\MusicIcon.jpg")self.player.stop()def PlayButtonEvent(self):if self.IS_PlayMusic:self.PauseMusic()else:self.PlayMusic()def VolumeNumber(self):self.VolumeNumberLabel.setText(f"{self.volume.value()}")self.player.setVolume(self.volume.value())def GetMusicIcon(self):self.MusicMutagnFile = File(self.file)try:self.MusicIconData = self.MusicMutagnFile.tags['APIC:test'].datawith open(".\music\MusicIcon\MusicIcon.jpg", "wb") as wfp:wfp.write(self.MusicIconData)except KeyError:passdef PlayMusic(self):self.player.play()self.PlayButton.setIcon(QIcon(".\image\play.png"))self.PlayButton.setIconSize(QSize(200, 200))self.IS_PlayMusic = Truedef PauseMusic(self):self.player.pause()self.PlayButton.setIcon(QIcon(".\image\stop.png"))self.PlayButton.setIconSize(QSize(200, 200))self.IS_PlayMusic = False"""重写移动事假,更改鼠标图标"""def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.m_flag = Trueself.m_Position = event.globalPos() - self.pos()  # 获取鼠标相对窗口的位置event.accept()self.setCursor(QCursor(Qt.OpenHandCursor))  # 更改鼠标图标def mouseMoveEvent(self, QMouseEvent):if Qt.LeftButton and self.m_flag:self.move(QMouseEvent.globalPos() - self.m_Position)  # 更改窗口位置QMouseEvent.accept()def mouseReleaseEvent(self, QMouseEvent):self.m_flag = Falseself.setCursor(QCursor(Qt.ArrowCursor))

        WeatherGui.py

from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QCursor
from PyQt5.QtGui import QRegion
from PyQt5.QtGui import QPainterPath
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QSize
from PyQt5.QtCore import QRectF
from PyQt5.QtWidgets import QWidget
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QPushButtonimport requests"""天气查询界面"""
class WeatherGUI(QWidget):def __init__(self):super(WeatherGUI, self).__init__()self.setWindowTitle("DesktopWife-WeatherGui")self.resize(470, 270)# 圆角rect = QRectF(0, 0, self.width(), self.height())path = QPainterPath()path.addRoundedRect(rect, 10, 10)polygon = path.toFillPolygon().toPolygon()region = QRegion(polygon)self.setMask(region)self.QuitButton = QPushButton(self)self.QuitButton.setIcon(QIcon(".\image\Quit.png"))self.QuitButton.setIconSize(QSize(40, 40))self.QuitButton.setGeometry(400, 10, 40, 40)QuitButtonRect = QRectF(0, 0, self.QuitButton.width(), self.QuitButton.height())QuitButtonPath = QPainterPath()QuitButtonPath.addRoundedRect(QuitButtonRect, 50, 50)QuitButtonPolygon = QuitButtonPath.toFillPolygon().toPolygon()QuitButtonRegin  = QRegion(QuitButtonPolygon)self.QuitButton.setMask(QuitButtonRegin)self.QuitButton.clicked.connect(self.hide)self.WeatherText = QLabel(self)self.WeatherText.setGeometry(int((470 - 300) / 2), int((270 - 200) / 2), 300, 200)self.GetWeather()def GetWeather(self):GET = requests.get("# 因为csdn的智障检测,这里无法查看")if GET.status_code == 200:JSON = GET.json()INFO = JSON['info']Data = f"城市:{JSON['city']}\n时间:{INFO['date']}" \+ f"\n星期:{INFO['week']}\n天气:{INFO['type']}" \+ f"\n{INFO['high']}\n{INFO['low']}\n风向:{INFO['fengxiang']}" \+ f"\n风级:{INFO['fengli']}\n主人您要:{INFO['tip']}"self.WeatherText.setText(Data)else:return False"""重写移动事假,更改鼠标图标"""def mousePressEvent(self, event):if event.button() == Qt.LeftButton:self.m_flag = Trueself.m_Position = event.globalPos() - self.pos()  # 获取鼠标相对窗口的位置event.accept()self.setCursor(QCursor(Qt.OpenHandCursor))  # 更改鼠标图标def mouseMoveEvent(self, QMouseEvent):if Qt.LeftButton and self.m_flag:self.move(QMouseEvent.globalPos() - self.m_Position)  # 更改窗口位置QMouseEvent.accept()def mouseReleaseEvent(self, QMouseEvent):self.m_flag = Falseself.setCursor(QCursor(Qt.ArrowCursor))

语音

import os
import wave
import pyaudio
import speech_recognition
import speech_recognition as sr
from threading import Thread
import requestsCHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000_conent = Truedef record_and_recog(wave_out_path, TIME=3):p = pyaudio.PyAudio()stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)wf = wave.open(wave_out_path, 'wb')wf.setnchannels(CHANNELS)wf.setsampwidth(p.get_sample_size(FORMAT))wf.setframerate(RATE)for _ in range(0, int(RATE / CHUNK * TIME)):data = stream.read(CHUNK)wf.writeframes(data)stream.stop_stream()stream.close()p.terminate()wf.close()return wave_out_pathdef TTS(Test: str):GET = requests.get(f"https://tts.youdao.com/fanyivoice?word={Test}&le=zh&keyfrom=speaker-target")if GET.status_code == 200:with open(".\\out.mp3", "wb") as wfp:wfp.write(GET.content)wfp.close()FFplay = os.popen(f"cd {os.path.split(__file__)[0]} && ffplay out.mp3 -noborder -nodisp -autoexit")FFplay.readlines()return Trueelse:return Falsedef Scanning(Path="C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\"):_DIRList = []_File = []for paths, dirs, files in os.walk(Path):if dirs:for dir in dirs:_DIRList.append(paths+"\\"+dir)if files:for file in files:_File.append(paths+"\\"+file)return _Filedef GoogleTranslate():global _conentwhile _conent:Rec = sr.Recognizer()with sr.AudioFile(record_and_recog(".\\test.wav")) as source:audio = Rec.record(source)try:GoogleTranslateText = Rec.recognize_google(audio, language="zh-CN")except speech_recognition.UnknownValueError:continueprint(GoogleTranslateText)if "小雨" in GoogleTranslateText or "小宇" in GoogleTranslateText:TTS("主人我在听,请您下达命令")NewRec = sr.Recognizer()with sr.AudioFile(record_and_recog(".\\test.wav")) as Newsource:NewAudio = NewRec.record(Newsource)try:Text = Rec.recognize_google(NewAudio, language="zh-CN")except speech_recognition.UnknownValueError:continueprint(Text)# 因为csdn智障检测,这里无法查看elif "打开命令行" in Text:TTS("好的, 主人")os.popen(f"start cmd")TTS("已为您打开命令行")elif "关闭语音功能" in Text or "关闭语音" in Text:TTS("好的,主人 下次再见")breakelif "打开" in Text:TTS("好的, 主人")ISSTART = Falsefor _Path in Scanning():if Text.strip("打开") == os.path.split(_Path)[-1].split(".")[0]:os.popen(f'"{_Path}"')print(_Path)TTS(f"已为您打开 {Text.strip('打开')}")ISSTART = Truebreakif ISSTART:continueelse:TTS(f"主人未找到 {Text.strip('打开')}")elif "关机" in Text:TTS("主人是否确定要关机呢?")shotdownRrc = sr.Recognizer()with sr.AudioFile(record_and_recog(".\\out.mp3")) as shotdowndata:shotdownAudio = shotdownRrc.record(shotdowndata)try:ISSHOTDOWN = Rec.recognize_google(shotdownAudio, language="zh-CN")except speech_recognition.UnknownValueError:continueif ISSHOTDOWN in ["是", "是的", "没错", "要"]:TTS("好的, 主人好好学习呀!")os.popen("shutdown -s -t 1")elif ISSHOTDOWN in ["否", "不", "不要", "不关机"]:TTS("好的, 不进行关机")else:TTS("主人,我没听懂")else:
# 因为csdn的智障检测,这里无法查看if GET.status_code == 200:try:TTS(str(GET.json()['data']['info']['text']).replace("小思", "小雨"))except TypeError:continuedef run():Start = Thread(target=GoogleTranslate)Start.start()# Start.join()

使用 Python 实现一个可以语音交流的桌面宠物

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分享】集简云小程序无需代码连接企业微信群机器人的方法

集简云小程序用户使用场景: 财务人员常使用集简云小程序上传发票图片识别信息,然后将识别的发票信息再发送到企业微信群助手中,便于后续整理。但人工手动同步数据常常占据大量的时间,且多项信息同步无法避免出错。因此&#xff0c…

【分享】快递100入驻集简云平台,实现无代码集成数百款应用

快递100 快递100是中国领先的快递物流信息服务商,归属于金蝶国际软件集团,它是集快递单号查询、快递单号短信跟踪、快递网点查询、网上寄快递等为一体的综合性快递物流服务网站。 截至目前,快递100与全球1400余家快递物流企业达成系统对接&a…

集简云 x 度量科技丨打通企业微信OA审批与招银云直联,实现支付信息自动同步网银系统

客户 介绍 北京度量科技有限公司专注于自主研发、生产制造和销售光学三维动作捕捉系统。公司现已获得专精特新企业、高新技术企业、瞪羚企业、展翼企业等一系列称号。 度量的核心产品——NOKOV(度量)光学三维动作捕捉系统,采用高性能红外摄…

入驻 【集简云开发者平台】,SDK嵌入方案介绍

1 什么是SDK嵌入方案 SDK嵌入方案可以将集简云的产品功能嵌入到我们自己的产品内,为我们的用户提供集简云的功能。用户体系通过接口打通,用户无需注册或者登录集简云使用。 示例:集简云SDK嵌入到WordPress中:  &am…

【电信计费系统项目实战】介绍篇

#写在前面 技术源于分享,本篇我主要介绍一下达内的一个web项目:电信计费系统,它是基于struts2jdbcoracle实现的,当时完成它感觉并没有完完全全弄透,不过现在一看,咋这么简单呢(嘿嘿!勿喷)。现在…

【分享】如何使用集简云的【数据存储】应用

1 什么是数据存储? "数据存储" 是集简云一款内置应用,在流程中提供一个临时缓存数据库,我们可以将流程中产生的数据进行临时存储,方便进行跨流程调用或进行库内特殊操作。 2. 数据存储使用场景 表单系统中常收集待…

腾讯云企业网盘正式入驻数字工具箱

腾讯技术公益 继腾讯电子签等入驻后,上线近半年的腾讯技术公益数字工具箱再次迎来新成员——腾讯云企业网盘,现已正式接受公益机构申请公益权益。 腾讯云企业网盘(https://pan.tencent.com)是由腾讯云推出的一款安全、高效、开放的…

【分享】微信公众号在 “集简云平台“ 集成应用的常见问题与解决方案

“function category of API need be confirmed by component rid”错误 是由于使用未认证的微信公众号或者个人微信公众号没有此动作的接口权限导致, 也有可能是授权时未勾选对于的授权权限所致 【解决方法】: 1 此接口必须使用企业认证的微信公众号&#xff0…

作为三年付费老用户,强烈推荐这款同步网盘

很少推荐个人消费类产品,此次破例。实在是太好用了,这款网盘——没有之一。 金山快盘倒闭之后,我一直在寻找合适的产品。市面上所有的网盘——付费和非付费的全部深度体验之后,最后锁定了这家产品,然后付费。一年200多…

入门教学 | 快速了解集简云

集简云是一款超级软件连接器,无需开发,无需代码知识就可以轻松打通数百款软件之间的数据连接,构建自动化与智能化的业务流程。通过自动化业务流程,每月可节省企业数百甚至数万小时的人工成本。 集简云是什么? 集简云是一款超级软件连接器,无需开发,无需代码知识,就可以…

【分享】订阅用友U8集简云连接器同步费用审批数据至用友U8系统

方案简介 集简云通过与钉钉连接平台深度融合,实现OA审批通过后,将采购、报销、收款、售后等费用审批单数据自动同步至用友U8系统,大大提高了企业日常采购、报销、付款等的工作效率,实现企业业务流程的自动化,为企业降…

【分享】群报数入驻集简云平台,实现无代码集成数百款应用

群报数介绍 群报数是一款人人可用的轻量化统计小程序,支持填表、报名、接龙、预约、打卡、问卷、通知等多种场景。 群报数集简云使用场景 企业的用户信息,人才信息往往在很多不同的系统里,比如CRM系统,客服系统,人力…

【分享】“飞书自建“在集简云平台集成应用的常见问题与解决方案

一、通讯录动作常见问题 1.通讯录动作出现错误了怎么办? 如果遇到“通讯录动作”出现问题,请点击以下链接,参考【通讯录常见问题】相关文档 【通讯录常见问题】文档:开发文档 - 飞书开放平台 2.如何高效地使用通讯录接口&#xf…

使用集简云将UpTimer同步到Notion

使用UpTimer同步到Notion 对于集简云我们应当非常熟悉了,之前讲过很多流程啦~ 利用集简云将Notion数据库更新订阅到Outlook和微信[1] 【干货分享】集简云 2步轻松定制个人RSS阅读器 |高效获取信息[2] 释放双手|自动化NOTION的最佳平台推荐|NOTION同步滴答清单|懒人[…

中国网文的海外冲锋

中国网文的海外冲锋 “2018年8月23日,阅文集团与中国图书进出口(集团)总公司(以下简称“中图公司”)全球战略合作签约仪式于北京国际图书博览会期间举行。秉持共同发展、互利共赢的宗旨,双方将进行一系列深…

网文作者都在使用什么写作软件?

很多新手网文作者以及外行人都觉得,写小说使用写作软件没有必要,只要能实现码字就都一样。但,如果你有一款适合自己的写作软件,码字的过程与普通码字完全不一样。对于一名网文作者,在写小说时,如果有一个浓厚的码字环境,会让你快速进入到写作状态,每日四千或六千字的保…

抖音超火的微信推送

废话不多说,先上效果图,原理代码都很简单,小白也能很快上手 具体步骤: 1.登陆微信测试公众号平台,这一步用到的就是下面三张图里的东西 2.开始写python代码,主要就是各种api调用,可以参考这个网…

微软 Bing Chat 上线 AI 文档聊天功能,真好用!

公众号关注 “GitHubDaily” 设为 “星标”,每天带你逛 GitHub! 今年 2 月,微软正式推出了全新的、基于 AI 驱动的 Bing 搜索引擎以及新一代 Edge 浏览器。 将 ChatGPT 能力集成到 Bing 上,让用户可以直接用 Bing 与 AI 进行对话&…

和YOYO表白

小爱连续对话 闲来无事和YOYO聊天,还是俗套的开场,虽然很俗,但是这个不重要,主要是为了进行表白,我鼓起勇气问她,做我女朋友吧,…呃,她温柔的拒绝了我。我觉得这应该不是她真实的想…

只会简单功能测试?接口自动化测试让你技术进阶

不知不觉,“金三银四”跳槽季已经接近尾声。在这求职市场混迹了一圈,身边很多测试同行开始讨论薪资的声音也愈发大了起来。工作年限不短,项目经验也不少,测试人要涨薪该往哪些方面努力?面试时哪些点可让自己“升值”&a…