首页
搜索
python
爬虫
golang
工具
前端
软件
登录
搜索
李大叔
累计撰写
61
篇文章
累计收到
10
条评论
首页
栏目
python
爬虫
golang
工具
前端
软件
页面
首页
作者 【1】 的文章
2024-5-30
解决unity打包安卓因图片加载过多,image出现黑屏。
排查了一下,感觉是内存溢出,后面改了一下。没有出现这个问题了建议大家别用www这个去下载图片了,这个是很老的方法了,使用 UnityWebRequest 代替 WWW:UnityWebRequestTexture.GetTexture(url) 用于加载图片资源。使用对象池管理图片对象:避免频繁创建和销毁图片对象,减少内存分配和回收的开销。使用缓存机制:缓存已经加载的图片,避免重复加载相同的图片。手动释放旧资源:在替换图片时手动释放旧的 Texture2D 资源,防止内存泄漏。后面就没有出现这个问题了。
2024年-5月-30日
772 阅读
0 评论
软件
2024-4-29
python3 解决ssl错误,ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)
这个是linux centos7系统的。windows系统很简单的我就不说了。这里主要讲解不跳过验证的。requests有忽略的方法,但是有一些库没有下面说一个全局的方法import sslprint(ssl.get_default_verify_paths())运行,就可以知道位置在那里http://curl.haxx.se/ca/cacert.pem;证书文件然后上传证书文件到,名字要一致openssl_cafile='/usr/local/openssl/ssl/cert.pem'这个路径就可以了
2024年-4月-29日
4172 阅读
0 评论
python
2024-4-26
用nodejs部署服务应用,可以部署unity打包的webgl的应用
没装nodejs去装,最好装nodejs15版本的。其他版本对依赖有要求,我是centos7的。具体安装:curl -sL https://rpm.nodesource.com/setup_15.x | bash -yum -y install nodejs安装Express 生成器npm install -g express-generator创建一个服务express --no-view my-server进入到刚刚创建的项目根目录下cd my-server安装依赖npm i然后运行npm start端口默认是3000,具体可以用nginx去反代还有把你项目的文件放到public里面就可以变成你的项目了
2024年-4月-26日
966 阅读
0 评论
前端
2024-4-19
unity2018及之前打包安卓12黑屏解决
主要是权限问题。没有授权READ_PHONE_STATE权限,导致安卓12黑屏。所以要对打包的安卓的jar进行修改unity安装路径里面有classes.jar。具体你们自己去找。流程两种,第一种反编译,修改,然后再编译。第二种就是工具:jbe下载 这个用于修改字节码工具:jd-gui下载 (可选)这个用于修改查看jar包原码下面说第二种解压classes.jar。用jbe打开UnityPlayer这个文件找到Methods/addPhoneCallListener/[0]Code,开始编辑。在这上面添加getstatic android/os/Build$VERSION/SDK_INT Ibipush 31if_icmplt 5return然后保存在压缩回去,改好名字和后缀。重新打包
2024年-4月-19日
1466 阅读
2 评论
经验
2024-4-18
golang对语音转文本。sdk
直接上代码;wss对接方式package mainimport ("context""crypto/hmac""crypto/sha256""encoding/base64""encoding/json""fmt""io""io/ioutil""net/http""net/url""os""strings""time""github.com/gorilla/websocket")/**语音听写流式 WebAPI 接口调用示例 接口文档(必看):https://doc.xfyun.cn/rest_api/语音听写(流式版).htmlwebapi 听写服务参考帖子(必看):http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=38947&extra=语音听写流式WebAPI 服务,热词使用方式:登陆开放平台https://www.xfyun.cn/后,找到控制台--我的应用---语音听写---服务管理--上传热词注意:热词只能在识别的时候会增加热词的识别权重,需要注意的是增加相应词条的识别率,但并不是绝对的,具体效果以您测试为准。错误码链接:https://www.xfyun.cn/document/error-code (code返回错误码时必看)@author iflytek*/var (hostUrl = "wss://iat-api.xfyun.cn/v2/iat"apiKey = ""apiSecret = ""file = "test (3).mp3" //请填写您的音频文件路径appid = "b34589c1")const (STATUS_FIRST_FRAME = 0STATUS_CONTINUE_FRAME = 1STATUS_LAST_FRAME = 2)func main() {fmt.Println(HmacWithShaTobase64("hmac-sha256", "hello\nhello", "hello"))st := time.Now()d := websocket.Dialer{HandshakeTimeout: 5 * time.Second,}//握手并建立websocket 连接conn, resp, err := d.Dial(assembleAuthUrl(hostUrl, apiKey, apiSecret), nil)if err != nil {panic(readResp(resp) + err.Error())return} else if resp.StatusCode != 101 {panic(readResp(resp) + err.Error())}//打开音频文件var frameSize = 1280 //每一帧的音频大小var intervel = 40 * time.Millisecond //发送音频间隔//开启协程,发送数据ctx, _ := context.WithCancel(context.Background())defer conn.Close()var status = 0go func() { // start: audioFile, err := os.Open(file) if err != nil { panic(err) } status = STATUS_FIRST_FRAME //音频的状态信息,标识音频是第一帧,还是中间帧、最后一帧 // time.Sleep(20*time.Second) var buffer = make([]byte, frameSize) for { len, err := audioFile.Read(buffer) if err != nil { if err == io.EOF { //文件读取完了,改变status = STATUS_LAST_FRAME status = STATUS_LAST_FRAME } else { panic(err) } } select { case <-ctx.Done(): fmt.Println("session end ---") return default: } switch status { case STATUS_FIRST_FRAME: //发送第一帧音频,带business 参数 frameData := map[string]interface{}{ "common": map[string]interface{}{ "app_id": appid, //appid 必须带上,只需第一帧发送 }, "business": map[string]interface{}{ //business 参数,只需一帧发送 "language": "zh_cn", "domain": "iat", "accent": "mandarin", }, "data": map[string]interface{}{ "status": STATUS_FIRST_FRAME, "format": "audio/L16;rate=16000", "audio": base64.StdEncoding.EncodeToString(buffer[:len]), "encoding": "lame", }, } fmt.Println("send first") conn.WriteJSON(frameData) status = STATUS_CONTINUE_FRAME case STATUS_CONTINUE_FRAME: frameData := map[string]interface{}{ "data": map[string]interface{}{ "status": STATUS_CONTINUE_FRAME, "format": "audio/L16;rate=16000", "audio": base64.StdEncoding.EncodeToString(buffer[:len]), "encoding": "lame", }, } conn.WriteJSON(frameData) case STATUS_LAST_FRAME: frameData := map[string]interface{}{ "data": map[string]interface{}{ "status": STATUS_LAST_FRAME, "format": "audio/L16;rate=16000", "audio": base64.StdEncoding.EncodeToString(buffer[:len]), "encoding": "lame", }, } conn.WriteJSON(frameData) fmt.Println("send last") return // goto start } //模拟音频采样间隔 time.Sleep(intervel) }}()//获取返回的数据//var decoder Decodervar content stringfor { var resp = RespData{} _, msg, err := conn.ReadMessage() if err != nil { fmt.Println("read message error:", err) break } json.Unmarshal(msg, &resp) //fmt.Println(string(msg)) content += resp.Data.Result.String() fmt.Println(resp.Data.Result.String(), resp.Sid) if resp.Code != 0 { fmt.Println(resp.Code, resp.Message, time.Since(st)) return } //decoder.Decode(&resp.Data.Result) if resp.Data.Status == 2 { //cf() //fmt.Println("final:",decoder.String()) fmt.Println(resp.Code, resp.Message, time.Since(st)) break //return }}fmt.Println(content)//time.Sleep(1 * time.Second)}type RespData struct {Sid string json:"sid"Code int json:"code"Message string json:"message"Data Data json:"data"}type Data struct {Result Result json:"result"Status int json:"status"}// 创建鉴权url apikey 即 hmac usernamefunc assembleAuthUrl(hosturl string, apiKey, apiSecret string) string {ul, err := url.Parse(hosturl)if err != nil {fmt.Println(err)}//签名时间date := time.Now().UTC().Format(time.RFC1123)//date = "Tue, 28 May 2019 09:10:42 MST"//参与签名的字段 host ,date, request-linesignString := []string{"host: " + ul.Host, "date: " + date, "GET " + ul.Path + " HTTP/1.1"}//拼接签名字符串sgin := strings.Join(signString, "\n")fmt.Println(sgin)//签名结果sha := HmacWithShaTobase64("hmac-sha256", sgin, apiSecret)fmt.Println(sha)//构建请求参数 此时不需要urlencodingauthUrl := fmt.Sprintf("hmac username=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey,"hmac-sha256", "host date request-line", sha)//将请求参数使用base64编码authorization := base64.StdEncoding.EncodeToString([]byte(authUrl))v := url.Values{}v.Add("host", ul.Host)v.Add("date", date)v.Add("authorization", authorization)//将编码后的字符串url encode后添加到url后面callurl := hosturl + "?" + v.Encode()return callurl}func HmacWithShaTobase64(algorithm, data, key string) string {mac := hmac.New(sha256.New, []byte(key))mac.Write([]byte(data))encodeData := mac.Sum(nil)return base64.StdEncoding.EncodeToString(encodeData)}func readResp(resp *http.Response) string {if resp == nil {return ""}b, err := ioutil.ReadAll(resp.Body)if err != nil {panic(err)}return fmt.Sprintf("code=%d,body=%s", resp.StatusCode, string(b))}// 解析返回数据,仅供demo参考,实际场景可能与此不同。type Decoder struct {results []*Result}func (d Decoder) Decode(result Result) {if len(d.results) <= result.Sn {d.results = append(d.results, make([]*Result, result.Sn-len(d.results)+1)...)}if result.Pgs == "rpl" {for i := result.Rg[0]; i <= result.Rg[1]; i++ {d.results[i] = nil}}d.results[result.Sn] = result}func (d *Decoder) String() string {var r stringfor _, v := range d.results {if v == nil {continue}r += v.String()}return r}type Result struct {Ls bool json:"ls"Rg []int json:"rg"Sn int json:"sn"Pgs string json:"pgs"Ws []Ws json:"ws"}func (t *Result) String() string {var wss stringfor _, v := range t.Ws {wss += v.String()}return wss}type Ws struct {Bg int json:"bg"Cw []Cw json:"cw"}func (w *Ws) String() string {var wss stringfor _, v := range w.Cw {wss += v.W}return wss}type Cw struct {Sc int json:"sc"W string json:"w"}
2024年-4月-18日
401 阅读
0 评论
golang
2024-4-18
golang对接科大讯飞语音合成
接口文档:https://www.xfyun.cn/doc/tts/online_tts/API.html#%E6%8E%A5%E5%8F%A3%E8%A6%81%E6%B1%82讯飞是ws的对接方式,sdk文档也没有golang。哈哈首先语音合成:package mainimport ("crypto/hmac""crypto/sha256""encoding/base64""encoding/json""fmt""io/ioutil""net/http""net/url""os""strings""time""github.com/gorilla/websocket")/**语音听写流式 WebAPI 接口调用示例 接口文档(必看):https://doc.xfyun.cn/rest_api/语音听写(流式版).htmlwebapi 听写服务参考帖子(必看):http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=38947&extra=语音听写流式WebAPI 服务,热词使用方式:登陆开放平台https://www.xfyun.cn/后,找到控制台--我的应用---语音听写---服务管理--上传热词注意:热词只能在识别的时候会增加热词的识别权重,需要注意的是增加相应词条的识别率,但并不是绝对的,具体效果以您测试为准。错误码链接:https://www.xfyun.cn/document/error-code (code返回错误码时必看)@author iflytek*/var (hostUrl = "wss://tts-api.xfyun.cn/v2/tts"apiKey = ""apiSecret = ""appid = "b34589c1")const (STATUS_FIRST_FRAME = 0STATUS_CONTINUE_FRAME = 1STATUS_LAST_FRAME = 2)func main() {fmt.Println(HmacWithShaTobase64("hmac-sha256", "hello\nhello", "hello"))st := time.Now()d := websocket.Dialer{HandshakeTimeout: 5 * time.Second,}var srcText string = "你好天下123ABC"//握手并建立websocket 连接conn, resp, err := d.Dial(assembleAuthUrl(hostUrl, apiKey, apiSecret), nil)if err != nil { panic(readResp(resp) + err.Error()) return} else if resp.StatusCode != 101 { panic(readResp(resp) + err.Error())}defer conn.Close()frameData := map[string]interface{}{ "common": map[string]interface{}{ "app_id": appid, //appid 必须带上,只需第一帧发送 }, "business": map[string]interface{}{ //business 参数,只需一帧发送 "vcn": "x4_lingxiaolu_en", "aue": "raw", "speed": 50, "tte": "UTF8", }, "data": map[string]interface{}{ "status": STATUS_LAST_FRAME, "text": base64.StdEncoding.EncodeToString([]byte(srcText)), },}fmt.Println("send first")conn.WriteJSON(frameData)//获取返回的数据//var decoder DecoderaudioFile, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.ModePerm)if err != nil { panic(err)}for { var resp = RespData{} _, msg, err := conn.ReadMessage() if err != nil { fmt.Println("read message error:", err) break } fmt.Println(string(msg)) json.Unmarshal(msg, &resp) if resp.Code != 0 { fmt.Println(resp.Code, resp.Message, time.Since(st)) return } //decoder.Decode(&resp.Data.Audio) //audiobytes, err := base64.StdEncoding.DecodeString(resp.Data.Audio) //if err != nil { // panic(err) //} //_, err = audioFile.Write(audiobytes) //if err != nil { // panic(err) //} if resp.Data.Status == 2 { //cf() //fmt.Println("final:",decoder.String()) fmt.Println(resp.Data.Audio, 1111111) fmt.Println(resp.Code, resp.Message, time.Since(st)) break //return }}audioFile.Close()time.Sleep(1 * time.Second)}type RespData struct {Sid string json:"sid"Code int json:"code"Message string json:"message"Data Data json:"data"}type Data struct {Audio string json:"audio,omitempty"Ced int json:"ced,omitempty"Status int json:"status,omitempty"}// 创建鉴权url apikey 即 hmac usernamefunc assembleAuthUrl(hosturl string, apiKey, apiSecret string) string {ul, err := url.Parse(hosturl)if err != nil {fmt.Println(err)}//签名时间date := time.Now().UTC().Format(time.RFC1123)//date = "Tue, 28 May 2019 09:10:42 MST"//参与签名的字段 host ,date, request-linesignString := []string{"host: " + ul.Host, "date: " + date, "GET " + ul.Path + " HTTP/1.1"}//拼接签名字符串sgin := strings.Join(signString, "\n")fmt.Println(sgin)//签名结果sha := HmacWithShaTobase64("hmac-sha256", sgin, apiSecret)fmt.Println(sha)//构建请求参数 此时不需要urlencodingauthUrl := fmt.Sprintf("hmac username=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey,"hmac-sha256", "host date request-line", sha)//将请求参数使用base64编码authorization := base64.StdEncoding.EncodeToString([]byte(authUrl))v := url.Values{}v.Add("host", ul.Host)v.Add("date", date)v.Add("authorization", authorization)//将编码后的字符串url encode后添加到url后面callurl := hosturl + "?" + v.Encode()return callurl}func HmacWithShaTobase64(algorithm, data, key string) string {mac := hmac.New(sha256.New, []byte(key))mac.Write([]byte(data))encodeData := mac.Sum(nil)return base64.StdEncoding.EncodeToString(encodeData)}func readResp(resp *http.Response) string {if resp == nil {return ""}b, err := ioutil.ReadAll(resp.Body)if err != nil {panic(err)}return fmt.Sprintf("code=%d,body=%s", resp.StatusCode, string(b))}// 解析返回数据,仅供demo参考,实际场景可能与此不同。type Decoder struct {results []*Result}func (d Decoder) Decode(result Result) {if len(d.results) <= result.Sn {d.results = append(d.results, make([]*Result, result.Sn-len(d.results)+1)...)}if result.Pgs == "rpl" {for i := result.Rg[0]; i <= result.Rg[1]; i++ {d.results[i] = nil}}d.results[result.Sn] = result}func (d *Decoder) String() string {var r stringfor _, v := range d.results {if v == nil {continue}r += v.String()}return r}type Result struct {Ls bool json:"ls"Rg []int json:"rg"Sn int json:"sn"Pgs string json:"pgs"Ws []Ws json:"ws"}func (t *Result) String() string {var wss stringfor _, v := range t.Ws {wss += v.String()}return wss}type Ws struct {Bg int json:"bg"Cw []Cw json:"cw"}func (w *Ws) String() string {var wss stringfor _, v := range w.Cw {wss += v.W}return wss}type Cw struct {Sc int json:"sc"W string json:"w"}
2024年-4月-18日
384 阅读
0 评论
golang
2024-3-11
云知声口语评测Api接口对接,踩坑。对接是http协议。python/go语言版本
文档地址:https://ai.unisound.com/doc/sacalleval/http.html云知声的口语评测有一定的免费量。文档使用简单。对比其他我觉得云知声比较好用错误码说明:https://gitee.com/unisound_sh/eval-oral-ws/wikis/ErrorCodeList#sever参考官网的javaDemo改成如下;python版本对接文档操作,一直返回53249。说数据格式问题 headers={ 'Content-Type':'multipart/form-data;charset=UTF-8', 'appkey':'********', 'session-id':str(uuid.uuid4()), 'device-id': 'userid', } dict_con={ 'mode':'A', 'text':'apple', } files = {'voice': open("apple.mp3", 'rb')} response=requests.post('http://edu.hivoice.cn:8085/eval/mp3',headers=headers,data=dict_con,files=files).text print(response)后面改成如下就没问题了。删除这个类型'Content-Type':'multipart/form-data;charset=UTF-8'就行了go版本package mainimport ( "bytes" "fmt" "github.com/google/uuid" "io" "io/ioutil" "mime/multipart" "net/http" "os")func main() { // 读取文件内容 file, err := os.Open("E:\\project_master\\脚本\\语音评测\\apple.mp3") if err != nil { fmt.Println("Error opening file:", err) return } defer file.Close() // 创建一个 buffer 用于构建 multipart/form-data 请求体 body := &bytes.Buffer{} writer := multipart.NewWriter(body) // 写入其它字段 writer.WriteField("mode", "A") writer.WriteField("text", "apple") // 写入文件 part, err := writer.CreateFormFile("voice", "apple.mp3") if err != nil { fmt.Println("Error creating form file:", err) return } part.Write([]byte("\r\n")) _, err = io.Copy(part, file) if err != nil { fmt.Println("Error copying file:", err) return } // 完成请求体的构建 writer.Close() // 创建 HTTP 请求 req, err := http.NewRequest("POST", "http://edu.hivoice.cn:8085/eval/mp3", body) if err != nil { fmt.Println("Error creating request:", err) return } req.Header.Set("Content-Type", writer.FormDataContentType()) req.Header.Set("appkey", "XXXXX") req.Header.Set("session-id", uuid.New().String()) req.Header.Set("device-id", "userid") // 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() // 读取响应内容 respBody, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response:", err) return } // 打印响应内容 fmt.Println(string(respBody))}go的就是参数顺序要对。要不就一定提示说没有传送文件
2024年-3月-11日
806 阅读
0 评论
python
2024-2-18
supervisor管理项目进程。golang/python项目自动启动
1,安装(必须安装python的环境)pip install supervisor2 生成默认的配置文件 建议放在自建配置目cd /etcmkdir supervisorcd supervisorecho_supervisord_conf > supervisor.conf # 生成 supervisor 默认配置文件3.修改配置文件 启动一定指定配置文件绝对路径vim supervisor.conf # 修改 supervisor 配置文件,添加 gunicorn 进程管理在 supervisor.conf 配置文件底部添加 [program:myapp] 进程管理名称随便拟定 有时候和项目启动脚本重复时 会出现Bugcommand=/home/myproject/venv/bin/gunicorn -w4 -b0.0.0.0:8080 app:app ; supervisor启动命令directory=/home/myproject ; 项目的文件夹路径startsecs=0 ; 启动时间stopwaitsecs=0 ; 终止等待时间autostart=false ; 是否自动启动autorestart=false ; 是否自动重启stdout_logfile=/home/myproject/log/gunicorn.log ; log 日志stderr_logfile=/home/myproject/log/gunicorn.err ; 错误日志4 配置 web 管理界面supervisor 还有一个 web 的管理界面,可以激活。更改下配置 客户端 (ctl 表示客户端 **d 表示服务端)[inet_http_server] ; inet (TCP) server disabled by defaultport=127.0.0.1:9001 ; (ip_address:port specifier, *:port for alliface)username=wang ; (default is no username (open server) 登录客户端的账号password=123 ; (default is no password (open server)) 登录客户端的密码 随便拟定 服务端与下面客户端配置必须一致[supervisorctl]serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socketserverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socketusername=wang ; should be same as http_username if setpassword=123 ; should be same as http_password if set;prompt=mysupervisor ; cmd line prompt (default "supervisor");history_file=~/.sc_history ; use readline history if available5 启动服务supervisord -c /etc/supervisor/supervisord.conf 启动 同时启动的客户端和服务端进入客户端supervisorctl -c /etc/supervisor/supervisord.conf1 基本操作 helpstatus 察看supervisor的状态reload 重新载入 配置文件start [all]|[appname] 启动指定/所有 supervisor管理的程序进程stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程2 直接操作 supervisorctl -c /etc/supervisor/supervisord.conf status 察看supervisor的状态supervisorctl -c /etc/supervisor/supervisord.conf reload 重新载入 配置文件supervisorctl -c /etc/supervisor/supervisord.conf start [all]|[appname] 启动指定/所有 supervisor管理的程序进程supervisorctl -c supervisor.conf stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程
2024年-2月-18日
688 阅读
0 评论
golang
2023-12-26
记录部署nuxt3项目,使用nginx反向代理,使用p2p管理项目
说明下我的版本问题,不同版本可能会有区别node:v16nuxt3:3.8.1linux:centos7.21,首先打包项目npm run build2,在Linux安装node,yum安装方便点 curl -sL https://rpm.nodesource.com/setup_16.x | bash - yum install -y nodejs安装成功查看版本,没问题下一步node -v安装pm2npm i pm2 -g全部安装完成,把打包好的nuxt项目放到服务器目录(自己创建的目录)在项目根目录新建ecosystem.config.js,文件内容如下:module.exports = { apps: [ { name: 'NuxtAppName', script: './.output/server/index.mjs' } ] }然后启动pm2 start ecosystem.config.js已经启动成功了,默认端口是3000接下来安装nginxyum install nginx配置配置文件(路径一般在etc/nginx/)配置端口转发server { location / { proxy_pass http://ip:3000; }}nginx -s reload重启一下域名解析,ssl证书再配置一下就可以了
2023年-12月-26日
4127 阅读
0 评论
前端
2023-12-20
nuxt3本地持久化解决方案,防止刷新恢复初始值,ssr端
我们使用pinia来解决这个问题pinia-plugin-persistedstate这个是插件第一如果没安装pinpa请安装(已安装请忽略)npm i @pinia/nuxt第二安装插件 npm i pinia-plugin-persistedstate后面配置文件,在Config文件修改 export default defineNuxtConfig({ modules: [ '@pinia/nuxt', '@pinia-plugin-persistedstate/nuxt' ], devtools: { enabled: true } })创建Store文件import { defineStore } from 'pinia'export const useStore = defineStore('main', { state: () => { return { someState: '你好 pinia', } }, persist: true,//这个很重要,开启持久化的标志})后面直接使用就可以了
2023年-12月-20日
3362 阅读
0 评论
前端
1
2
3
4