cover
2022年8月21日 - 2023年7月31日

为了在掘金水篇文,我写了个诗词朗诵网站 🤦‍♂️

最近参加掘金的更文挑战,着实被榨干 🤦‍♂️,日更实在是太可怕了。为了今天的日更,不得不花了大几十分钟写了个诗词朗诵的网站。前排先放链接:poetry-reader

先放个动图吧:

picture 1

emm,不过动图没声音,想要体验的还是去上面的网站去看下吧。

下面介绍下站点用到的一些东西。

诗词数据

诗词数据主要来自这个 chinese-poetry 库,其中包含了几十万首唐诗宋词,然而里面主要是静态数据,要直接用在站点要么得搞个服务端、要么得直接把数据都扒下来,然后无意间在该库的网站中找到了关于今日诗词 API 的鸣谢。然后果断使用了今日诗词API

直接通过 npm install 安装

npm -i jinrishici --save

然后引入即可:

import { load, Res } from 'jinrishici';
load(result => {
    poetry.value = result;
});

至于官网的示例代码:

const jinrishici = require('jinrishici');
jinrishici.load(result => {
    console.log(result);
});

由于使用 vite3 改成了 import,由于今日诗词 API 没有提供 ts 描述,所以自己补充了下描述文件。

declare module 'jinrishici' {
    interface Res {
        status: 'success' | 'error';
        data: {
            id: string;
            content: string;
            popularity: number;
            origin: {
                title: string;
                dynasty: string;
                author: string;
                content: string[];
            };
            matchTags: string[];
            recommendedReason: string;
        };
        token: string;
        ipAddress: string;
        warning: null;
    }

    interface LoadHandler {
        (poetry: Res): void;
    }
    interface Load {
        (handler: LoadHandler): void;
    }
    export const load: Load;
    export { Res };
}

朗读

朗读直接使用 Web Speech API,将诗词通过 speechSynthesis 进行播放,也遇到一些问题:

无法主动播放音频

就是无法通过脚本主动调用播放的 API,比如进入页面后直接播放当前诗歌,会直接报错 not-allowed,了解了下大概还是被滥用,导致和弹窗一样被浏览器限制了,必须由用户行为触发才能正常播放。

所以无奈的将进入页面自动播放取消了,改成了点击按钮才能播放。

部分浏览器无法播放

调用 speechSynthesis.speak() 时,Safari 无效果,并且在 Safari 下,getVoices 列表是空的,在 stackoverflow 找到了对应的提问但是却没回答。

由于事件原因没多研究,只能随手加了个报错处理解决了一下。

动画

为了避免页面太单调,使用了 Web Animations API 快速随手写了个渐入动画。之前一篇文有介绍该系列 API孤陋寡闻了,才知道已经可以用 JS 来控制 CSS 动画了

由于 Web Animations API 可以方便的插入动画,并在动画完成后做处理,写起来非常简单:

const doAnimate = async (target: keyof typeof selector, index: number = 0) => {
    const dom = document.querySelectorAll(selector[target]);
    const animate = dom[index]?.animate(keyframes, animateOptions);
    await animate.finished;
    (dom[index] as HTMLElement).style.opacity = '1';
};

开发

开发使用 vite+ts+vue3 进行,直接 pnpm create vite 快速创建项目,vite 虽说现在 bug 还是不少,不过做一些小玩具项目体验还是不错。

部署

最后部署则是直接使用 GitHub pages 进行,通过 GitHub actions 在推送后自动构建并部署到 GitHub pages 中。然后自定义域名挂在 cloudflare 上,可以通过 cloudflare 加速访问。

开源

源码托管在 GitHub 中,有兴趣的同学可以点进去查看:poetry-reader

缺憾

Chrome 中使用的好像是 google 的语音助手(Google 普通话(中国大陆)),朗诵效果着实不理想。

后续

本项目完全是一时兴起,后续可能做的更新:

  • 根据诗歌内容,加载对应的背景图
  • 试试接入其它 speech 引擎
  • 使用语音识别,增加用户朗诵对比功能
  • 优化动画效果

鉴于本人拖延症晚期,上述一切预期可以当作没看到。手动狗头 🐶,有兴趣的可以提 PR