我写了个诗词朗诵网站

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

网络异常,图片无法展示
|

诗词数据

诗词数据主要来自这个 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 引擎
  • 使用语音识别,增加用户朗诵对比功能
  • 优化动画效果


相关文章
|
2月前
|
前端开发
一张网页带你了解中秋节的前世今生
该文章通过制作一个介绍中秋节的网页,融合了中秋节的历史文化背景与现代网页设计技术,展示了如何使用HTML和CSS来创建既有教育意义又具视觉吸引力的在线内容。
一张网页带你了解中秋节的前世今生
|
4月前
|
搜索推荐
妙笔生词与网易天音:写歌词的优势对决
妙笔生词(veve522)与网易天音在歌词创作中各具优势。妙笔擅长专业韵律,个性化定制;网易天音倚靠技术与市场资源,创造流行趋势并勇于创新。两者满足不同创作风格与需求。
|
人工智能 Serverless 数据安全/隐私保护
笑疯了,AIGC 写的小说你绝对想不到!
笑疯了,AIGC 写的小说你绝对想不到!
|
数据采集 算法 搜索推荐
网站如何快速上谷歌收录?
答案是:谷歌蜘蛛池就是GPC爬虫池,可以快速收录网站页面。 了解谷歌的收录机制 在寻求快速上谷歌收录的方法之前,首先要了解谷歌是如何工作的。 谷歌使用了一系列的算法和工具来爬取和索引网站内容。 选择正确的关键字 选择与您网站内容相关的正确关键字是获取快速收录的第一步。 应确保这些关键字不仅反映了您的业务和产品,还要与潜在客户可能搜索的内容相匹配。
114 0
网站如何快速上谷歌收录?
|
人工智能 搜索推荐 iOS开发
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯(2)
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯
146 0
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯(2)
|
数据采集 Web App开发 XML
网页文本解析利器“美丽汤”
网页被抓取下来,通常就是str 字符串类型的对象,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法和切片操作:
|
人工智能 搜索推荐 区块链
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯(1)
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯
134 0
|
存储 前端开发 JavaScript
情人节,让百度首页帮你告白
转眼又是到了2月14日,今天不单单是情人节,我做了一个JS相册,并嵌入大屏了百度首页中,偷偷给对象装个油猴脚本,百度都会帮你告白。
381 0
情人节,让百度首页帮你告白
|
开发工具 图形学 Android开发
零基础Unity做一个中秋诗词鉴赏网页,祝您中秋快乐!
本文教你零基础Unity制作诗词鉴赏网页,祝您中秋节快乐
214 0
零基础Unity做一个中秋诗词鉴赏网页,祝您中秋快乐!