一次绕口令引发的“血案"

618 阅读2分钟
原文链接: mp.weixin.qq.com

春节在家一直闲着,今天有人给我发了一个小程序,即包你说。小程序是一个绕口令,很显然对于我这种 "n l" 不分的人说,这种绕口令也太难说了。因此我就想通过 python 脚本来实现。

整个流程比较简单,主要是通过 adb 截取手机屏幕,获取口令的区域,然后通过百度的 OCR API 去识别口令获取文字,然后通过百度语音 API 去合成语音,通过 adb 模拟点击屏幕长按事件,最后通过电脑的 windows media player 播放 mp3 文件就可以了。

adb

adb 可以通过开发者选项进行收集的控制。可以通过安卓手机或模拟器操作步骤里面的介绍安装 adb。在这个脚本里面,我们主要会用到两个命令:

  1. // 截图

  2. adb shell screencap -p

  3. // 模拟长按屏幕 500 1000 为坐标位置,2000为长按持续时间

  4. adb shell input swipe 500 1000 500 1000 2000

百度 API

百度现在的确提供了很多 API,包括语音识别,语音合成以及 OCR 识别。可以在 http://yuyin.baidu.com/app 里面申请 API,通过创建应用并且申请 API 获取 APPID, APPKEY, SECRET_KEY。通过使用百度的 python sdk 就可以轻易实现:

  1. # 离线合成语音

  2.    client = AipSpeech(str(config_baidu['app_id']), config_baidu['api_key'], config_baidu['secret_key'])

  3.    result = client.synthesis(text, 'zh', 1, {

  4.        'vol': 5,

  5.    })

  6.    # 识别正确返回语音二进制 错误则返回dict 参照下面错误码

  7.    if not isinstance(result, dict):

  8.        with open('audio.mp3', 'wb') as f:

  9.            f.write(result)

  10.        f.close()

  11. # ocr 识别

  12.    client = AipOcr(str(config_baidu['app_id']), config_baidu['api_key'], config_baidu['secret_key'])

  13.    img_byte_arr = io.BytesIO()

  14.    img.save(img_byte_arr, format='PNG')

  15.    image_data = img_byte_arr.getvalue()

  16.    response = client.basicGeneral(image_data)

  17.    words_result = response['words_result']

  18.    texts = ''

  19.    for x in words_result:

  20.        texts += x['words']

  21.    return texts

运行

本次脚本其实并没有特别的难度,主要就是其中几个流程搞清楚,主要是有几点可以注意一下。第一点就是截图区域的获得,比如口令的截图区域以及按钮的位置。另外,为了方便直接调用电脑的 windows media player 播放音频文件,因此注意修改程序的路径以及音频文件的绝对路径。按照阅读链接中的 config-template 配置百度 API,设置成 config.yaml,这样为了是避免泄露百度 API 密钥的泄露。

结语

花了一下午的时间写了这个脚本,其实脚本的难度并不大。python 语言作为一种脚本语言,的确在处理某些的确非常方便。怪不得,人生苦短,我用 python。通过这个脚本可以避免我拙劣的绕口令,可以通过阅读原文获取脚本的完整代码。

以上。

欢迎搜索微信号 mad_coder 或者扫描二维码关注公众号: