按一下,就读一首唐诗(你千万别体验) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
cr4fun
V2EX    分享创造

按一下,就读一首唐诗(你千万别体验)

  •  
  •   cr4fun 2019-09-19 18:11:16 +08:00 4332 次点击
    这是一个创建于 2220 天前的主题,其中的信息可能已经有所发展或是发生改变。

    随机唐诗按钮

    按一下,就能随机读一首唐诗。

    需要准备的

    所需材料:

    1. ESP8266

    2. TTS 串口文字转语音模块

    3. 扬声器

    4. 按钮

    所需工具:

    1. 电烙铁
    2. windows 10 PC 电脑

    所需软件:

    1. arduino
    2. python3

    引用他人代码

    本项目使用了如下项目及代码:

    1. 唐诗数据库

      https://github.com/chinese-poetry/chinese-poetry/tree/master/json

    2. json 到 sqlite 转换工具

      https://github.com/animalize/QuanTangshi/blob/master/tools/ok_make_db.py

      这是一个安卓项目,作者提供了一个转换工具。我在其基础上增加了繁体转简体。以及删掉了标题、内容中包含括号、书名号等字符的诗。

    3. 繁体转简体

      https://github.com/skydark/nstools/tree/master/zhtools

    4. flask 框架

      https://palletsprojects.com/p/flask/

      API 部分使用 flask 框架。

    5. arduino 的 esp8266 支持库

      在 arduino 的首选项中,增加如下内容:

      https://arduino.esp8266.com/stable/package_esp8266com_index.json 

      打开开发板管理器,搜索 esp8266 并安装。

    6. wifimanager

      能让 arduino 方便配网的库。可自定义热点名称。连接后输入 192.168.4.1 进行配网,从而让 esp8266 可以联网。

      打开库管理器,搜索 wifimanager tzapu,按照下图所示,点击安装。

    项目实施

    克隆本项目,进入 api/json2sqlite 目录,执行 python3 get.py 把 json 数据库转为 sqlite。

    然后到 api 目录,执行 python3 web.py 开启服务。

    git clone https://github.com/my-products/tangshi.git cd tangshi cd api cd json2sqlite python3 get.py cd .. python3 web.py 

    访问 http://localhost:5000/json 可以随机获得一首唐诗( json 格式)

    为了方便语音合成,还可以访问 http://localhost:5000/text/utf8 随机获得一首唐诗(纯文本格式)。

    使用 arduino 打开目录 arduino\tangshi,tangshi.ino 是源代码。打开后直接使用 arduino 烧录即可。

    如果你懒得打开那个文件,这里直接粘贴出源码:

     #include <ESP8266WiFi.h> #include <DNSServer.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> #include <ESP8266HTTPClient.h> WiFiManager wifiManager; HTTPClient http; const unsigned long HTTP_TIMEOUT = 5000; int buttOnState= 0; String response; int button_pin = D4;//触发按钮 char const *ap_name = "TangshiAP";//ap name boolean debug_mode = false;//debug? String debug_wifi_name = "chinaunion"; String debug_wifi_pass = "chinaunion"; //由于 tts 语音模块需要 ansi 编码。故,每次串口输出都需经过转码。可用 python3 的.encode("gbk")来实现 void setup() { // Serial.swap();//调用映射方法 GPIO1(TX),GPIO3(RX) 不调用,同样可用,因为是 TX0/RX0。调用后,arduino 监控台无输出。 pinMode(button_pin, INPUT_PULLUP); if (debug_mode) { WiFi.mode(WIFI_STA); WiFi.begin(debug_wifi_name, debug_wifi_pass); WiFi.setAutoConnect(true); } else { wifiManager.autoConnect(ap_name); } while (WiFi.status() != WL_CONNECTED) { delay(1000); } Serial.begin(9600); Serial.println("\xcd\xf8\xc2\xe7\xc1\xac\xbd\xd3\xb3\xc9\xb9\xa6");//网络连接成功 http.begin("http://106.12.133.66:5000/text/gbk"); http.setTimeout(HTTP_TIMEOUT); http.setUserAgent("esp8266");//用户代理版本 // http.setAuthorization("esp8266","123456");//用户校验信息 } void loop() { buttOnState= digitalRead(button_pin); if (buttOnState== LOW) { Serial.printf("\xd5\xfd\xd4\xda\xc7\xeb\xc7\xf3 API");//正在请求 API int httpCode = http.GET(); Serial.println( httpCode); if ( httpCode == HTTP_CODE_OK) { respOnse= http.getString(); Serial.println(response);//输出内容 } else { Serial.printf("API \xc1\xac\xbd\xd3\xca\xa7\xb0\xdc");//API 连接失败 } http.end(); delay(5000); } } 

    tangshi.ino.nodemcu.bin 是生成的二进制。如果你想直接用,可以使用 esp8266 的烧录工具直接烧录。烧录地址,0x00。烧录工具:乐鑫官方地址下载 https://www.espressif.com/sites/default/files/tools/flash_download_tools_v3.6.7.zip

    直接使用乐鑫烧录时,需要注意的是,在需要做配置的地方,参考 arduino 的参数即可:

    该固件中,API 调用的 http://106.12.133.66:5000/text/gbk 是我临时的服务器地址,没准儿什么时候会停止,所以建议大家还是使用自己的 API。

    然而,utf8 格式的文本,tts 语音合成模块竟然不认。去卖家店铺看了一下详细说明,发现这个模块支持的是 ansi 编码。

    解决的方法有两种,可以在 arduino 上面让 tts 模块读出汉字。

    方法 1

    ino 源文件以 ansi 编码保存。

    这种方法不好。arduino 再编辑,又是 utf8 格式的。除非你每次烧录前用记事本保存为 ansi 格式,使用 arduino 别点击保存,直接烧录。

    方法 2

    输出 ansi 编码给串口。 使用 python3,在控制台可以通过.encode("ansi")进行转换。但是,linux 下似乎无效,提示找不到这个 ansi 编码。在 linux 下,可以使用.encode("gbk")来获得 ansi 字符。

    所以,API 也提供了 ansi 和 gbk 两种方式调用。 如访问 http://localhost:5000/text/gbk 随机获得一首唐诗( gbk 格式)。

    流程

    按钮会触发一个低电平,ESP8266 得到这个触发事件,去调用 API 获得一首随机唐诗,直接给转到串口,这时 TTS 就工作了。

    硬件连接

    ESP8266 的针脚如图所示:

    TTS_B719 的背面很清晰,按照标识连接即可。黄色框选处连接 TTS_B719 的电源,红色框选处连接 TTS_B719 的串口。蓝色框选处连接按钮。

    需要注意的是:

    1. ESP8266 的 TX 要连接 TTS_B719 的 RX。ESP8266 的 RX 要连接 TTS_B719 的 TX。

    2. 按钮是低电平触发,按钮焊接 D4 和 ESP8266 上随便找个 GND 即可。

    演示

    https://github.com/my-products/tangshi/raw/master/readme-images/demo.mp4

    最后,千万别用这玩意儿,破声音,听着头疼。

    12 条回复    2019-09-25 14:26:10 +08:00
    lo1100
        1
    lo1100  
       2019-09-19 19:20:09 +08:00
    厉害了,软硬都行~老实说,幼儿的市场真的很大很大~~
    xiri
        2
    xiri  
       2019-09-19 19:27:46 +08:00 via Android
    看到最后一句话给我逗笑了
    xiaotuzi
        3
    xiaotuzi  
       2019-09-20 06:35:08 +08:00 via iPhone
    楼主开辟新思路,但是硬件做这个跟软件有什么优势吗?
    baobao1270
        4
    baobao1270  
       2019-09-20 06:48:13 +08:00 via Android
    说起诗,我想起了苟…
    silencefent
        5
    silencefent  
       2019-09-20 15:19:48 +08:00
    曾经接了医院的设备项目,当时那个主任问我做不做叫号机,原来是这么回事
    as94boy
        6
    as94boy  
       2019-09-20 17:19:47 +08:00
    最后一句,破声音我就想到了:你叫破喉咙都没用。。
    iceEar
        7
    iceEar  
       2019-09-20 18:45:47 +08:00   1
    @baobao1270 #4 苟能制侵陵,岂在多杀伤
    hl0220
        8
    hl0220  
       2019-09-20 19:14:27 +08:00
    好 我不体验
    cr4fun
        9
    cr4fun  
    OP
       2019-09-21 15:01:08 +08:00
    @xiaotuzi 唯一的优势是,如果把唐诗数据库写在 SD 卡里,就可以完全离线使用,包括语音。缺点显而易见,破逼声音没法听。当然可以使用纯软件的,随便用个语音合成 sdk,效果都很好,尤其是花点钱儿买真人发声的。
    hkyyx
        10
    hkyyx  
       2019-09-21 17:18:48 +08:00
    我接受楼主的建议,不去体验
    xiaotuzi
        11
    xiaotuzi  
       2019-09-21 18:57:24 +08:00 via iPhone
    @cr4fun 哈哈,还不如加个联网功能…
    sychty
        12
    sychty  
       2019-09-25 14:26:10 +08:00
    眼前一亮的感觉
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2821 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 08:47 PVG 16:47 LAX 01:47 JFK 04:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86