清朝云资源网

作者: 清朝云

  • Vscode 修改 markdown 文章的技巧


    共计 428 个字符,预计需要花费 2 分钟才能阅读完成。

    遇见好的文章,难免有保存下来的想法,使用 Copy as markdown 插件可以很方便地复制 markdown 格式。但是,有时候复制下来地文章可能需要很多处理才符合自己的意思,所以总结了一些快速修改格式的方法。

    温馨提示:如果是完全的复制,而没有自己的东西,最好是留下原文链接哈。

    1. 文章带内链

    这类情况一般是文章或者标题内容带有链接的情况,并且一般为内链。当然,如果文章带的链接不是博客的内链,比如说链接到一些有用的地址,也可以不去掉。

    正则表达式:

    \[(.+)\]\((.+)\)

    替换为:

    $1

    Vscode 修改 markdown 文章的技巧

    />

    效果:

    Vscode 修改 markdown 文章的技巧

    />

    2. 锚点标题

    这类一般是文章为了方便目录跳转,然后 markdown 复制时会出现标题面前带有链接的情况。

    正则表达式:

    ([#]{0,})([ ]{1,})\[\]\(.+\)(.+)

    替换为:

    $1$2$3

    Vscode 修改 markdown 文章的技巧

    />

    效果:

    Vscode 修改 markdown 文章的技巧

    />

    3. 图片带链接

    图片一般只是展示,但是某些图片可能带有跳转链接,有时候需要去掉这类跳转链接。

    正则表达式:

    \[(!\[\]\(.+\))\]\(.+\)

    替换为:

    $1

    Vscode 修改 markdown 文章的技巧

    />

    效果:

    Vscode 修改 markdown 文章的技巧

    />

    Tips:清朝云网络工作室

  • WordPress添加观影和书单插件 – WP-Douban

    前言

    之前写过一篇追剧页面的function代码,现在给大家推荐一个可以添加书单,观影页面的插件。

    教程

    首先上传插件文件,然后到插件的设置页面填写豆瓣的ID和申请的KEY。

    记得申请KEY的时候需要填写应用简介,请用英文不要用中文,否则会提示需要你告知他们将会如何使用API。

    设置的时候静态文件和开启分类不要勾选,否则可能不会显示(至少我的是这样的,目前不知道是什么原因)

    链接地址

    具体的教程地址:https://fatesinger.com/101050

    项目开源地址:https://github.com/bigfa/wp-douban

    下载地址:https://github.com/bigfa/wp-douban/releases/tag/v4.4.3

     

  • WordPress右下角添加问候语

    前言

    看到他们不少人为WordPress添加了问候语,但是都是显示在页面的顶部,我觉得容易遮挡其他元素和存在时间很短,于是改了代码,让其显示在页面右下角并且显示五秒

    代码

    将代码放到主题后台的自定义代码中的页脚代码内即可。

    <!--首页问候-->
    <div id="greetingBox"></div>
    <style>
        #greetingBox {
            position: fixed;
            bottom: 10px;
            right: 15px;
            width: 400px;
            text-align: right;
            z-index: 10000;
            pointer-events: none
        }
    
        #greeting {
            display: inline-block;
            position: relative;
            opacity: 0;
            bottom: -110px;
            padding: 5px 40px;
            border-radius: 50px;
            background-color: #fff;
            color: #000;
            font-size: small;
            transition: .5s;
            box-shadow: rgb(0 0 0 / 5%) 0 10px 20px
        }
    
        #greeting.shown {
            opacity: 1;
            bottom: 0
        }
    </style>
    <script>
        (() => {
        const greeting = [
            {
                realNode: {
                    greeting: "您好,今天过得怎么样?",
                    start_time: 0,
                    end_time: 11
                }
            },
            {
                realNode: {
                    greeting: "中午好👋, 记得好好吃午饭哦",
                    start_time: 11,
                    end_time: 13
                }
            },
            {
                realNode: {
                    greeting: "下午好👋, 希望你下午工作顺利",
                    start_time: 13,
                    end_time: 18
                }
            },
            {
                realNode: {
                    greeting: "晚上好👋, 在属于自己的时间好好放松😌~",
                    start_time: 18,
                    end_time: 24
                }
            }
        ];
    
        let e = greeting.length !== 0 ? greeting : [
            // 默认问候语数组
        ];
    
        let t = document.createElement("div");
        t.id = "greeting";
        setTimeout(() => {
            t.classList.add("shown");
        }, 1000);
    
        let i = document.querySelector("#greetingBox");
        i.appendChild(t);
    
        const n = new Date().getHours();
        let r = "";
        for (let t = 0; t < e.length; t++) {
            if (n >= e[t].realNode.start_time && n < e[t].realNode.end_time) {
                r = e[t].realNode.greeting;
                break;
            }
        }
        t.innerHTML = r;
        setTimeout(() => {
            t.classList.remove("shown");
            setTimeout(() => {
                i.remove();
            }, 500);
        }, 5000);
    })();
    </script>
    
  • WordPress搜索屏蔽所有页面

    前言

    用WordPress搭建网站的站长都知道,WordPress自带的搜索路径为?s= ,这就导致搜索结果出来的时候会包含页面而不是只有文章内容,所以今天教大家如何让搜索结果屏蔽所有页面内容。

    教程

    我用的是CoreNext主题自带有子主题,如果没有子主题的要慎重修改。

    将如下代码加到function.php 中即可

    function search_filter_page($query) {
        if ($query->is_search) {
            $query->set('post_type', 'post');
        }
        return $query;
     }
    add_filter('pre_get_posts','search_filter_page');

    测试

    加代码之前的效果:

    加代码之后的效果:

     

  • 08月07日,星期三, 每天60秒读懂全世界!

    百度热搜新闻

    新闻来源:百度热搜榜

    1. 全红婵卫冕冠军 北京时间8月6日,巴黎奥运会女子10米跳台跳水决赛中国队包揽金银牌!全红婵卫冕夺金,陈芋汐摘下银牌!中国获得第22枚金牌!

    2. 全红婵再现10101010101010 8月6日晚,巴黎奥运会女子单人10米台决赛中,全红婵登场第一跳就点燃全场!完美入水裁判给出7个10分,再现水花消失术!

    3. 收到暴雨预警信息后 这些措施要做到 近几日,中央气象台连续发布暴雨、强对流天气预警。收到暴雨预警信息后,这些措施要做到。

    4. 陈芋汐摘银 当地时间8月6日,在跳水女子10米跳台决赛中,全红婵为游泳“梦之队”夺得第5金,陈芋汐摘银。

    5. 全红婵夺金后一路小跑找陈芋汐拥抱 当地时间8月6日,跳水女子10米跳台决赛,全红婵为游泳“梦之队”夺得第5金,陈芋汐摘银。全红婵赛后一路小跑找陈芋汐拥抱。

    6. 一飞往日本客机发生机舱内袭击事件

    7. 曹利国古典式摔跤60公斤级银牌 北京时间8月7日凌晨,巴黎奥运会男子摔跤古典式60公斤级决赛,中国选手曹利国获得银牌。

    8. 重庆黔江发生5.2级地震?谣言 近日,某网民发布视频并配文“重庆市黔江区发生了5.2级地震”,引发关注。经向有关部门核实,该地未发生地震,网传信息系谣言。

    9. 菲尔普斯:无端指责潘展乐是错误的 当地时间8月5日,美国游泳传奇人物“飞鱼”菲尔普斯在巴黎接受记者采访时表示,无端指责潘展乐的表现是错误的。

    10. 伊利否认员工女乒决赛做侮辱性手势 近日,巴黎奥运会乒乓球女子单打决赛现场,一观众的侮辱性动作引发争论,网传其是伊利员工。对此,伊利回应称:非公司员工。

    —- 百度热搜新闻 End —-

    知乎新闻

    新闻来源:知乎日榜

    标题: 樊振东夺冠比赛,是外国运动员不出汗,还是中国队的衣服不吸汗?
    链接: https://daily.zhihu.com/story/9774357
    ———————-
    标题: 为什么有人身处打压式家庭里还能自信起来?
    链接: https://daily.zhihu.com/story/9774354
    ———————-
    标题: 关于年号的历史知识有哪些?
    链接: https://daily.zhihu.com/story/9774360
    ———————-
    标题: 我国科学家发现宇宙最高能量伽马谱线,这对我国来说具有哪些重大意义?
    链接: https://daily.zhihu.com/story/9774365
    ———————-
    标题: 瞎扯 · 如何正确地吐槽
    链接: https://daily.zhihu.com/story/9774367
    ———————-

    —- 知乎新闻 End —-

    IT之家新闻

    新闻来源:ITHome之家科技新闻

    标题: 小米雷军称倒霉的地方老是跟苹果华为比
    发布时间: 2024-08-06T11:33:55.137
    新闻简介: 雷军在访谈中提到:“我倒霉的地方就是老跟苹果华为比,要比这两个大哥惊艳。有人问我为什么不能比苹果好,我说小米四百亿,他们三万亿,哪怕你给我一万亿美金我就能比他们惊艳。”#雷军称倒霉的地方就是老跟苹果华为比#
    ———————-
    标题: 疑似奇瑞内部讲话曝光:3 个人干 5 个人的活拿 4 个人的工资,提高加班效率
    发布时间: 2024-08-06T10:04:19.25
    新闻简介: 近日,一份奇瑞 7 月份内部经管会会议精神文件在网上流传。据截图显示,7 月 12 日奇瑞控股集团公司经营管理委员会召开 7 月份会议。会议提到,要坚持提高人员效率,人事部门要把关于加班问题的要求落实到人事工作改善的具体行动中,特别要围绕人员“345”的策略,研究人员效率、工作质量和工作能力提升。
    ———————-
    标题: 《黑神话:悟空》官宣完成正式版本所有内容开发,8 月 8 日上午 10 点发布新宣传片
    发布时间: 2024-08-06T10:08:44.673
    新闻简介: 游戏科学官方今日官宣,《黑神话:悟空》已经完成了正式版本所有内容的开发,将如期与大家见面。
    ———————-
    标题: 董明珠:格力正开发“不要电”的空调,直连光伏实现 0 电费
    发布时间: 2024-08-06T09:37:19.443
    新闻简介: 8 月 2 日,格力电器在河北召开“格力冰洗生活电器战略发布会”,董事长兼总裁董明珠在会上透露,格力正在开发一款“不要电”的空调。这项技术的开发始于 2012 年,并经历了十几年的创新与改进。
    ———————-
    标题: 39.98~44.98 万元,鸿蒙智行享界 S9 豪华轿车正式发布:首发华为 ADS 3.0
    发布时间: 2024-08-06T17:10:12.417
    新闻简介: 鸿蒙智行享界 S9 豪华轿车正式发布:首发华为 ADS 3.0。
    ———————-
    标题: 理想 M7 / M8 / M9 谍照曝光,三款纯电 SUV 同框
    发布时间: 2024-08-06T11:33:39.737
    新闻简介: 理想汽车的三款纯电动 SUV 车型谍照曝光,据悉这三款车型可能会命名为 M7、M8 和 M9,预计将于 2025 年上市,主要面向 30 万元以上的市场,满足家庭用户的需求。
    ———————-
    标题: 预售 24.98 万元,余承东宣布问界新 M7 Pro 成都车展正式发布:搭载华为 ADS 基础版
    发布时间: 2024-08-06T17:13:53.07
    新闻简介: 目前关于问界新 M7 Pro 的消息还比较有限,不过余承东在发布会上表示新车将搭载 HUAWEI ADS 基础版智驾系统,进一步降低入手门槛。
    ———————-
    标题: 小米澎湃 OS 2.0 新特性曝光:酒店等场景下扫描隐藏摄像头
    发布时间: 2024-08-06T14:27:07.047
    新闻简介: 科技媒体 xiaomitime 于 8 月 4 日发布博文,表示小米澎湃 OS(HyperOS)2.0 即将引入新特性,基于 WLAN 搜索和检测附近是否存在隐藏的摄像头,更好地保护小米手机用户安全和隐私。
    ———————-
    标题: 华为 MatePad Pro 12.2、MatePad Air 2024 平板电脑完整配置曝光:2.8K 144Hz 屏、麒麟处理器
    发布时间: 2024-08-06T10:29:34.977
    新闻简介: 全新华为 MatePad Pro 12.2、MatePad Air 2024 平板电脑将于今日下午正式发布,博主 @数码闲聊站 爆料了两款新品的详细配置。
    ———————-
    标题: (更新:已下架)继江苏后,特斯拉 Model Y 车型进入福建省政府“采购网上超市”名单
    发布时间: 2024-08-06T15:58:43.233
    新闻简介: 在今年 7 月 4 日,IT之家报道了特斯拉 Model Y 入围江苏省政府用车采购目录的消息,这是全国首例特斯拉进入政府采购目录的案例,此后包括上海城投兴港集团、临港投控集团等多家国企也宣布采购了一批特斯拉 Model Y 车辆作为企业功能用车。而根据“福建省政府采购网上超市”网站,目前一款特斯拉 Model Y“TSL6480BEVAR0”车型已进入“采购网上超市”名单,这是一款后轮驱动版(标准续航版)星空灰色车型。
    ———————-
    标题: 4299 元起,华为 MatePad Pro 12.2 平板电脑发布:业界首发 2.8K 144Hz 双层 OLED 屏
    发布时间: 2024-08-06T15:07:39.607
    新闻简介: 华为 MatePad Pro 12.2 平板电脑今日正式发布,拥有流金、宣白、砚黑配色,厚度 5.5mm,重量 508g。
    ———————-
    标题: 小米王腾预热“有意思的产品”,消息称为小尺寸性能平板:处于立项阶段、有望归属 Redmi 品牌
    发布时间: 2024-08-06T16:09:15.627
    新闻简介: 博主 @数码闲聊站 发文“猜测”,有意思的产品为“高性能定制小尺寸平板”。新品还没有参数,处于立项阶段,有望归属“子系”(即 Redmi 品牌)。
    ———————-

    —- IT之家新闻 End —-

  • Wireguard 搭建异地组网


    共计 3543 个字符,预计需要花费 9 分钟才能阅读完成。

    前言

    之前就一直听说 Wireguard 可以进行异地组网,但是多次尝试发现只能达到点对点通信的效果,需要在每台机器上搭建客户端显然是不合理的。并且由于搭建了 tailscale,并且是基于 wireguard 的,所以就没再折腾了。

    最近因为群友提到这个,所以又折腾了一下,并且互相交流了一番,发现果然可以实现异地组网。但是,组网却比 tailscale 麻烦上许多,并且有些出现的问题可能很难发现。但是基于本人多次尝试,发现了一个对自己来说比较方便的搭建方式。

    服务器搭建wg-easy

    1. 安装wireguard内核

    由于使用的是 centos7 服务器,默认内核不支持 wireguard。

    如果不进行安装可能出现如下日志:

    Mon May 27 03:19:09 UTC 2024: Starting Wireguard /etc/wireguard/wg0.conf
    [#] ip link add wg0 type wireguard
    RTNETLINK answers: Not supported
    Unable to access interface: Protocol not supported
    [#] ip link delete dev wg0
    Cannot find device “wg0”
    Adding iptables NAT rule

    运行如下命令安装即可:

    yum update && \
    yum install epel-release elrepo-release -y && \
    yum install yum-plugin-elrepo -y && \
    yum install kmod-wireguard wireguard-tools -y

    2. 加载模块

    如果不进行如下命令操作,可能后续会出现能 ping 通,但是不能够进行 ssh 或者 http 访问的情况。

    sudo modprobe iptable_filter && \
    sudo modprobe ip6table_filter

    3. 安装wg-easy

    wg-easy 是一个可以快速搭建 wireguard 服务端的项目,提供了一个方便的 ui 界面,生成客户端只需要在界面生成,然后即可下载配置文件。

    当然了,之前因为没有搭建成功也是由于它的弊端,因为他的配置文件不能手动修改,所以就导致客户端配置了路由,但是服务器不知道往哪里发的问题

    所以,搭建 wg-easy 只是为了过度。

    version: '3.1'
    services:
      wg-easy:
        image: weejewel/wg-easy:nightly
        container_name: wg-easy
        environment:
          - WG_HOST=<Server IP>
          - PASSWORD=<PASSWORD>
          - WG_ALLOWED_IPS=10.8.0.0/24
          - WG_PERSISTENT_KEEPALIVE=25
          - WG_DEFAULT_DNS=114.114.114.114
          - UI_TRAFFIC_STATS=true
        volumes:
          - /home/docker/wireguard:/etc/wireguard
        network_mode: "host"
        # 51820 为 wireguard 数据传输的端口,51821 为 wg-easy 端口
        # ports:
        #   - 51820:51820/udp
        #   - 51821:51821/tcp
        cap_add:
          - NET_ADMIN
          - SYS_MODULE
        privileged: true
        restart: unless-stopped

    这里需要注意的配置有三个:

    • WG_HOST:填写服务器 IP
    • PASSWORD:访问 wg-easy 的密码
    • WG_ALLOWED_IPS:客户端路由地址,即客户端下载配置文件都会携带该配置

    安装wireguard客户端

    创建客户端配置文件

    访问 ip:51821,然后输入密码即可进入 wg-easy 图形界面,如下图所示。(如果需要配置反代可以自行配置)

    Wireguard 搭建异地组网

    />

    wireguard 官方客户端下载地址:https://www.wireguard.com/install/#ubuntu-module-tools

    windows安装

    在网页端点击下载,然后导入配置文件即可。

    Wireguard 搭建异地组网

    />

    移动端安装

    直接扫码即可导入配置。

    Wireguard 搭建异地组网

    />

    linux安装

    在 linux 上,个人喜欢使用 docker 进行安装。当然,如果使用的依然是 centos,那么还需要像上面那样安装 wireguard 内核

    下载配置文件,将其修改为 wg0.conf,然后放在 /home/docker/wireguard 目录下。

    再运行如下命令:

    docker run -d \
    --privileged \
    --net=host  \
    --restart=always \
    --name wireguard-client \
    --cap-add NET_ADMIN \
    --cap-add SYS_MODULE \
    -v /home/docker/wireguard/wg0.conf:/etc/wireguard/wg0.conf \
    --restart unless-stopped \
    cmulk/wireguard-docker:alpine

    异地组网

    如果按上面的步骤,应该可以实现点对点进行通信,即连接上的客户端会像这样出现红点。

    Wireguard 搭建异地组网

    />

    比如网络情况如下,并且需要移动端能够实现移动端直接输入服务器 A 和服务器 B 的内网 ip 即可访问服务。

    Wireguard 搭建异地组网

    />

    要实现上述目的,要进行如下操作。

    1. 保证移动端路由

    Wireguard 搭建异地组网

    />

    这里显示的配置意思是,wireguard 会代理 10.8.0.0/24, 172.21.9.0/24, 172.30.1.0/24, 172.26.1.0/24, 172.20.2.0/23 的流量,将所有匹配的流量都发往服务器。

    2. 修改服务器配置

    例如我的内网设备为 gw 这台设备,当服务器收到 172.21.9.0/24, 172.30.1.0/24, 172.26.1.0/24, 172.20.2.0/23 请求时,需要将其转发到 gw 设备上。

    修改对应的 AllowedIPs 即可。

    Wireguard 搭建异地组网

    />

    删除 wg-easy 容器。

    wg-easy 的作用在这里就结束了,它的作用就是为了方便地生成客户端地配置,现在客户端基本已经配置好了,并且需要修改 wg0.conf,而它会覆盖配置,所以需要删除。

    docker rm -f wg-easy

    运行如下命令:

    docker run -d \
    --privileged \
    --net=host  \
    --restart=always \
    --name wireguard-client \
    --cap-add NET_ADMIN \
    --cap-add SYS_MODULE \
    -v /home/docker/wireguard/wg0.conf:/etc/wireguard/wg0.conf \
    --restart unless-stopped \
    cmulk/wireguard-docker:alpine

    3. 修改客户端配置

    如果内网设备为路由器,不需要进行该操作。

    首先内网设备需要开启 ipv4 转发,运行 cat /proc/sys/net/ipv4/ip_forward 如果结果为 1,表示转发已开启。

    否则需要修改 /etc/sysctl.conf 文件,将 #net.ipv4.ip_forward=1 修改为 net.ipv4.ip_forward=1。再执行 sysctl -p

    另外,wg0.conf 需要添加如下配置:

    PostUp   = iptables -A FORWARD -i client_route -j ACCEPT; iptables -A FORWARD -o client_route -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -i eth0 -j ACCEPT; iptables -A FORWARD -o eth0 -j ACCEPT; iptables -t nat -A POSTROUTING -o client_route -j MASQUERADE
    PostDown = iptables -D FORWARD -i client_route -j ACCEPT; iptables -D FORWARD -o client_route -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -i eth0 -j ACCEPT; iptables -D FORWARD -o eth0 -j ACCEPT; iptables -t nat -D POSTROUTING -o client_route -j MASQUERADE

    Wireguard 搭建异地组网

    />

    如果不添加上面的配置,将服务路由到其他服务器,因为没有进行源地址 nat 转换,即使数据发送到了服务器 A/B 上,数据也回不来,因为它不知道 10.8.0.0/24 的路由。照上面的配置,在发送到其他服务器时,会将源地址转换成内网设备的地址。

    Tips:清朝云网络工作室

  • Docker 部署 funasr 语音转文字服务


    共计 3275 个字符,预计需要花费 9 分钟才能阅读完成。

    前言

    由于家人有需要,经常需要听会议记录或者通话录音,于是想着直接将录音导出,然后进行转文字,再通过 gpt 进行总结或者其他的操作。找了很多项目,最好还是在 nodeseek 论坛的坛友建议下,找到了 funasr 这个项目。使用感受是,识别准确率确实还不错,非常满足我的需求。

    FunASR 是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD)、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR 提供了便捷的脚本和教程,支持预训练好的模型的推理与微调。

    目前 FunASR 支持 docker 部署,不过只有 cpu 版本,并且支持实时转换和离线转换。

    官方服务

    如果仅仅是简单使用,那么其实不必要自己搭建服务,因为这个毕竟比较吃硬件。

    此时可以访问官方 h5 页面:链接

    Docker 部署 funasr 语音转文字服务

    />

    可以看见,页面确实比较简陋,但是该有的功能基本都有。

    这里需要注意的是 asr 服务器地址:

    • wss://www.funasr.com:10096/: 这个为实时语音识别地址,支持麦克风、文件如 pcm、wav 格式,但是不支持 mp3、m4a 等格式

    • wss://www.funasr.com:10095/: 支持 mp3、m4a 等格式

    效果:

    Docker 部署 funasr 语音转文字服务

    />

    自建asr服务器

    这里是把两个实时和离线两个服务都部署了,所以直接使用 docker-compose

    version: '3'
    services:
      funasr:
        image: registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.5
        container_name: funasr
        ports:
          - "10095:10095"
        privileged: true
        volumes:
          - /home/docker/funasr/models:/workspace/models
          - /home/docker/funasr/samples:/samples
          - /home/docker/funasr/mp3:/mp3
        command: tail -f /dev/null
      funasr-online:
        image: registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.10
        container_name: funasr-online
        ports:
          - "10096:10095"
        privileged: true
        volumes:
          - /home/docker/funasr/models:/workspace/models
          - /home/docker/funasr/samples:/samples
          - /home/docker/funasr/mp3:/mp3
        command: tail -f /dev/null

    其实只需要映射模型目录 /home/docker/funasr/models:/workspace/models 即可,其余的目录是为了方便测试而进行的映射。

    如果需要查看官方测试案例和下载官方测试包,可以查看快速开始

    • 启动离线语音识别服务
    # 进入容器
    docker exec -it funasr bash
    # 进入服务目录
    cd /workspace/FunASR/runtime
    # 启动服务
    nohup bash run_server_2pass.sh  \
    --model-thread-num 8 \
      --download-model-dir /workspace/models \
      --vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
      --model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx  \
      --online-model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx  \
      --punc-dir damo/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727-onnx \
      --itn-dir thuduj12/fst_itn_zh \
      --hotword /workspace/models/hotwords.txt > log.txt 2>&1 &
    
    # 如果您想关闭ssl,增加参数:--certfile 0
    # 如果您想使用时间戳或者nn热词模型进行部署,请设置--model-dir为对应模型:
    #   damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx(时间戳)
    #   damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404-onnx(nn热词)
    # 如果您想在服务端加载热词,请在宿主机文件./funasr-runtime-resources/models/hotwords.txt配置热词(docker映射地址为/workspace/models/hotwords.txt):
    #   每行一个热词,格式(热词 权重):阿里巴巴 20

    如果是第一次启动,那么需要等模型下载完成才可以使用,可以查看 log.txt 查看情况。

    • 启动实时语音识别服务
    # 进入容器
    docker exec -it funasr-online bash
    # 进入服务目录
    cd /workspace/FunASR/runtime
    # 启动服务
    nohup bash run_server.sh \
    --model-thread-num 8 \
    --download-model-dir /workspace/models \
    --vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
    --model-dir damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx \
    --punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
    --lm-dir damo/speech_ngram_lm_zh-cn-ai-wesp-fst \
    --itn-dir thuduj12/fst_itn_zh \
    --hotword /workspace/models/hotwords.txt > log.txt 2>&1 &
    
    # 如果您想关闭ssl,增加参数:--certfile 0
    # 如果您想使用时间戳或者nn热词模型进行部署,请设置--model-dir为对应模型:
    #   damo/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx(时间戳)
    #   damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404-onnx(nn热词)
    # 如果您想在服务端加载热词,请在宿主机文件./funasr-runtime-resources/models/hotwords.txt配置热词(docker映射地址为/workspace/models/hotwords.txt):
    #   每行一个热词,格式(热词 权重):阿里巴巴 20

    同样如果是第一次启动,也需要等待模型下载完成。

    等待服务启动完毕以后,可以使用官方的 h5 页面,将 asr 替换为自己的服务器地址。或者将上面提到的 快速开始 里面的测试包下载,里面也有一样 h5 页面,并且可以自行修改一些内容,下面就是经过修改后的,时间上更为明显了。

    Docker 部署 funasr 语音转文字服务

    />

    Tips:清朝云网络工作室

  • Docker 搭建体验极佳的 webssh 程序 tsterm


    共计 169 个字符,预计需要花费 1 分钟才能阅读完成。

    这也是看见论坛坛友推荐的,搭建尝试了一下,感觉非常不错。之前也介绍过几种 webssh 工具,但是用起来都没有这款 tsterm 舒适。

    搭建如下:

    docker run -d --name webterm -p 5000:5000 itushan/tsterm

    可以对字体大小、背景等进行设置。

    Docker 搭建体验极佳的 webssh 程序 tsterm

    />

    并可以记录连接历史,当然,这是本地记录。

    Docker 搭建体验极佳的 webssh 程序 tsterm

    />

    ssh 界面,看起来也非常舒适。

    Docker 搭建体验极佳的 webssh 程序 tsterm

    />

    Tips:清朝云网络工作室

  • WordPress添加友链自助申请

    前言

    闲着无聊想弄个自助申请友链的功能,这样就不弄在评论区慢慢输入网站标题等文字了。

    教程

    因为我是登录才能评论所以以下代码只适用登录后才能评论。

    1.首先在子主题的function.php 中添加如下代码。

    function display_friendlink_form() {
        ob_start();
        ?>
        <style>
            #friendlink-form label {
                display: block;
                margin-bottom: 5px;
                font-weight: bold;
            }
    
            #friendlink-form input[type="text"],
            #friendlink-form input[type="url"] {
                width: 20%;
                padding: 10px;
                margin-bottom: 10px;
                border: 1px solid #ccc;
                border-radius: 4px;
                box-sizing: border-box;
            }
    
            #friendlink-form button[type="submit"] {
                padding: 10px 20px;
                background-color: #4CAF50;
                color: #fff;
                border: none;
                border-radius: 4px;
                cursor: pointer;
            }
    
            #friendlink-form button[type="submit"]:hover {
                background-color: #45a049;
            }
    
            #friendlink-notification {
                position: fixed;
                bottom: 20px;
                right: 20px;
                background-color: #4CAF50;
                color: #fff;
                padding: 10px;
                border-radius: 4px;
                display: none;
                z-index: 9999;
            }
        </style>
    
        <form id="friendlink-form" method="post">
            <div>
                <label for="website-name">网站名称:<input type="text" name="website-name" id="website-name" required></label>
            </div>
            <div>
                <label for="website-description">网站描述:<input type="text" name="website-description" id="website-description" required></label>
            </div>
            <div>
                <label for="website-url">网站地址:<input type="url" name="website-url" id="website-url" required></label>
            </div>
            <div>
                <label for="website-icon">网站图标:<input type="url" name="website-icon" id="website-icon" required></label>
            </div>
            <button type="submit" id="submit-friendlink" disabled>提交</button>
        </form>
    
        <div id="friendlink-notification"></div>
    
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                var submitButton = document.getElementById('submit-friendlink');
                var websiteNameInput = document.getElementById('website-name');
                var websiteDescriptionInput = document.getElementById('website-description');
                var websiteUrlInput = document.getElementById('website-url');
                var websiteIconInput = document.getElementById('website-icon');
    
                function validateForm() {
                    if (websiteNameInput.value.trim() !== '' &&
                        websiteDescriptionInput.value.trim() !== '' &&
                        websiteUrlInput.value.trim() !== '' &&
                        websiteIconInput.value.trim() !== '') {
                        submitButton.disabled = false;
                    } else {
                        submitButton.disabled = true;
                    }
                }
    
                websiteNameInput.addEventListener('input', validateForm);
                websiteDescriptionInput.addEventListener('input', validateForm);
                websiteUrlInput.addEventListener('input', validateForm);
                websiteIconInput.addEventListener('input', validateForm);
    
                document.getElementById('friendlink-form').addEventListener('submit', function(event) {
                    event.preventDefault();
    
                    var websiteName = websiteNameInput.value;
                    var websiteDescription = websiteDescriptionInput.value;
                    var websiteUrl = websiteUrlInput.value;
                    var websiteIcon = websiteIconInput.value;
    
                    var commentContent = '网站名称:' + websiteName + 'nn' +
                                         '网站描述:' + websiteDescription + 'nn' +
                                         '网站地址:' + websiteUrl + 'nn' +
                                         '网站图标:' + websiteIcon;
    
                    var commentData = {
                        action: 'submit_friendlink',
                        websiteName: websiteName,
                        websiteDescription: websiteDescription,
                        websiteUrl: websiteUrl,
                        websiteIcon: websiteIcon,
                        post_id: <?php echo get_the_ID(); ?>,
                        user_id: <?php echo get_current_user_id(); ?>,
                    };
    
                    var xhr = new XMLHttpRequest();
                    xhr.open('POST', '<?php echo admin_url('admin-ajax.php'); ?>', true);
                    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                    xhr.onload = function() {
                        if (xhr.status === 200) {
                            var response = JSON.parse(xhr.responseText);
                            if (response.success) {
                                location.reload(); // 手动刷新页面
                            } else {
                                showNotification('你尚未登录请登录后重试。');
                            }
                        } else {
                            showNotification('你尚未登录请登录后重试。');
                        }
                    };
                    xhr.send(Object.keys(commentData).map(function(key) {
                        return encodeURIComponent(key) + '=' + encodeURIComponent(commentData[key]);
                    }).join('&'));
                });
            });
    
            function showNotification(message) {
                var notification = document.getElementById('friendlink-notification');
                notification.textContent = message;
                notification.style.display = 'block';
                setTimeout(function() {
                    notification.style.display = 'none';
                }, 2000);
            }
        </script>
        <?php
        return ob_get_clean();
    }
    add_shortcode('friendlink_form_new', 'display_friendlink_form');
    
    function submit_friendlink_callback() {
        if (is_user_logged_in()) {
            $websiteName = $_POST['websiteName'];
            $websiteDescription = $_POST['websiteDescription'];
            $websiteUrl = $_POST['websiteUrl'];
            $websiteIcon = $_POST['websiteIcon'];
            $postID = $_POST['post_id'];
            $userID = $_POST['user_id'];
    
            if (empty($websiteName) || empty($websiteDescription) || empty($websiteUrl) || empty($websiteIcon)) {
                echo json_encode(array('success' => false));
                wp_die();
            }
    
            $commentData = array(
                'comment_post_ID' => $postID,
                'comment_author' => get_userdata($userID)->display_name,
                'comment_content' => "网站名称:$websiteNamenn网站描述:$websiteDescriptionnn网站地址:$websiteUrlnn网站图标:$websiteIcon",
                'comment_type' => '',
                'comment_parent' => 0,
                'user_ID' => $userID,
            );
    
            $commentID = wp_new_comment($commentData);
            if ($commentID) {
                echo json_encode(array('success' => true));
            } else {
                echo json_encode(array('success' => false));
            }
        } else {
            echo json_encode(array('success' => false));
        }
    
        wp_die();
    }
    add_action('wp_ajax_submit_friendlink', 'submit_friendlink_callback');
    add_action('wp_ajax_nopriv_submit_friendlink', 'submit_friendlink_callback');

    2.在友链页面合适的地方添加[friendlink_form_new] 短代码。

     

  • WordPress首页文章底部添加线条

    前言

    在某个网站看到鼠标放到首页文章,它的底部会出现线条,于是就突发奇想想给自己网站弄一个

    效果

    别人的:

    4243455e6d579155a4ce6464af10c289.webp

    自己的:

    fb76e1eeeeacd77427264422446c1021.webp

    教程

    请将如下两个代码中的任何一个添加到子主题的CSS文件夹中的main.css 中或在主题设置中添加自定义css代码

    1.固定颜色

    .post-item {
      position: relative;
    }
    
    .post-item::before {
      content: "";
      position: absolute;
      bottom: 0;
      left: 0;
      width: 0;
      height: 3px;
      background: var(--color, #000);
      transition: width 1s, background-color 0.5s; /* 添加了背景颜色的过渡效果 */
    }
    
    .post-item:hover::before {
      width: 100%;
    }
    
    /* 使用计算来设置颜色 */
    .post-item:nth-of-type(1)::before {
      --color: hsl(0, 100%, 50%); /* 设置第一个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(2)::before {
      --color: hsl(72, 100%, 50%); /* 设置第二个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(3)::before {
      --color: hsl(144, 100%, 50%); /* 设置第三个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(4)::before {
      --color: hsl(216, 100%, 50%); /* 设置第四个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(5)::before {
      --color: hsl(288, 100%, 50%); /* 设置第五个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(6)::before {
      --color: hsl(324, 100%, 50%); /* 设置第六个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(7)::before {
      --color: hsl(36, 100%, 50%); /* 设置第七个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(8)::before {
      --color: hsl(108, 100%, 50%); /* 设置第八个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(9)::before {
      --color: hsl(180, 100%, 50%); /* 设置第九个.post-item的线条颜色 */
    }
    
    .post-item:nth-of-type(10)::before {
      --color: hsl(252, 100%, 50%); /* 设置第十个.post-item的线条颜色 */
    }

    2.动态颜色

    .post-item {
      position: relative;
    }
    
    .post-item::before {
      content: "";
      position: absolute;
      bottom: 0;
      left: 0;
      width: 0;
      height: 3px;
      background: var(--color, #000);
      transition: width 1s;
    }
    
    .post-item:hover::before {
      width: 100%;
    }
    
    .post-item:hover::before {
      animation: randomColor 2s infinite;
    }
    
    @keyframes randomColor {
      0% {
        background: red;
      }
      25% {
        background: blue;
      }
      50% {
        background: green;
      }
      75% {
        background: yellow;
      }
      100% {
        background: purple;
      }
    }