无意中刷到一条微博热搜,突然觉得也许 Python 也能为娱乐圈尽一份力:
没错,就是几年前曾经火爆网络的“数字小姐”话题 —— 演员不背台词,片场直接念“12345”,然后甩给后期配音。娱乐砖家的后院:“数字小姐”到底是谁并不重要zhuanlan.zhihu.com
果然,能够成为流量明星的,都是生产力大师!不过看到这里我也产生了一个困惑:为什么在片场时要念的口诀是“一二三四五”,而不是 “床前明月光”?须知不同文字念出来的口型往往不同,如果“一二三四五”与真正台词的口型相差太远,那么后期工作人员无论怎样精心剪辑与配音,最终都会被观众一眼识破。
于是,一个关乎影视业生死存亡的重要课题终于浮出水面:怎样找到一个即通俗好记、又口型切合的“台词口诀”?
怎么找?当然还是Python。不过考虑到直接做“口型识别”不仅要动用人脸识别等各种复杂技术、而且还需要准备好大量的视频素材,所以在影视大佬给我们提供资助之前,我们只能退而求其次:用“发音”代替“口型”。也就是假设:发音相近的汉字,它们的口型也会相近。
那么怎样判断两个汉字的发音是否相近呢?只要在网上检索“中文、发音、相似度”,就可以找到很多计算不同汉字之间发音相似度的算法论文。最终我们选定了由IBM的Min Li等研究员开发的“DimSim”算法,原因也很简单:它已经被做成了Python第三方库,可以直接使用我们最爱的pip 命令安装:
安装成功后,打开Python编辑器就可以马上感受它的威力:
比如上面这个IDLE交互窗口里,我们首先导入 dimsim 模块,然后调用它的 get_distance 方法,就可以检测任意两个汉字(词组或整句也可以)之间的“发音距离”。如果两个字发音相同(比如上面的“流”和“留”),那么get_distance就会返回数字0;而如果发音相近(比如上面的“流”和“六”),返回数字就会很小;而对于发音差别较大的文字(比如上面的“流”和“一”),返回数字则会很大。(需要注意的是,dimsim只能处理纯正的汉字,不能判断标点符号、字母、阿拉伯数字等字符)
有了这个神器,我们就可以让Python程序反复“重读”任何一个俗语“口诀”,看看它与真实影视剧本的“总发音距离”是多少。然后找出总体距离最近的一个,就是我们进军流量行列的不二法宝!
下面就是一个基本的测试代码,我们使用口诀 “一二三四五” 来模仿真实台词“玄虎城将乌石制成炸药” 。这段代码使用一个for循环将这两个字符串中的文字,按顺序逐个配对,然后输出它们的发音距离,详细思路请见注释。
需要提醒初学者注意的是,由于口诀长度往往短于真实台词长度,所以当循环到真实台词中编号为5的字符(也就是第6个字“石”)时,必须回到口诀开始、用它的0号个字符 “一” 来匹配;然后对于编号为6的字符“制”则用口诀的1号字符“二”来匹配……,如此类推。学习过《全民一起玩Python 提高篇》的同学可能就会想起来:这个问题是典型的“生成周期性序列”,可以用模运算轻松实现,也就是上面代码中word [ i % len(word) ]一句的来历。
我们可以再用这个程序试试另外一个口诀,比如“唵嘛呢叭咪吽”,同样可以得到另一组距离:
那么问题来了,怎样才能把这两组几十个数字放在一起比较,分辨出“一二三四五”和“唵嘛呢叭咪吽”孰优孰劣呢?最简单的思路,就是使用计算每一组的统计指标,比如均值、方差、中位数。
所以我们把之前的程序再修改一下:将得到的所有距离数字存入一个列表,然后调用《提高篇》中介绍的numpy模块,直接输出它们的统计特征再进行比较!(代码略)
修改口诀内容再次运行这个程序,得到比较结果如下。显然,对于“玄虎城将乌石制成炸药”这句台词来说,口诀“一二三四五”确实比“唵嘛呢叭咪吽”更接近些,难怪这么多数字小姐都选用这个口诀。
不过仅用这十个字的一句台词做样本,实在是没有说服力。所以接下来杨老师在豆瓣上找到一个真实剧本,并用正则式删除其中所有非汉字字符后,作为我们这一次的测试用例(共计6981字)。
同时再次修改程序,让它只运行一次,就能够试验所有候选口诀:
终于,揭晓真相的时刻到来了!“12345”到底是不是最好的口诀呢?请见计算机告诉我们的答案:(杨老师已经用红笔标出了最终排名)
很不幸,在我们随便选取的这8个口诀中,多篇相关新闻中提到的 “1234554321” 只能位列第7,表现仅略强于“我是一只小鸭子”。相比之下,明星们还不如牢记六字真言“唵嘛呢叭咪吽”,不仅口型匹配度明显提高,而且念出来中气十足、大气磅礴,足以震慑对家、展现自己的的顶流身份。
不过想必同学们都已经发现最有趣的地方 —— 发音相似度排名第一的口诀居然只是一个字:“喵” !
也就是说,想“演好戏”不仅不用背台词,甚至都不需要会数数,只要站在那里不断“喵喵喵”,就可以搞定对手戏!想一想,既然排名第7的“一二三四五”都已经在多个剧组中得到了实践认可,那么排名更高的“喵”自然更值得导演们青睐。
所以,杨老师在这里向流量圈郑重建议:
为了播放效果好,请在片场学猫叫!
免责声明:本文仅为调动Python初学者兴趣,并非科学研究、方法亦不求严谨,例如:用发音相似度替代口型相似度并不完全精确;
发音距离超过一定阈值后,互相比较可能失去意义;
应当对测试台词进一步整理、只保留纯粹的对话内容;
使用不同的剧本台词,将会导致不同的测试结论;
DimSim算法的精确性和距离数字的意义需要进一步考察;
……