首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
宝塔
V2EX  ›  分享创造

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

  •  
  •   cr4fun · 63 天前 · 2589 次点击
    这是一个创建于 63 天前的主题,其中的信息可能已经有所发展或是发生改变。

    随机唐诗按钮

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

    需要准备的

    所需材料:

    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
        1
    lo1100   63 天前
    厉害了,软硬都行~老实说,幼儿的市场真的很大很大~~
        2
    xiri   63 天前 via Android
    看到最后一句话给我逗笑了
        3
    xiaotuzi   63 天前 via iPhone
    楼主开辟新思路,但是硬件做这个跟软件有什么优势吗?
        4
    baobao1270   63 天前 via Android
    说起诗,我想起了苟…
        5
    silencefent   62 天前
    曾经接了医院的设备项目,当时那个主任问我做不做叫号机,原来是这么回事
        6
    as94boy   62 天前
    最后一句,破声音我就想到了:你叫破喉咙都没用。。
        7
    iceEar   62 天前
    @baobao1270 #4 苟能制侵陵,岂在多杀伤
        8
    hl0220   62 天前
    好 我不体验
        9
    cr4fun   61 天前
    @xiaotuzi 唯一的优势是,如果把唐诗数据库写在 SD 卡里,就可以完全离线使用,包括语音。缺点显而易见,破逼声音没法听。当然可以使用纯软件的,随便用个语音合成 sdk,效果都很好,尤其是花点钱儿买真人发声的。
        10
    hkyyx   61 天前
    我接受楼主的建议,不去体验
        11
    xiaotuzi   61 天前 via iPhone
    @cr4fun 哈哈,还不如加个联网功能…
        12
    sychty   57 天前
    眼前一亮的感觉
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4270 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 29ms · UTC 02:52 · PVG 10:52 · LAX 18:52 · JFK 21:52
    ♥ Do have faith in what you're doing.