<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>苏青の博客</title><description>记录生活与技术</description><link>https://blog.137869.xyz/</link><language>zh_CN</language><item><title>静态Html部署-Cloudflare</title><link>https://blog.137869.xyz/posts/cloudflare/</link><guid isPermaLink="true">https://blog.137869.xyz/posts/cloudflare/</guid><description>通过Cloudflare部署html</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;首先注册并登录&lt;a href=&quot;https://cloudflare.com&quot;&gt;Cloudflare&lt;/a&gt;&lt;/h2&gt;
&lt;h2&gt;1.操作控制台&lt;/h2&gt;
&lt;p&gt;找到&lt;code&gt;Workers 和 Pages&lt;/code&gt;
&lt;img src=&quot;./1.png&quot; alt=&quot;图片&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2.准备开始搭建工作&lt;/h2&gt;
&lt;p&gt;找到并点击&lt;code&gt;创建应用程序&lt;/code&gt;
&lt;img src=&quot;./2.png&quot; alt=&quot;图片&quot; /&gt;
点击开始下方&lt;code&gt;开始使用&lt;/code&gt;
&lt;img src=&quot;./3.png&quot; alt=&quot;图片&quot; /&gt;
找到&lt;code&gt;拖放文件&lt;/code&gt;并点击&lt;code&gt;开始使用&lt;/code&gt;
&lt;img src=&quot;./4.png&quot; alt=&quot;图片&quot; /&gt;
输入&lt;code&gt;项目名称&lt;/code&gt;如:text 点击&lt;code&gt;创建项目&lt;/code&gt;
&lt;img src=&quot;./5.png&quot; alt=&quot;图片&quot; /&gt;
拖拽文件夹上传至Cloudflare 点击&lt;code&gt;部署站点&lt;/code&gt;
&lt;img src=&quot;./6.png&quot; alt=&quot;图片&quot; /&gt;
等待部署 出现&lt;code&gt;成功！您的项目已部署到以下区域：全球&lt;/code&gt; 则就是部署成功了
点击下方&lt;code&gt;***.pages.dev&lt;/code&gt;即可访问
&lt;img src=&quot;./7.png&quot; alt=&quot;图片&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;3.覆盖与删除&lt;/h2&gt;
&lt;h1&gt;部署新文件&lt;/h1&gt;
&lt;p&gt;找到要覆盖的项目
点击&lt;code&gt;创造部署&lt;/code&gt;
&lt;img src=&quot;./8.png&quot; alt=&quot;图片&quot; /&gt;
上传新的站点完整文件 点击&lt;code&gt;保存并部署&lt;/code&gt;
&lt;img src=&quot;./9.png&quot; alt=&quot;图片&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;覆盖文件&lt;/h1&gt;
&lt;p&gt;找到要回滚的文件 点击&lt;code&gt;回滚到此部署&lt;/code&gt;
&lt;img src=&quot;./10.png&quot; alt=&quot;图片&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;删除项目&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;找到&lt;code&gt;设置&lt;/code&gt; 划到最底部 点击&lt;code&gt;删除&lt;/code&gt;
&lt;img src=&quot;./11.png&quot; alt=&quot;图片&quot; /&gt;
输入项目名后确认删除即可&lt;/p&gt;
</content:encoded></item><item><title>免费领取年抛域名</title><link>https://blog.137869.xyz/posts/nicnames/</link><guid isPermaLink="true">https://blog.137869.xyz/posts/nicnames/</guid><pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;免费领取年抛域名&lt;/h1&gt;
&lt;h2&gt;一、优惠码获取&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;官网注册：&lt;a href=&quot;https://nicnames.com&quot;&gt;Nicnames 官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;社区入口：&lt;a href=&quot;https://discord.gg/doma&quot;&gt;Discord 群组&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1. 加入 Discord 群组&lt;/h3&gt;
&lt;p&gt;进入上方 Discord 链接，完成账号登录并加入群组。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./1.jpg&quot; alt=&quot;示意图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. 执行指令领取优惠&lt;/h3&gt;
&lt;p&gt;找到频道 &lt;code&gt;nicnames-promos&lt;/code&gt;，在输入框中输入指令：/promos&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./2.jpg&quot; alt=&quot;示意图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. 绑定邮箱并领取优惠码&lt;/h3&gt;
&lt;p&gt;根据提示填写&lt;strong&gt;与 Nicnames 注册一致的邮箱&lt;/strong&gt;，完成邮箱验证码验证，即可成功获取优惠码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./3.jpg&quot; alt=&quot;示意图&quot; /&gt;
&lt;img src=&quot;./4.jpg&quot; alt=&quot;示意图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;二、域名注册流程&lt;/h2&gt;
&lt;p&gt;返回 Nicnames 官网，搜索心仪域名并进入注册页面，结算时粘贴上方获取的优惠码，即可全额抵扣完成免费注册。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./5.jpg&quot; alt=&quot;示意图&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;三、DNS 自定义设置&lt;/h2&gt;
&lt;p&gt;域名解析支持两种方案，可按需选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 Nicnames 官方 DNS 服务器&lt;/li&gt;
&lt;li&gt;自行切换至第三方 DNS（推荐 Cloudflare）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Hello World</title><link>https://blog.137869.xyz/posts/hi/</link><guid isPermaLink="true">https://blog.137869.xyz/posts/hi/</guid><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Hello World&lt;/h1&gt;
&lt;p&gt;这是一篇 Hello World 测试文章。&lt;/p&gt;
</content:encoded></item><item><title>PHP 实现金额语音播报接口</title><link>https://blog.137869.xyz/posts/guide/</link><guid isPermaLink="true">https://blog.137869.xyz/posts/guide/</guid><description>利用 PHP 开发金额转语音接口，拼接多段 MP3 音频并流式输出，可用于收款到账语音提示</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;PHP 实现金额语音播报接口&lt;/h1&gt;
&lt;p&gt;在收银系统、收款提醒、桌面播报等场景中，经常需要将数字金额转为语音播报。本文使用 PHP 编写一套&lt;strong&gt;金额语音合成接口&lt;/strong&gt;，通过拆分数字、匹配对应读音音频，将多段 MP3 按顺序拼接并以流的形式返回，实现完整的语音播报能力。&lt;/p&gt;
&lt;h2&gt;一、功能简介&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;接收 &lt;code&gt;GET&lt;/code&gt; 方式传递的金额数字，支持整数、小数格式。&lt;/li&gt;
&lt;li&gt;严格校验参数格式，非法参数直接返回错误状态码。&lt;/li&gt;
&lt;li&gt;根据数字位数、单位（个、十、百、千、万、亿、小数点）匹配对应音频文件。&lt;/li&gt;
&lt;li&gt;自动拼接「叮、到账、金额、元」等多段音频，流式输出 MP3。&lt;/li&gt;
&lt;li&gt;增加文件存在性检测，音频缺失时返回服务端错误。&lt;/li&gt;
&lt;li&gt;自带跨域响应头，可直接被前端页面调用。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;二、完整接口代码与逻辑说明&lt;/h2&gt;
&lt;p&gt;新建 PHP 文件，粘贴以下全部代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
// 允许跨域请求
header(&quot;Access-Control-Allow-Origin: *&quot;); 

// 音频文件存放目录（与当前php文件同级的 mp3 文件夹）
$voiceDir = __DIR__ . &apos;/mp3/&apos;;
// 获取 GET 传递的 money 参数
$num = trim($_GET[&apos;money&apos;] ?? &apos;&apos;);

// 正则校验：仅允许纯数字 + 小数格式
if (!preg_match(&apos;/^\d+(\.\d+)?$/&apos;, $num)) {
    http_response_code(400);
    exit;
}

// 数字读音映射
$AA = [&quot;0&quot;,&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;,&quot;5&quot;,&quot;6&quot;,&quot;7&quot;,&quot;8&quot;,&quot;9&quot;];
// 数位、小数点读音映射
$BB = [&quot;&quot;,&quot;shi&quot;,&quot;bai&quot;,&quot;qian&quot;,&quot;wan&quot;,&quot;yi&quot;,&quot;dian&quot;,&quot;&quot;];

// 将数字按小数点拆分为 整数部分、小数部分
$a = explode(&quot;.&quot;, $num);
// 去除整数部分前面多余的 0
$intStr = ltrim($a[0], &apos;0&apos;);
if ($intStr === &apos;&apos;) {
    $intStr = &apos;0&apos;;
}

$re = [];

// 处理整数部分为 0 的场景
if ($intStr === &apos;0&apos;) {
    $re[] = &apos;0&apos;;
    // 存在小数部分
    if (isset($a[1]) &amp;amp;&amp;amp; $a[1] !== &apos;&apos;) {
        $re[] = &apos;dian&apos;;
        for ($i = 0; $i &amp;lt; strlen($a[1]); $i++) {
            $re[] = $AA[(int)$a[1][$i]];
        }
    }
} else {
    $intLen = strlen($intStr);
    $k = 0;

    // 从后往前遍历整数，组合数位与读音
    for ($i = $intLen - 1; $i &amp;gt;= 0; $i--) {
        switch ($k) {
            case 0:
                array_unshift($re, $BB[7]);
                break;
            case 4:
                $reg = &quot;/0{4}\d{&quot; . ($intLen - $i - 1) . &quot;}$/&quot;;
                if (!preg_match($reg, $intStr)) {
                    array_unshift($re, $BB[4]);
                }
                break;
            case 8:
                array_unshift($re, $BB[5]);
                $BB[7] = $BB[5];
                $k = 0;
                break;
        }

        // 处理中间零的读音
        if ($k % 4 == 2 &amp;amp;&amp;amp; isset($intStr[$i+2]) &amp;amp;&amp;amp; $intStr[$i+2] != &apos;0&apos; &amp;amp;&amp;amp; isset($intStr[$i+1]) &amp;amp;&amp;amp; $intStr[$i+1] == &apos;0&apos;) {
            array_unshift($re, $AA[0]);
        }

        $currChar = $intStr[$i];
        if ($currChar != &apos;0&apos;) {
            array_unshift($re, $BB[$k % 4]);
            array_unshift($re, $AA[(int)$currChar]);
        }
        $k++;
    }

    // 拼接小数部分读音
    if (isset($a[1]) &amp;amp;&amp;amp; $a[1] !== &apos;&apos;) {
        $re[] = $BB[6];
        for ($i = 0; $i &amp;lt; strlen($a[1]); $i++) {
            $re[] = $AA[(int)$a[1][$i]];
        }
    }
}

// 过滤空值，重新整理数组下标
$re = array_values(array_filter($re, fn($v) =&amp;gt; $v !== &apos;&apos;));

// 组装完整音频列表：开头音效 + 金额读音 + 结尾单位
$fileList = [];
$fileList[] = $voiceDir . &apos;ding.mp3&apos;;
$fileList[] = $voiceDir . &apos;daozhang.mp3&apos;;

foreach ($re as $val) {
    $fileList[] = $voiceDir . $val . &apos;.mp3&apos;;
}

$fileList[] = $voiceDir . &apos;yuan.mp3&apos;;

// 遍历检测所有音频文件是否存在、可读
foreach ($fileList as $file) {
    if (!file_exists($file) || !is_readable($file)) {
        http_response_code(500);
        exit;
    }
}

// 设置响应头为音频类型
header(&quot;Content-Type: audio/mpeg&quot;);
header(&quot;Content-Disposition: inline; filename=alipay.mp3&quot;);

// 清空缓冲区，准备流式输出
ob_clean();
flush();

// 分段读取音频并输出，实现无缝播放
foreach ($fileList as $file) {
    $handle = fopen($file, &apos;rb&apos;);
    while (!feof($handle)) {
        echo fread($handle, 8192);
        flush();
    }
    fclose($handle);
}

exit;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体MP3文件可进QQ群516128569见群文件&lt;/p&gt;
</content:encoded></item></channel></rss>