<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>项目 on Jasper</title><link>https://jasper-aa64.github.io/zh/projects/</link><description>Recent content in 项目 on Jasper</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 30 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jasper-aa64.github.io/zh/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>IELTS：代码结构</title><link>https://jasper-aa64.github.io/zh/projects/ielts-studio-structure/</link><pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate><guid>https://jasper-aa64.github.io/zh/projects/ielts-studio-structure/</guid><description>&lt;p&gt;IELTS 是我做的雅思口语和写作练习工具，最近加了模拟面试。代码在 &lt;a href="https://github.com/Jasper-aa64/AI-realtime_speech-for-IELTS-Job_Interview"&gt;GitHub&lt;/a&gt;，最新的是 &lt;code&gt;desktop-realtime-voice&lt;/code&gt; 分支。这篇以现在的代码为基线，按三个问题讲：谁在什么时候干活，数据长什么样、放在哪，为什么这样切。第 5 节专门列现在的问题，踩坑的经过放在&lt;a href="../ielts-studio-retrospective/"&gt;复盘&lt;/a&gt;里。&lt;/p&gt;</description></item><item><title>IELTS：复盘</title><link>https://jasper-aa64.github.io/zh/projects/ielts-studio-retrospective/</link><pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate><guid>https://jasper-aa64.github.io/zh/projects/ielts-studio-retrospective/</guid><description>&lt;p&gt;这篇是 &lt;a href="../ielts-studio-structure/"&gt;IELTS&lt;/a&gt; 的复盘。现在的代码是什么样、有哪些问题，结构篇第 5 节已经列全了，这里讲这些问题是怎么来的，以及下次会怎么做。先说结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;复用要复用线程模型，不能只复用类。&lt;/strong&gt; IELTS 命令行版复用了 &lt;code&gt;RealtimeClient&lt;/code&gt; 和音频类，但没复用麦克风、播放两个线程和状态机，结果考官的语音发出去了，却没人播。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新写的东西先打通一条最简单的端到端。&lt;/strong&gt; 10 月初新写的 &lt;code&gt;native_voice&lt;/code&gt; 把最底下的设备层写得很干净，但网络、识别、合成一样都没有，接不进产品。10 月底换了做法：先把旧原型的连接层修好，再在上面写一层只管&amp;quot;说一段、听一段&amp;quot;的语音会话，第二天就接进了桌面壳。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;省事的设计都有代价，要写下来。&lt;/strong&gt; 半双工防住了回声，代价是不能打断；拿对话模型当朗读器，省掉了一个语音合成服务，代价是没法校验它有没有照读。新引擎改用了火山的指定文本接口，后一条才算解决。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接口文档里的参数，要实测过才算数。&lt;/strong&gt; 判停窗口要另开一个开关才生效，必传的字段旧代码一直没发，这两件都是对着文档逐项核、再实测才发现的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网站这边三条&lt;/strong&gt;：慢在调用通道，不在逻辑；修 bug 先拿证据；&amp;ldquo;什么时候算失败&amp;quot;只能由一个地方判。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-七个月换了四次样子"&gt;&lt;span class="h-num"&gt;1.&lt;/span&gt; 七个月，换了四次样子&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;时间&lt;/th&gt;
 &lt;th&gt;形态&lt;/th&gt;
 &lt;th&gt;做了什么&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;3 月&lt;/td&gt;
 &lt;td&gt;C++/Qt 桌面原型&lt;/td&gt;
 &lt;td&gt;求职面试模拟：读简历 PDF，大模型出题，用火山引擎实时语音对话服务一问一答；最后用 cppcheck 和 ASan 查了一遍&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5 月上旬&lt;/td&gt;
 &lt;td&gt;C++ 命令行&lt;/td&gt;
 &lt;td&gt;改成 IELTS 口语的三个部分，评分可以接 Codex、OpenAI 接口或 Claude&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5 月中&lt;/td&gt;
 &lt;td&gt;单文件 Python 网站&lt;/td&gt;
 &lt;td&gt;网页录音、报告、钱包；做了评分校准和一次无人值守的长跑巡检&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5 月中到月底&lt;/td&gt;
 &lt;td&gt;Django&lt;/td&gt;
 &lt;td&gt;迁到 Django，旧服务退役；接 HTTP 流式追问、WASM 音频预处理、实时识别&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;6 到 9 月&lt;/td&gt;
 &lt;td&gt;补功能和收尾&lt;/td&gt;
 &lt;td&gt;语料库、Takeaway、拼写间隔复习、公网提速、新手引导、P3 题库进度、部署文档&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10 月&lt;/td&gt;
 &lt;td&gt;Qt 桌面壳&lt;/td&gt;
 &lt;td&gt;用 QtWebEngine 套网页；加了面试模式、AI 助手；新写 &lt;code&gt;native_voice&lt;/code&gt; 设备层；对旧 C++ 语音做了一次审计&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10 月底到 11 月初&lt;/td&gt;
 &lt;td&gt;实时语音进桌面壳&lt;/td&gt;
 &lt;td&gt;连接层改成一个 I/O 线程独占；新写与内容无关的 &lt;code&gt;VoiceSession&lt;/code&gt;；面试追问压力改成实时语音，其余练习用它出字幕&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;提交数按月是：3 月 13 个，5 月 406 个，6 月 143 个，7 到 9 月一共 25 个，10 月 156 个，11 月到 1 日为止 1 个。从 5 月起，大部分代码是我写规格、Codex 或 Claude Code 实现、我验收。&lt;/p&gt;</description></item></channel></rss>