前言
最近看了几篇文章,总觉得自己没发挥树莓派的作用,于是就琢磨着,哎,灵光一闪,整一个早晨叫醒服务,于是便有了本篇水文。
功能
每天早上八点钟,定时播放音频(音频内容为当天天气预报和空气质量),播放完成之后继续等待到明天的八点钟播放。
效果如下
技术
开始本来是想加个客户端的,但是一想先先直接跑个服务就用的node试试,所以本文只需要你会用js就行
node(服务)
讯飞语音(转音频)
play(播放语言)
聚合api(天气预报接口)
scheduleJob(定时任务)
准备工作
我们需要文字识别转成音频,讯飞是可以白嫖的
讯飞语音
请先在讯飞注册账号及 > 创建应用 > 实名认证
https://passport.xfyun.cn/
然后去控制台找到服务接口认证信息
https://console.xfyun.cn/services/tts
找到需要的 key
聚合数据
天气预报api,如果有你其他的当然也可以用其他的,这个也是白嫖
就不做重点讲了
官网 https://www.juhe.cn/
天气预报 https://www.juhe.cn/docs/api/id/73
快速上手
初始化项目
npm init -y
然后安装我们需要的依赖, 下面是依赖的版本
{
"name": "node-jiaoxing",
"version": "1.0.0",
"description": "",
"main": "src/index.js",
"scripts": {
"dev": "node src/index.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"node-schedule": "^2.0.0",
"request": "^2.88.2",
"websocket": "^1.0.31"
}
}
安装依赖
npm insatll
创建lib文件夹
创建一个
lib
文件夹,放入别人封装好的讯飞
的资源,其主要作用就是将文本转为音频
index.js
const fs = require("fs");
const WebSocketClient = require('websocket').client;
const { getWssInfo, textToJson } = require('./util');
const xunfeiTTS = (auth, business, text, fileName, cb) => {
let audioData = [];
const client = new WebSocketClient();
client.on('connect', (con) => {
con.on('error', error => {
throw (error);
});
con.on('close', () => {
const buffer = Buffer.concat(audioData);
fs.writeFile(fileName, buffer, (err) => {
if (err) {
throw (err);
cb(err);
} else {
cb(null, 'OK');
}
});
})
con.on('message', (message) => {
if (message.type == 'utf8') {
const ret = JSON.parse(message.utf8Data);
audioData.push(Buffer.from(ret.data.audio, 'base64'));
if (ret.data.status == 2) {
con.close();
}
}
});
if (con.connected) {
const thejson = textToJson(auth, business, text);
con.sendUTF(thejson);
}
});
client.on('connectFailed', error => {
throw (error);
});
const info = getWssInfo(auth);
client.connect(info.url);
}
module.exports = xunfeiTTS;
util.js
function btoa(text) {
return Buffer.from(text, "utf8").toString("base64");
}
function getWssInfo(auth, path = "/v2/tts", host = "tts-api.xfyun.cn") {
const { app_skey, app_akey } = auth;
const date = new Date(Date.now()).toUTCString();
const request_line = `GET ${path} HTTP/1.1`;
const signature_origin = `host: ${host}\ndate: ${date}\n${request_line}`;
let crypto = require("crypto");
const signature = cry