我写了个诗词朗诵网站

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


相关文章
|
8天前
|
缓存 搜索推荐 前端开发
百度 SEO:不是玄学,是科学与艺术的 “恋爱”
本文介绍了百度SEO的基本原则和方法,涵盖关键词优化、内容优化、网站结构优化、链接建设和用户体验优化五个方面。通过科学的方法和艺术的技巧,帮助网站提升在百度搜索引擎中的排名,吸引更多流量。
61 30
|
人工智能 搜索推荐 iOS开发
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯(2)
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯
155 0
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯(2)
|
人工智能 搜索推荐 区块链
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯(1)
ChatGPT还在2G冲浪?新模型「youChat」:我已能够解说2022世界杯
154 0
|
算法 程序员 Python
端午抗疫宣传公益小游戏-用Python为粽子宝宝戴口罩
由于新冠疫情影响,为避免户外威胁,我选择了居家以程序员的方式纪念这个端午。 虽然气温较高,疫情也得到了有效的控制,但为了他人和自身的身体健康,仍然需要在人流密集的公共场所佩戴好口罩😷。 由此,我以**为粽子宝宝戴口罩**😷为主题,花费4个小时(构思,素材收集,编码, 记录),制作了一个公益小游戏。科普防疫戴口罩。纪念这个端午!
199 0
端午抗疫宣传公益小游戏-用Python为粽子宝宝戴口罩
1、乐趣国学——“君子不器
1、乐趣国学——“君子不器
133 0
|
传感器 5G iOS开发
当潮牌遇见科技,扒一扒那些有创意的智能衣服|盘点
目前我们还没有看到智能衣服融入日常生活,但是一些潮牌在以一些独特的方式,将潮流与科技结合。 不管这种衣服会追踪你的足迹还是给你手机充电,它都会显示出潮流是如何朝着科技发展的方向前进的。
175 0
当潮牌遇见科技,扒一扒那些有创意的智能衣服|盘点
|
人工智能 安全
6岁微软小冰“出嫁”,会写诗、唱歌、聊天的“智能少女”终于长大了!
在刚刚结束的2020人工智能大会上,全球首支人工智能合唱MV《智联家园》高调亮相。更令人惊讶的是,就连这首歌的曲子,也是人工智能微软小冰完成。
300 0
6岁微软小冰“出嫁”,会写诗、唱歌、聊天的“智能少女”终于长大了!
|
程序员
支付宝这些程序员要逆天,滑板、画漫画、写科幻小说、航拍,玩得太溜
他们是四位来自蚂蚁金服的普通程序员,代码有千万种可能,人生有万千种姿态,看起来高冷的 IT 男,背地里也可能是热血青年!
4690 0
支付宝这些程序员要逆天,滑板、画漫画、写科幻小说、航拍,玩得太溜
|
人工智能 自然语言处理
翻译们,颤抖吧!三年内你很可能被AI砸了饭碗!
世界最大的翻译公司的CEO近日发出警告,由于神经机器翻译技术的近年来突飞猛进,在可以预见的未来一至三年内,全球约有50万翻译人员的工作会被机器取代而陷入失业,多达21000家翻译机构将被机器翻译挤垮。大多数手工翻译将不可避免走上打字机和柯达胶卷的老路。
1557 0
下一篇
DataWorks