周末了,用 Python 代码给大家带来一个好玩的视频特效:Python 版 AR 对话框https://www.zhihu.com/video/1110617264784699392

摄像头拍摄的视频中,右上角出现了一个可以跟随脑袋移动的虚拟对话框,可以实时展示说话内容。

你可能会问:就只是做了个摄像头特效,这也算 AR,还 AR 对话框?哈哈,请看AR定义:增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D 模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。

所以这么说来,我们做的摄像头特效,实时地进行了语音识别、面部识别定位,再通过图像处理为视频添加对话框效果,妥妥算是 AR 对话框了!

Talk is cheap, 接下来说设计思路和代码。

设计思路

我在之前分享过调用语音识别的文章,也尝试过调用面部识别来为摄像头视频增加特效,这是两个基础。此次通过将文字写入图片,将以上二者结合,生成最终效果。

我们仍然通过百度语音 API 来进行语音识别,把语音信息转化成文字。同时调用摄像头实时拍摄,对抓拍到的图片进行面部识别定位,在理想位置添加对话框特效。此外,随着语音文字信息的生成,动态地将文字添加到图片中,最终实现视频中的 AR 对话框。

语音识别

语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的技术,微信中将语音消息转文字,以及 “Hi Siri” 启用 Siri 时对其进行发号施令,都是语音识别的现实应用。

语音识别 API (其实就是帮你语音转文字的)

百度语音识别通过 REST API 的方式给开发者提供一个通用的 HTTP 接口。任意操作系统、任意编程语言,只要可以对百度语音服务器发起 http 请求,均可使用此接口来实现语音识别。调用 API 的流程在百度语音官方文档中有说明。

语音识别步骤 (其实就是你得按人家的规矩来走流程)先注册百度云的账号,控制台中创建百度语音的应用,获取 API Key 和 Secret Key

通过 API Key 和 Secret Key 获取 token

将 token 和本地音频数据上传到 API 链接

根据 API 返回结果获取解析后的文字结果

注意上述过程中我们使用的是本地音频数据,那么如何将自己的语音转为相应的数据呢?只要调用麦克风记录我们的语音信息存为 wav 格式的文件即可;而实时语音识别,即一直保持检测麦克风,只要有声音就生成 wav 文件向 API 发送请求;当识别不到语音信息时,自动停止。代码中我参考了调用谷歌语音的 speech_recognition 模块,因为它调用麦克风的命令特别简单,而且会根据检测麦克风来自动结束录音。

import speech_recognition as sr

r = sr.Recognizer()

#启用麦克风

mic = sr.Microphone()

with mic as source:

#降噪

r.adjust_for_ambient_noise(source)

audio = r.listen(source)

视频特效

我们都知道摄像头视频是通过摄像头捕获每时每刻的图片,将图片连续展示生成视频效果。视频特效同理,本质上是对一帧帧图片进行图像处理添加特效。

通过 OpenCv 模块启用电脑摄像头,将拍到的图片利用 dlib 模块进行面部识别,定位头部右上方区域,通过 PIL 模块将对话框贴图并在对应区域写入文字,最终将生成图实时展示,形成最终效果。

OpenCv (其实就是用来调摄像头的)

OpenCv 是一个很神奇的计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。计算机视觉是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。

要注意的是下载时是 opencv-python, 代码中导入时是 import cv2, 之后通过 cv2 中的函数即可调用摄像头拍摄,获取拍到的图片进行操作。最终生成效果图后,再将效果图实时展现,形成摄像头视频画面。

import cv2

#opencv启用摄像头

cap = cv2.VideoCapture(0)

#退出摄像头、关闭窗口

cap.release()

cv2.destroyAllWindows()

dlib (其实就是定位视频中人脸位置的)

dlib 是一个包含机器学习算法的开源工具包。目前 dlib 已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。

拿到拍摄的图片后,我们要定位脸部坐标来确定对话框添加位置。Python 可以直接调用 dlib 库进行面部模式识别,根据特征点位获取位置坐标:

获取16号点位置坐标定位脸部右侧,获取其右上方坐标位置用来放置聊天框及文本信息。

import dlib

#dlib面部识别模块相关

detector = dlib.get_frontal_face_detector()

predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

#获取面部模式

landmarks = predictor(gray,face)

x1, y1 = landmarks.part(16).x, landmarks.part(16).y

PIL (其实就是用来贴对话框和文字的)

PIL (Python Image Library) 是 Python 的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是 python 官方图像处理库了。

我们利用 PIIL 模块中 Image,ImageDraw 和 ImageFont 的相关函数,实现贴图、文本字体的选择以及将文字写入图片中。

from PIL import Image, ImageDraw, ImageFont

chatBox= Image.open(chatpng)

resized1 = chatBox.resize((300, 200))

im.paste(resized1, (int(x1), int(y1-200)), resized1)

im.save(result)

draw = ImageDraw.Draw(im)

font = ImageFont.truetype('simhei.ttf', 20)

draw.text((int(x1+50), int(y1-150)),talk,fill="rgb(255,255,255)",font=font)

多线程

以上便是代码运行时要同时执行的两项任务,正好可以拿来练习多线程的使用:

import threading

threads = []

t1 = threading.Thread(target=chatbox, args=())

threads.append(t1)

t2 = threading.Thread(target=yuyin, args=())

threads.append(t2)

if __name__ == "__main__":

for i in threads:

i.start()

for i in threads:

i.join()

最终效果

最终效果如上图所示,电脑摄像头拍到的视频中会动态出现一个对话框,它随着我脑袋位置的变化而移动。当我说完一段话后,语音识别到的文字信息会被加载到对话框中。

因为要调用麦克风检测声音形成一段语音,再将语音信息通过百度语音 API 来完成识别,在视频中我们看到很明显的延迟。此外我使用的是最基础的免费语音识别 API,速度和准确度也不能保证,例如我最后一句“展示完毕”因为没标准发音被识别成了“感受完毕”。

后续联想

这次的代码可以看作一个思路的展示 (Demo),即语音识别和图像处理、视频特效的结合。

最近恰好注意到朋友那儿收到的反馈信息:

现在网络上有很多视频、音频课程,因为工作量或者时间关系,可能并不配备字幕或者文字稿。那么我们此次展示的视频特效,将语音识别速度和准确度提升一下,没准可以在这方面有所应用。

此外在直播 APP、网站中,除了画面特效,动态地识别主播语音并展示到直播字幕内容中,貌似也是个挺不错的点子。

代码下载

代码下载链接 ,提取码:aq9x

下载到的文件中, chat.png 是特效中展示的对话框图片,SimHei.ttf 是写入图片中文字的字体文件,shape 开头的 dat 文件是用来面部识别的文件。

运行代码时,只有检测到面部信息才会出现对话框。当检测到语音信息时,文件夹中会生成 wav 音频文件。按 Esc 键退出摄像头视频时,文件夹中会生成截图。

后记

这份代码的创作还挺神奇的,之前我就分别写过语音识别和视频特效的代码但并未联系起来。正好最近加了个学习 Python 的星球,其中有个用 Python 描述五一假期的题目:

作业截止日期是5月10号20:00,我在9号晚上看到有位球友的写法是将文字写入图片来展示,觉得特别有新意。再一联想之前自己尝试的视频特效,完全可以把文字贴到摄像头视频中。如果再加个对话框?这文字可不可以语音识别自动生成?一连串的问题和琢磨,终于赶在截止时间完成了这份代码。

出乎意料地得到了星主肯定,美滋滋哈哈。

python对话框大小_Python 版 AR 对话框相关推荐

  1. python 子图大小_Python | 图的大小

    python 子图大小 In some cases, the automatic figure size generated by the matplotlib.pyplot is not visua ...

  2. python 对话框开发_python文件选择对话框的操作方法

    python文件选择对话框的操作方法 发布时间:2020-09-28 23:14:29 来源:脚本之家 阅读:76 作者:Bit_We 对于python的tkinter库来说,如果需要弹出文件选择框, ...

  3. python 网格策略_Python版简单网格策略

    Python版简单网格策略 策略广场上的Python策略不多,这里编写了一个Python版本的网格策略.策略原理十分简单,在一个价格区间内固定价格距离产生一系列的网格节点,当行情变化时,价格到达一个网 ...

  4. python rm 条件_python版rm命令

    安全的linux rm 命令 -- python版rm命令 众所周知 linux 下 大杀器之一 rm 是多么恐怖的东西存在 众多系统管理员 对此命令是又爱 又恨, 基于本人也是一枚系统管理员, 写下 ...

  5. python字体大小_python 设置xlabel,ylabel 坐标轴字体大小,字体类型

    本文介绍了python 设置xlabel,ylabel 坐标轴字体大小,字体类型,分享给大家,具体如下: #--coding:utf-8-- import matplotlib.pyplot as p ...

  6. cfiledialog对话框大小_文件选择对话框:CFileDialog

    程序如下: CString   FilePathName; //文件名参数定义 CFileDialog  Dlg(TRUE,NULL,NULL, OFN_HIDEREADONLY | OFN_OVER ...

  7. python容器装水_Python版LeetCode11. 盛最多水的容器

    本文转载自[微信公众号:机器学习算法与Python精研,ID:AITop100]经微信公众号授权转载,如需转载与原文作者联系 题目: 给定 个非负整数 1,2,...,n,每个数代表坐标中的一个点 ( ...

  8. [转载] python set大小_python set集合

    参考链接: Python集合set Python set集合 最后更新于:2020-03-21 12:06:03 在python变量中除了以前文章所提到的整形int / 浮点数float / 布尔值b ...

  9. python显示倒计时_python版春节倒计时实时显示

    昨天写了个计算距离今年春节还有几天的脚本,今天在群里看到可以实时刷新的一个脚本,利用flush()函数清空输出的功能,我把昨天的脚本修改了以下,下面直接上代码:[root@localhost prog ...

最新文章

  1. 程序员必须知道的几个Git代码托管平台(转)
  2. javascript基础(幼兔、小兔成兔数量等典型例题)
  3. Python用泰勒公式模拟函数
  4. 文件操作相关的系统函数
  5. 下取整函数的含义_取整函数解读
  6. c语言程序设计报告调试分析,C语言程序设计情况分析报告资料.doc
  7. maccmsv10 苹果cms10 站群扩展 自用版
  8. img pdf 展示_pdf.js实现图片在线预览
  9. HTML5本地存储与会话存储
  10. 1-22 在“终端”里,运行“top”命令
  11. Makefile编写练习题
  12. SpringBoot开发的java后台管理系统
  13. Vue框架实例成员及项目搭建
  14. 生物信息学分析选用的服务器,蛋白质与蛋白质组分析生物信息学
  15. 【文件管理】-如何规范文件及文件夹命名
  16. HTML5 音频文件
  17. 手把手教你用Python打造一款批量下载视频并能可视化显示下载进度的下载器
  18. 数学分析笔记-有限覆盖定理
  19. UICollectionView添加headerview/footerView
  20. 【数学与算法】向量内积(点乘)和外积(叉乘)概念及几何意义

热门文章

  1. python-文章相似度计算
  2. java虚拟机的端口映射_怎样使用Holer实现将主机上多个端口映射到外部网络访问...
  3. [AE] ArcGIS Engine - 基础知识 - AE|AO|GIS开发模式
  4. python求任意范围的所有素数_Python 2种方法求某个范围内的所有素数(质数)
  5. 苹果App Store程序提交审核指南中文版
  6. 用最简单的方法实现QQ魔法表情效果!
  7. FGH40N60SMD 600V 80A 349W 逆变器高频IGBT单管
  8. 01Nginx基础(反向代理知识及常用命令)
  9. 五一假期选择哪款蓝牙耳机比较好?舒适度最好的蓝牙耳机推荐
  10. finecmsV5.0.8 \finecms\dayrui\controllers\Api.php getshell