前言
在2018年下半年的某一天,偶然观看了《中国诗词大会》节目的飞花令环节。当时作为语音行业一员对此十分感兴趣,想着能不能用程序实现一个,思考技术方案的时候发现最大难度就是数据,遂求助 码农交友社区(https://github.com/),发现了开源库 chinese-poetry(https://github.com/chinese-poetry/chinese-poetry),然后结合免费的百度语音识别,整个项目就成了。

实现语音版飞花令仅作为兴趣爱好,之前本来是用 Django 完成的,在朋友的安利之下改用 Sanic 重写。实现的过程中都是站在程序猿的角度看待整个程序,同时程序运行的服务器性能不算好、语音匹配算法实现得很粗糙等等,所以整个程序仅仅处于可用的状态,离体验好还差18条街吧。

但作为一个完整的应用,整个功能涉及到了Web后端常用的技术,供有一定Web基础的同学参考,特别是对于写过基本的Web后端程序然后想尝试异步编程的同学,本应用的技术栈为:
后端框架:Sanic + aioredis + aiomysql + aiohttp
数据库: mysql + redis
部署: nginx + docker + gunicorn
前端: 微信小程序
本文会简单地讲一下应用架构。

飞花令
整体架构如图所示

架构如上图所示,接下来分享部分技术细节。

Sanic

后端框架采用了 Sanic (https://github.com/huge-success/sanic),这是一个异步非阻塞网络框架,可以看做异步版本的 flask,sanic 比起 Django 轻量很多,简单几行就可以搭起一个接口

‘’’


from sanic import Sanic
from sanic.response import json
app = Sanic()
@app.route('/')
async def test(request):return json({'hello': 'world'})
if __name__ == '__main__':app.run(host='0.0.0.0', port=8000)结合 Python3.7 的 Asyncio (https://docs.python.org/3/library/asyncio.html) 模块,可以放弃多线程方案而使用性能更好的协程方案,比如同时请求多个网页:import aiohttp
import asyncio
async def get_url(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:print(response.status)
async def main():await asyncio.gather(get_url("http://www.baidu.com"),get_url("http://www.jd.com"),get_url("http://www.taobao.com"))if __name__ == "__main__":asyncio.run(main())如果你依然在编程的世界里迷茫,
不知道自己的未来规划,
对python感兴趣,
这里推荐一下我的学习交流圈QQ群:895 797 751,
里面都是学习python的,

总的来说,在写异步代码的过程中还是非常开心的,有兴趣的同学可以了解一下。

百度语音识别

实现飞花令的核心之一,语音合成和识别都是用的百度(http://ai.baidu.com/tech/speech)家的技术,无他,仅仅是因为这是免费接口。
百度提供了基于 requests 做的 python-sdk (https://github.com/Baidu-AIP/python-sdk),我这边为了适配异步框架重写了语音识别和语音合成部分的代码,将 requests 更换为了 aiohttp (https://github.com/aio-libs/aiohttp),简单的修改代码见 aiohttp-aip (https://github.com/Provinm/flyingflower_public/tree/master/flyingflower/aip)
修改后的代码可满足当前项目的需求。

中文繁体转换为简体

飞花令的数据全部来自于 chinese-poetry(https://github.com/chinese-poetry/chinese-poetry),但在使用过程中发现诗词是繁体版本,而百度语音给出的结果是中文简体,为了达到匹配的目的,需要将繁体转换为简体。
github 了一下,发现并没有人做这个事情,所以就自己动手写了一个脚本,实现了中文繁转简。为了造福大众,转换好的简体放在 chinese-poetry-simplified(https://github.com/Provinm/chinese-poetry-simplified),项目中包含已经转换好的中文版本的诗词文件,以及转换过程用到的脚本,有需要的同学可以自己修改生成所需的版本。

使用Python+小程序实现诗词大会的飞花令相关推荐

  1. 用Python+小程序实现诗词大会的飞花令 !

    写在前面 在2018年下半年的某一天,偶然观看了<中国诗词大会>节目的飞花令环节.当时作为语音行业一员对此十分感兴趣,想着能不能用程序实现一个,思考技术方案的时候发现最大难度就是数据,遂求 ...

  2. 有趣python小程序系列之一

    文章目录 前言 一.飘落的银杏 二.代码部分 1.导入所需的库 2.生成斐波那契数列 3.定义生成叶子的方法 4.定义生成树的方法 5.主函数部分 三.结果展示 前言 关于学python的初衷,如图, ...

  3. python恶搞小程序-有趣的python小程序

    有趣的python小程序 1.密码生成器x=int(input()) print(''.join(__import__('random').choice('QWERTYUIOPASDFGHJKLZXC ...

  4. python日历小程序_一个查看网络设备信息Python小程序

    原标题:一个查看网络设备信息Python小程序 网络编程中,最常见的一个问题就是,获取设备信息. 首先我们,要学习如何获取本机的网络信息.我们将用到标准库中的socket库.假如说,我们要查看本机的 ...

  5. 几个python小程序

    python小程序 1-100求和 1 def Sum(x, y): 2 return x+y 3 print reduce(lambda x,y:x+y,range(1,101)) 4 5 i = ...

  6. 人工智能python小程序_Python:一个可以套路别人的python小程序

    一个可以套路别人的python小程序~ 先简要介绍一下程序. 程序是使用pycharm工具,python语言所写.程序包括客户端 client.py 和服务器端 server.py 两部分,利用了py ...

  7. python如何运行一个python程序_python如何运行?第一个python小程序示范

    我们想要用python编程首先要做的就是安装一些工具,随后学会应用.那么问题来了,我们需要安装什么?python又是怎样运行的呢? 安装什么工具? 1.Python 3.6.5(我安装的,还有很多版本 ...

  8. 有趣的python小程序

    有趣的python小程序 1.密码生成器 x=int(input()) print(''.join(__import__('random').choice('QWERTYUIOPASDFGHJKLZX ...

  9. python有趣小程序代码-一个可以套路别人的python小程序实例代码

    先简要介绍一下程序. 程序是使用pycharm工具,python语言所写.程序包括客户端 client.py 和服务器端 server.py 两部分,利用了python中的socket包. 咳咳,使用 ...

最新文章

  1. RESTful视图之Request 与 Response
  2. HTTP 协议详解--转
  3. LA3602DNA序列
  4. ASP.NET中AJAX的UpdatePannel控件的用法
  5. ccf a类期刊_喜报:我院2篇学生论文被CCFA类会议AAAI(2020)接收
  6. php yii框架源码,yii 源码解读
  7. 【Python CheckiO 题解】First Word (simplified)
  8. PaperNotes(4)-高质量图像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan
  9. Remix Solidity IDE 快速入门
  10. PostgreSQL中如何实现密码复杂度检查?
  11. Java NIO AIO编程
  12. 关于 Apache 2.4 配置PHP时的错误记录
  13. vsftpd配置权限问题
  14. Vue+element ui+springboot实现用户头像修改
  15. 『Scrapy』爬取斗鱼主播头像
  16. Android陀螺仪传感器
  17. 圆形谷仓Circular Barn_Silver---(DP优化 / )队列 + 贪心(复杂度O(2n))---DD(XYX)​​​​​​​的博客
  18. 微信没有回车键怎么换行_怎么换行-回答 | 为什么苹果的微信没有换行键,想换行怎么办?...
  19. ThinkPHP5客户关系管理系统(CRM)
  20. 加入企业黄页有什么好处?

热门文章

  1. 27-fork 函数与分身术
  2. 少儿学习编程有什么好处
  3. 设计模式 | 外观模式
  4. CODESYS斜坡函数功能块(ST源代码)
  5. 读《人工智能的未来》
  6. Java数据压缩算法——哈夫曼树
  7. 了解模型预测控制5--如何加速运行MPC
  8. Matlab画图——txt文件数据处理(数据对比)
  9. 状态迁移法——测试权限审批功能
  10. NEC的云计算软件战略