工作记录

Todo

  • TTS 发音功能 【doing】

    继续设计:

    文案:

    • 显示句子发音按钮 [x]

    功能:开启后,在每个英语句子后面显示一个播放按钮,点击后显示加载模样,加载成功后,播放音频,同时按钮变为暂停模样;再次点击就暂停,再点击就播放。

    播放状态:

    idle => 显示播放 loading => 显示加载 playing => 显示暂停 暂停 => 显示播放

    开关状态:通过 cookie 序列化功能开启、关闭的状态

    TTS 能力:构建一个新的 TTS server, 使用 cached 非实时接口返回音频结果。

    • cache 构建:
      • 在 hugo 侧,基于 ts 完成英语句子抽取功能:
        • 输入:dist 接口
        • 输出:一个 {data: [{id: str, text: str, src_doc: list[str]}], project: dajuan} json 文件,annotated as $CACHED_TTS_TEXT
      • github action 里,在完成 hugo build 后,调用这个 ts,生成该文件
      • 然后 ssh 到 server,执行 cached-tts-gen --data $CACHED_TTS_TEXT --gen-model public
    • tts-server 接口
      • tts 生成接口:真正的 TTS 生成接口;给定 text, model, 生成音频【流式】 【这个接口先不做,直接做离线的脚本就行】
        • 支持模型:
          • local-dajuan: 本地的模型
    • 本地与云端同步: 【done】
      • hugo build 后,与云端一样,调用 ts 生成句子文件, 记为 local-list
      • 生成 TTS 文件并添加到云端(cached-tts-gen?)
        • 设置最佳的 tts-model 为 best-tts-model
        • 调用 cached-tts/list 获取云端的数据, 记为 remote-list
        • 对下面的句子做后续生成+添加处理:
          • 取 remote-list 与 本地的 local-list 交集,然后取 tts-model 不 等于 best-tts-model 的 句子
          • 取 local-list - remote-list (增量)
        • 生成+添加处理
          • 使用 best-tts-model, 对句子生成音频
          • 调用 cached-tts/add 添加内容,id_exist_action=override
        • 对下面的句子做删除操作:
          • 取 remote-list - local-list (减量)

Process

Edge tts 发音已经足够了,应该和 kokoros 差不多。所以,本地的 model,一定要在情绪上更好才行。 所以不要 kokoros 了,直接找一个更好的 model. 目前准备用 Index-tts. 倒是再调研下。

先把 cached-tts 流程跑通再说。

在多版本 tts-model 这里我有点搞不清楚,今儿我觉得这里有点问题:

不要那么复杂:

当前的需求:就 1 个版本的 TTS 结果即可。

问题所在:好的 TTS 服务不是实时在线的,所以导致新的文章出来后,可能没有音频

解决方法:

  • 但为了让所有文本都有音频,只能让差的音频在好的音频不存在时补位
  • 所以搞了个 light-weight tts provider,方便在 server 侧部署新文章后,马上去算好
  • 然后隔一段时间,去启动一下好的 TTS 服务,再去更新下新的文章的音频数据
  • 然而,如何处理这个好、差的数据,让服务端优先用好的、没有的情况下用差的?

目前想到的方法:

  1. 存储的时候,id 和 tts-model 无关,这样读取的时候,不管好的坏的,都直接打到这个有的数据上来
  2. 扩展性:未来如果要支持多个 model 同时存在, 就再把需要区分的参数加入到 id 计算中来。

=> DONE

关于 TS 抽取句子:

User:

在 hugo 的流程里,我实现这么一个功能:

从 html 元素中筛选出供 TTS 发音的句子。 目前这个句子可能考虑 2 个来源:

对 class name == bilingual-alternating, 从子元素中筛选中满足下面条件的 p: 其 text (含嵌套子元素)只包含英语字符,或者标点(至少包含 1 个英语字母)

对 class name == “pronounce” 的元素

分别从这两个来源,识别到该元素,并在此元素的末尾(也就是子节点的最后一个元素),添加一个 icon 用于显示发音按钮。

点击这个发音按钮,会从该元素中抽取出TTS 发音的句子,然后调用 后端的 /cached-tts/gen 来获取音频并播放声音

我想把这个功能用 ts 写,然后让 hugo 编译成 js, 在页面中的合适位置调用; 此外,这个 ts 还要被额外的一个离线 ts 引用,用于离线抽取出句子,预先生成 tts cache 可以做到吗?

=> 我们就只关注这 2 类元素即可!


生活记录

半夜睡不着,黄车车也醒了,我就窝在被窝里又看了 2 集犬夜叉。 如果正常点去看,戈薇挺不对的

  1. 自己没啥能力却那么莽
  2. 自己没啥能力却对犬夜叉指手画脚
  3. 自己到处跑,还得多少损伤
  4. 自己击碎了四魂之玉,导致各地异变,是罪魁祸首?

在这样的设置下,那些嘻嘻哈哈,甚至还会回去考试的逻辑,感觉一下子就失去了魅力。

还是低龄向的东西?但是又一想,是否背负太多,就只能一天天都阴沉呢?不太懂,但至少没能力别去作死啊,这点实在太硬伤了。

弃了。


情绪记录

Good

Bad


Reflect

一早又一顿买买买,把之前腾罗出来的资金又买光了。特别的,招商轮船和海熊又买了一部分回来,离谱的是比上次卖的钱还高。 择时就是这样啊,这个错误应该是非常常见的了。说明上周后面有点恐慌了,但是经过一个周末,觉得长远看还是有效的,所以今天观察了下盘面, 看起来还是比较强的,就买入了。

这么看,思路是也算不上错吧,算是走一步看一步,只是这样实际犯错的概率还是非常大的。情绪太容易反转了。看清远期目标才能够坚定。

晚上黄车车 8 点多就睡了,意外的容易。我大概 9 点半醒,又去刷手机了,看到了父母落户、城乡养老保险的等等事情,又睡不着了;后来好好进来, 又瞎扯了下。 主要是得先把户口转回来,这样黄车车好上幼儿园。

因为中途醒了又聊了这些,然后看了下犬夜叉,最后估计 3 点多才睡吧。