谷歌手机芯片的最强诠释

来源:内容由半导体行业观察(ID:icbank)编译自「tech radar」,谢谢。

与谷歌 Pixel 6系列的外观一样时尚和独特,正在其内部发生的事情更令人兴奋,因为谷歌首次在其手机中使用了自研SoC。

这个被称为 Google Tensor,在不久前首次亮相,但披露细节很简单,现在我们对它有了更多了解。下面我们将详细介绍 Google Tensor 芯片组是什么,以及它为什么会成为 Pixel 6 的秘密武器。

Tensor 是谷歌设计的第一个处理器,它是为 Pixel 手机定制的。第二点很重要,因为这意味着您可能不会在任何非 Pixel 手机中看到这一点。这也意味着 Tensor 是从头开始构建的,以尽可能适合Pixel6系列。

这与为大多数 Android 手机提供动力的高通公司的 Snapdragon 芯片组形成鲜明对比。有了这些,你会在许多手机中找到相同的芯片组,虽然在某些情况下高通可能会与设备制造商合作以尽可能多地使用芯片组,但它的芯片组通常更接近于下架选项而不是真正的自定义选项。

Google Tensor 有两个高功率核心、两个中核心和四个高效核心,尽管 Google 没有详细介绍这些核心。但是,该公司声称 Tensor 芯片组的性能比Pixel 5快 80% 。这是一个很大的数字( Pixel 5 配备了中档 Snapdragon 765G 芯片组)。

具体而言,谷歌的 SoC 是一个 5nm 八核设计,分为大、中、小三核。领先的是两个以 2.8GHz 运行的 ARM Cortex-X1 内核。这一点值得注意,因为为三星 Galaxy S21 和许多其他高端手机提供动力的高通旗舰骁龙 888芯片只有一个 X1 内核。看看 Tensor 相比之下快了多少会很有趣。

此外,还有用于 AI 的定制 TPU(张量处理单元)、两个中端(传闻是较旧的 Cortex-A76 内核),然后是四个低能效内核(可能是 Arm 常用的 Cortex-55 设计) . 图形方面则会由一个 20 核 GPU 提供,此外还有一个上下文中心,它可以为环境体验提供动力,例如永远在线的显示器、一个私人计算机核心和一个新的 Titan M2 芯片以确保安全。还有一个专用的图像处理核心来帮助 Pixel 的标志性摄影。

目前还不清楚为什么 Google 会选择使用 Cortex-A76 内核而不是更现代的 Cortex-A78(它们更强大,更节能)。但值得注意的是,Pixel 5 的骁龙 765G也使用了两个 Cortex-A76 内核作为其主 CPU 内核。

Tensor 更专注于确保组件协同工作,而不是单独提供峰值性能。这可能意味着它没有达到最高基准,但它可以在现实世界中更好地工作。

除此之外,谷歌还没有直接将它与竞争对手的芯片组进行比较,并且在它是否比最好的替代 Android 芯片组强或弱的问题上存在分歧。

Google Tensor 不仅仅与原始功率有关。Google Tensor 的设计考虑了设备上的机器学习和人工智能,使其能够改进语音识别和图像处理等功能,使翻译、Google 智能助理、相机和手机的其他方面更快、更准确。

例如,这让 Pixel 6 可以使用新的实时翻译功能即时翻译消息和视频,这意味着相机可以拍摄出更好的照片,即使是在星夜等低光环境中,看起来也更接近你的样子。

Tensor 对视频录制也有类似的作用,即使在以 60fps 拍摄 4K 镜头时,也能提供更准确和生动的色彩。

受益于Tensor,拍照时的人脸检测也应该更快、更准确。

谷歌声称 Tensor 将允许改进现有功能和全新功能,例如新发布的运动模式、面部去模糊和视频语音增强模式。

该公司还表示,它使 Pixel 6 系列能够随着时间的推移不断变得更好。

据谷歌称,与其他芯片组相比,Tensor 可以完成大部分工作,同时还可以节省电量,从而延长电池寿命。

谷歌宣扬的另一件事是该芯片组的安全性。

Tensor 有一个安全核心(这意味着敏感任务可以在专用环境中运行),并加入了 Titan M2 安全芯片。在两者之间,这使得 Pixel 6 系列比该系列之前的型号更能抵御攻击。

事实上,谷歌声称 Pixel 6 和 Pixel 6 Pro 拥有所有手机中最多的硬件安全层,独立的安全实验室测试表明它可以抵御各种高科技威胁,例如电磁分析、电压毛刺和激光故障注入。

Google Tensor 芯片组还允许 Pixel 6 获得五年的安全更新,而其他 Android 手机大多只能获得几年的安全更新。

谷歌制造自己的芯片组的最后一个潜在优势是,它不必向高通这样的另一家公司付款,因此通过去掉中间商,它最终可以省钱。但最终还是有关键词的。

虽然谷歌没有谈到 Tensor 的财务状况,但This is Tech Today 的M. Brandon Lee最近辩称,开发新的芯片组需要很多时间,虽然最终可能会节省成本,但他们不会在几年内这样做。

尽管如此,如果他们这样做的话,可能意味着手机的价格会降低,或者允许谷歌将这笔钱投资到其他技术和功能上,这些技术和功能可能会成为未来的 Pixels。但这是另一个芯片组和另一个时间的好处。

★ 点击文末【阅读原文】,可查看本文原文链接!

*免责声明:本文由作者原创。文章内容系作者个人观点,半导体行业观察转载仅为了传达一种不同的观点,不代表半导体行业观察对该观点赞同或支持,如果有任何异议,欢迎联系半导体行业观察。

今天是《半导体行业观察》为您分享的第2833内容,欢迎关注。

晶圆|集成电路|设备|汽车芯片|存储|台积电|AI|封装

原文链接!

谷歌和印度首富于明年联合推出了入门级智能手机jiephone

由印度首富(穆克什-安巴尼)经营的Jio Platforms和谷歌周四发布了JioPhone Next,这是一款价格低廉的安卓智能手机,进一步推动在世界第二大互联网市场扩大其影响力。这家印度公司去年从谷歌获得了45亿美元的投资,另外从Facebook和其他公司获得了155亿美元的投资,并分享了开发低成本智能手机计划。

JioPhone Next旨在帮助印度大约3亿仍在使用2G网络的用户升级手机,以接入更快的网络。这款手机采用极其优化的安卓移动操作系统,将于9月10日在在印度推出,并最终在印度以外的地区发售。JioPhone Next将是一款超实惠的4G智能手机,但是目前没有透露手机的价格或硬件规格。

JioPhone Next将配备一系列功能,包括朗读和立即翻译,将适用于手机屏幕上的任何文本,包括网页、应用程序、信息甚至照片。它还具有快速、高质量的摄像头,将支持HDR,而且JioPhone Next将受到最新安卓版本和安全更新的保护。谷歌与Jio团队在工程和产品开发方面进行了密切合作,使这些用户能够以自己的语言消费内容和浏览手机,提供良好的相机体验,并获得最新的Android功能和安全更新。

在印度出货的大多数智能手机价格是150美元或更低,但是在寻找价格低于100美元智能手机方面,客户也没有什么选择,而且这种选择在最近几年已经缩小了。研究机构Counterpoint发现,100美元以下的智能手机份额仅占印度智能手机市场的12%,低于2019年的18%和2018年的24%。50美元以下的智能手机在2020年仅占整个市场的0.3%,低于2018年的4.3%。

谷歌发布了一款新的智能手机:配备了自主开发的芯片,计算摄影的上限即将到来吗?

记者|王公逸

作为已经被剧透了“底朝天”的新品,早在今年八月,谷歌就大方公布了Pixel 6系列的宣传照,随后一系列参数都得到了逐步确实,但真正的发布会却姗姗来迟。直到10月20日凌晨,Pixel 6系列终于正式问世。

不停剧透自家产品的前提下,Pixel 6系列的外观,可能是本场发布会最不意外的部分。

新品采用了长条式的后置镜头,而模组宽度接近于整体后盖,上下两处则为不同的颜色搭配,是一种碰撞拼贴的设计思路,想必Pixel的老用户们对此并不会感到陌生。

再来看参数。Pixel 6 Pro的后置三摄分别为5000万主摄(GN1 大底传感器)+1200万超广角+4800万潜望式长焦(支持4倍光学变焦)+LDAF传感器,Pixel 6则少了一枚潜望式长焦镜头,采用了主摄+超广角的双摄配置。

接着是正面。Pixel 6 Pro搭载了一块6.7英寸OLED曲面屏,QHD+(3120×1440)分辨率,120Hz可变高刷;Pixel 6的尺寸稍小,6.4英寸OLED直屏,FHD+(2400×1080)分辨率,支持90Hz高刷。

尽管屏幕一大一小,但Pixel 6 / 6 Pro都重约210g左右,厚度约为8.9mm,同时均支持屏幕指纹识别、双扬声器、WiFi 6E、蓝牙5.2以及IP68防尘防水,但Pixel 6的4614mAh容量电池略小于6 Pro的5003mAh,不过二者都支持30W快充。

因此整体来看,今年的Pixel 6系列,从参数上已经向安卓旗舰看齐。

但这并不是Pixel的常规套路,“重软件、轻硬件”一直是谷歌打造产品的思路,除了屏幕、影像的旗舰参数外,今年的Pixel 6系列的另一大亮点,是搭载了谷歌的首颗自研芯片:Google Tensor。

根据谷歌的介绍,Tensor采用三星5nm工艺制程, 2+2+4的8核心架构,相比上一代Pixel 5所搭载的骁龙765G,Tensor的CPU性能提升了80%,GPU提升了370%。

当然,作为计算摄影的标杆水平,自研芯片的加入,一定意味着谷歌在图像处理方面,想要拿出点“更猛”的东西。

首先,除了HDR照片拍摄之外,Pixel 6系列支持了HDR的视频拍摄功能,规格达到了4K、60fps,这背后就需要Tensor的强大算力支持。

其实HDR视频拍摄,是目前旗舰安卓手机的标配功能,但考虑到过去Pixel系列HDR照片的出色表现,这个视频模式下的功能值得期待。

其次是“Magic Eraser” P图功能。借助Tensor的机器学习能力,Pixel 6可将画面中的干扰因素进行移除,整个过程通过自动识别完成,而除了Pixel拍摄的照片之外,这项功能也支持其他App中的图片。

然后是对于模糊的调整。在实际的拍摄中,抓拍运动人物时会遇到“糊片”的问题,而拍摄类似车流、水流时,又要适度保留模糊的效果,因此通过机器学习,Pixel能对不同的模糊给出不同的调整,比如还原清晰的人脸或水流的动态模糊。

最后是对于自然语言的处理。借助Tensor的算力,Pixel 6首先能提高语音识别的准确性,比如支持自动接听服务电话,并将语音实时转化为文字,其次借助Live Translate功能,Pixel 6可直接在聊天软件中进行实时翻译,帮助用户更方便地进行跨语言沟通。

毫无疑问,Pixel 6系列不是一款堆料的产品,借助自研芯片,谷歌想继续做强计算摄影的效果,而无论是语音识别还是实时翻译,这些凭借“机器学习”展开的功能,也都是Pixel 6进一步思考人机怎样互动的结果。

在硬件越发同质化的当下,和过去几代的Pixel类似,这样从算法去提升体验的思路,依旧有着浓浓的谷歌烙印。

Pixel 6系列价格:

  • Pixel 6,8+128/256GB,599美元起,约3800元;
  • Pixel 6 Pro,12+128/256/512GB,899美元起,约5700元。

准时atom i.mx6u嵌入式Qt开发指南:第3章了解Qt

今日头条/西瓜视频/抖音短视频 同名:正点原子

感谢各位的关注和支持,你们的关注和支持是正点原子无限前进的动力。

第三章《初识Qt》

本章将介绍什么是Qt,同时与大家一起安装Qt,根据不同用户的编程习惯,这里我们介绍在Windows安装和在Ubuntu下安装。教程重点是以在Ubuntu环境下编写Qt作讲解。配置Ubuntu下的Qt Creator的中文输入法,讲解Qt Creator的界面组成与设置。新建一个简单的“hello world”例程带大家一起学习Qt应用程序的建立、编译及调试步骤。

我们重点关注3.4小节,搭建Linux下Qt的开发环境,因为搭建环境是很关键的一步。有些朋友可能在搭建环境这一步就卡住,走不下去了,后面的开发还有很长的路要走。所以我们需要有足够的耐心,不要浮躁,细心的按教程的步骤走,遇到错误,学会随机应变,找解决方法。如果对Ubuntu的使用不熟悉,建议多多练习。

3.1 Qt是什么

Qt是一个跨平台的C++开发库。主要用来开发图形用户界面(Graphical User Interface,简称GUI)程序。

Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。

Qt 还存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。开源社区就是这样,好东西就会被派生扩展,到处使用,越来越壮大。

Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。

简单的来说,Qt可以做很多东西,好比如Windows下的软件也有很多是Qt开发的,这里我很喜欢它的一个特性就是跨平台使用,“跨平台”代表一份代码可以无需任何修改或者小修改就可以在其他平台上运行。

笔者不再介绍Qt的发展史了,这些网上可以查到。写太多感觉也没有什么用,反正Qt就是您做界面需要选择的一个好工具!

3.1.1 Qt与Qt Creator的关系

3.1.2 Qt能做什么

Qt能做什么?理论上来说,您能想到的App,Qt它都基本能做。像WPS这种大型的桌面应用,Maya(3D建模),一些游戏的内核都可以使用Qt来实现。甚至您能快速使用Qt来开发一款像酷狗,网易云音乐这样的音乐播放器。在嵌入式里,使用Qt来开发界面已经是无可替代的一种趋势。工控界面最常用,一些移动端的界面也开始使用Qt。像点菜机,温度采集数据显示,汽车仪表,速度显示界面等。Qt能做优美的界面,所以推出了QML(一种描述性的语言)。每次Qt更新都有在Quick(QML使用的模块)上优化或者添加功能,看来Qt打算在移动设备端的开发市场端进军!呵呵,其实Qt早已经在这块发展了!

下面是本书开发的一些界面小例子,请欣赏。要想开发好的界面关键是要有想法。可以说如果您是做界面其实大多数时间花在美化界面上,功能都是比较容易实现的。最好读者需要有一定的美工基础,例如会基本的PS,在开发过程中就不用去麻烦公司的美工了,开发界面和程序一起做。

暗黑主题音乐播放器界面UI设计。

简约的视频界面设计。

炫酷车载音乐APP主界面开发。

这些设计都尽在第二篇提高篇里的第十二章多媒体章节和项目实战篇里。编者水平有限,但是爱设计UI,尽量把UI设计得好看与实用。至少比其他Qt书籍设计的好看。Qt设计本来就应该在界面上多下功夫,功能都是不难实现的,日后在大家会发现,设计界面占用的时间可能是70%,写程序可能占30%。大家应该在设计界面上多多下功夫!!!

3.1.3 Qt/C++与QML

QML是Qt C++基础上拓展的。也就是说Qt C++上所使用界面的类,基本都是可以拓展到QML上。如果不能拓展的,也可以直接QML与C++一起使用。实际上Qt C++效率更高。所以本教程都是Qt C++为基础做教程入门教程,QML可以说是一个加分项。Qt QML模块提供QML语言开发应用程序和库提供了一个框架。QML本身不涉及显示部分的内容,所以Qt Quick模块充当了这部分的作用。至于他们三者的关系,我们就这样简单的了解一下就行了。

Qt C++在底层编写功能更突出,若要做好看的界面且功能强大,Qt C++与QML语言结合是必不可少的。QML语言负责界面层,而底层调用Qt C++。比如文件的读写、图像处理、多线程通信等这些都是需要C++来编写完成的。

在目前来说,Qt C++更成熟,QML目前也比较成熟了,因为每次更新版本QML也有更新。不过在低版本的Qt(如Qt5.6以下),QML还不够成熟,QML在高版本的Qt(如Qt5.7以上)更成熟。C++依旧是 Qt 的主要编程语言,Qt 5 也并没有忽略它,Qt 5 添加了很多新的 C++ API,而且会持续更新。引入 QML应该是Qt向移动端市场的一个突破,还有python和javascript都可以在Qt里用。

说了C++又说QML,但是Qt基础教程还是主打Qt C++,有了基础学Qt里其他的东西就不难!

3.2如何选择Qt版本

初学者应该要如何选择Qt的版本?截至2020年最新的Qt5版本是Qt5.15。可以参考这个网址https://doc.qt.io/qt-5/qt5-intro.html来看看各个Qt版本的更新说明。Qt6已经出了,我们有必要直接上最新版本的Qt6吗?不!Qt6理论上与Qt5能兼容,但是许多公司在用Qt5甚至Qt4。学习了Qt5,Qt6等稳定版本出来,等市场上用的多,我们用Qt6才是最明智的选择,新出的事物往往要有一定的时间去适应!我们主要是简单对整个Qt版本说明一下。首先,Qt版本的升级肯定是对上一版本进行优化。比如Qt4与Qt5的的语法区别,Qt5的信号槽写法与Qt4的信号槽写法有区别。除了Qt5.10以上的版本,Qt5.6与Qt5.9是Qt长期支持的版本LTS(Long Term Support,简称LTS)。但是2020年3月最近Qt官方将Q5.2~Qt5.8、Qt5.11归档到https://download.qt.io/new_archive/qt/。所以很多小伙伴们想用老版本的Qt要到上面这个链接去下载了。毕竟有些时候我们开发板程序处于某个Qt版本下开发的,如果要迁移到新版本的Qt可能还要考虑到兼容问题!不过变化不会很大的,请放心!

下面贴出Qt官方下载链接https://download.qt.io/archive/qt/。我们直接进入这个链接可以看到下图。下图和上图加起来才是Qt的完整版本。那么多版本任君选择。还可以看到Qt版本在不断的更新,更多的功能将会注入到Qt这个GUI库里,使我们开发变得更简单和有趣!Qt6的时代即将到来!

理论上我们选择Qt的版本越新越好,这是当然的,不过我们还是要确定一个版本是必须的,因为日后写好的程序要长期运行在一个确定的版本里,避免随意升级带来其他兼容性问题,或者重复重复移植等工作。Qt还会不断的更新,Qt5.9及Qt5.12是两个LTS长期支持的版本,本教程以的Qt5.12.9版本进行开发及实验说明。

3.3 Windows下安装Qt

在上一小节里,我们已经知道Qt的下载地址。在Windows按如下方法下载。进入地址,此节只介绍Windows下的Qt安装。

进入https://download.qt.io/archive/qt/5.12/5.12.9/,(注意如果找不到下载链接,我们就进行https://download.qt.io这个顶层目录一个个目录找,因为Qt下载链接会变动)。 从Qt5.12版本里选择Qt5.12的第九个版本。 “.dmg”是Mac系统版本的安装包,此处不作安装讲解。下图为Windows和Linux下的安装包格式。

鼠标右键选中Winodws下载安装包,选择使用迅雷下载,如果没有安装迅雷就直接点击链接下载吧,下载速度可能会比较慢。使用迅雷下载,速度会比较快。

下载完成后,找到安装包文件,双击该安装包文件。开始安装。

弹出开始安装界面,点击Next。

登录Qt帐号,如果您还没有帐号及密码,请到https://www.qt.io/自行注册一个。

Qt安装程序,开源版本的Qt遵循GPLv 2,GPL v3或者LGPL v3协议。勾选同意使用开源版本Qt,填写公司/个人的名字。

Qt的欢迎安装界面

修改安装目录

选择需要安装的组件,Windows选择安装的组件如下。MSVC是微软的VC编译器,需要安装VC相关库才能使用。MinGW是指是Minimalist GNU on Windows的缩写,允许您在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时库。除了安卓选项arm等选项,我们只需要勾选MinGW的即可。Sources是Qt源码,Source以下的是Qt的一些模块,可选择安装或者不装。这里我们选择全装。

选择同意许可协议,再点击下一步。

点击下一步。

准备安装Qt,可以看到我们安装的组件越多占用的安装空间就会越大。接近10G。

正在安装Qt。

安装完成,勾选启动Qt Creator,点击完成。

安装完成打开Qt Creator的界面如下。

3.4 Linux下安装Qt

3.4.1安装Qt

同样地,进入https://download.qt.io/archive/qt/5.12/5.12.9/下载页面(注意如果找不到下载链接,我们就进行https://download.qt.io这个顶层目录一个个目录找,因为Qt下载链接会变动),选择Linux的安装包下载。使用迅雷下载再拷贝过去Ubuntu虚拟机或者直接复制链接地址到Ubuntu 虚拟机下载。

如下图,复制链接下载地址到Ubuntu虚拟机终端下使用指令wget下载,https://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run 。

wget https://download.qt.io/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run

赋予可执行权限,加上sudo权限进入安装,这样会安装在/opt目录下。

chmod +x qt-opensource-linux-x64-5.12.9.run

sudo ./qt-opensource-linux-x64-5.12.9.run

执行安装指令后,将会弹出Qt的安装界面,这与Windows下的Qt安装步骤一样,请参阅3.3小节,安装选择目录时,默认安装目录即可。安装组件选择如下。

安装完成,在左下角应用程序中心找到Qt Creator,点击打开Qt Creator。

打开Qt Creator的界面如下,安装完成。

3.4.2配置Qt Creator输入中文

3.4.2.1配置Ubuntu中文环境

Ubuntu的默认安装环境是使用的语言是英文,很多同学不习惯。现在我们将Ubuntu的系统语言设置成中文。在Ubuntu右上角,点击设置图标如下图第①步。

按如下图设置,点击(install/Remove Languages …)安装或者移除语言,在安装语言处选择简体中文,点击Apply应用即可。

配置完成后,点击重启(或者注销Ubuntu),重启后,因为我们已经更新了系统的语言,Ubuntu询问我们需不需要将系统文件夹的名称也改成中文。这里作者选择否,保留旧的名称。保留旧的名称有一定的好处,就是我们进入这些访目录时,直接使用英文,不用切换到中文输入法。严格来说,最好是统一用英文环境开发了。这里为了初学者或者有强迫中文者,所以我们这里需要配置中文的环境,及后期开发Qt需要写中文注释,方便理解与给后人看。

3.4.2.2配置中文输入法

在上面我们已经配置好中文环境,并有拼音输入法ibus,但ibus并不好用,Qt Creator不支持ibus输入中文。好的生产工具决定好的生产力,下面我们介绍一下Fcitx输入法。

Fcitx (Flexible Input Method Framework) ──即小企鹅输入法,它是一个以 GPL 方式发布的输入法平台,可以通过安装引擎支持多种输入法,支持简入繁出,是在 Linux 操作系统中常用的中文输入法。它的优点是:短小精悍、跟程序的兼容性比较好。

Fcitx 内置的输入法支持中文 拼音 和基于字符表的输入(例如五笔),根据语言的不同,有不同的输入法引擎可以选择。

在 Fcitx 支持的拼音输入法中,内置拼音响应速度最快。Fcitx 同样支持流行的第三方拼音输入法以提供更好的整句输入效果.

fcitx-sunpinyin 在输入速度和输入精度之间有较好的平衡。

fcitx-libpinyin 算法比 sunpinyin 先进。

fcitx-rime, 即著名中文输入法 Rime IME的 Fcitx 版本。但它不支持 Fcitx 本身的 #特殊符号和 #快速输入功能,自定义设置请参见官方(https://rime.im/)。

fcitx-googlepinyin, Google 拼音输入法 for Android.

fcitx-sogoupinyin(AUR,) 搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输入。官方网址(https://pinyin.sogou.com/linux/)。

fcitx-cloudpinyin 可以提供云拼音输入的支持,支持 Fcitx 下的所有拼音输入法,Fcitx-rime 除外。

fcitx-chewing 为 Fcitx 添加 chewing (繁体中文注音) 输入引擎支持。依赖 libchewing。

fcitx-table-extra adds Cangjie,Zhengma,Boshiamy support。

安装Fcitx输入法,下面主要介绍两种输入法(五笔输入法与拼音输入),本次以安装五笔输入法为例。

sudo apt-get install fcitx-table-wubi // 五笔输入法

sudo apt-get install fcitx-sunpinyin // 拼音输入法请装sunpinyin或fcitx-googlepinyin

再到右上角点击系统设置,找到语言支持,将键盘输入方式系统点击下拉复选框选择为fcitx,然后点击应用到整个系统,再关闭。如下图步骤。

为了确保刚配置的环境生效,完成以上步骤后重启Ubuntu系统。

按如下步骤,在弹出的“输入法配置”对话框中,如果没有出现五笔字形输入法,点击左下角的“+”号按钮将五笔字形添加到输入法列表中,再点击第8步的“^”将五笔字型添加至最上方。

打开Qt Creator,在左下角“显示应用程序”,找到Qt Creator图标单击打开Qt Creator。

此时右上角的输入法标志还是英文输入法,无法在④处输入中文,按Ctrl+Shift也切换不到中文输入法状态下。

作者为解决Linux Qt Creator不能输入中文的问题,已经编译过fcitx插件,已经上传到Gitee仓库里,大家可以下载直接使用。

如果您没有安装Git,请先使用下面的指令安装Git。

sudo apt-get install git

使用下面的指令下载Qt Creator插件,本插件支持Qt5,Qt4没有测试过。本插件曾经在Qt5.5.1上测试过,后来升级了Qt版本到Qt5.12.9。Qt5.5.1与Qt5.12.9这两个Qt版本的安装目录插件路径有变动(指版本相差大,安装路径有变动)。从Gitee下载的插件适用于Qt5.12版本左右版本。如果使用其他版本请自行修改fcitx-install.sh脚本里的安装路径!

git clone https://gitee.com/QQ1252699831/fcitx-qt5-1.1.1.git

cd fcitx-qt5-1.1.1

直接执行脚本安装,原理是拷贝fcitx-qt5-1.1.1文件夹下里面的插件到Qt Creator 的安装目录下。请注意个人安装 的Qt Creator路径,一定要与作者安装的路径一样,否则需要自己修改fcitx-install.sh脚本里的路径!

./fcitx-install.sh

此时再重新打开Qt Creator方可输入中文!如下图。需要按Ctrl+Space(空格键)激活输入法,再按Ctrl+Shfit切换输入法到五笔输入法。

3.5 Qt Creator简单使用

3.5.1 Qt Creator界面组成

启动Qt Creator后,Qt Creator的主界面如下图,默认打开的是欢迎页面。可以看到Qt Creator里自带很多示例。在Ubuntu里,由于Qt Creator安装在/opt目录下,这个目录普通用户是没有权限写的,只能够读。如果要打开示例先点击后选择“复制项目并打开”。作者比较喜欢Qt Creator界面设计的。十分简洁,还自带示例,不会写也会参考!最重要的是Qt Creator里左侧栏的“帮助”按钮,有很多使用说明,总结的非常好,对学习Qt的类有很大帮助,如果学习到某个方法或者类不会用,可以打开这个“帮助”来搜索这个类或者方法的用法。没有任何一本教程能有Qt帮助文档这么详细了,可惜是英文的,初学者学起来还是会一定难度。多多参考这个Qt帮助文档,因为那里能学到很多,例子说明也特别多,每个方法、类、信号与槽等都有详细的解释。

单击顶部工具栏的“帮助”菜单,点击“UI Tour”会出现介绍Qt Creator各组件的说明。这个大家一定要看看,虽然是英文的说明,但是大体有个了解。这里就不再截图说明了。后面编写第一个Qt程序也会说明整个项目编写及编译运行的流程。界面组成我们只需要了解这么多。

3.5.2 Qt Creator设置

Qt Creator里的设置比较重要。在Qt Creator的设置里我们可以做些什么呢?我们一般会设置字体的大小、颜色和背景颜色等这样看起来比较炫,或者比较符合自己的风格。Qt Creator里也有很多主题,拥有好多种搭配,相信有一种是您喜欢的,如果不喜欢可以自定义里面的字体大小、颜色和背景颜色等。点击顶部的菜单栏的“工具”》“选项”。

打开选项后可以看到如下图的界面。

下面我们主要介绍常用的几项:

1. Kits:主要显示的是编译工具。我们在Ubuntu安装Qt Creator时,在安装选项里已经勾选了Desktop Qt5.12.9 GCC 64bit这个选项。所以在Kits这个页面就能检测到安装的编译工具。还有Qt Versions等项都可以自由查看。重要的是我们可以在这个Kits里配置ARM平台的编译工具(后面以某个ARM板卡平台为教程时有讲到如何配置),之所以Qt能够跨平台,是因为Qt有不同平台的编译工具。

2. 环境:在这个项里可以设置不同的主题和语言等。Qt Creator默认的主题和系统语言即可。

3. 文本编辑器:可以设置文本编辑器的字体大小、颜色等。还可以设置某些类型的字体颜色,如关键字、字符串和注释等。

4. 构建和运行:常用的是设置项目的目录。其他一般不用修改,默认即可。

3.6第一个Qt程序

“hello world ”的起源要追溯到1972年,贝尔实验室著名研究员Brian Kernighan在撰写“B语言教程与指导(Tutorial Introduction to the Language B)”时初次使用(程序),这是目前已知最早的在计算机著作中将hello和world一起使用的记录。第一个程序都是以“hello,world”作为默认的第一个程序,我们延续这种经典的做法吧,感受程序的伟大。同时可以让我们初步了解Qt项目搭建的基础流程。

3.6.1新建一个项目

在Ubuntu18里打开Qt Creator,也就是左下角软件中心处点击后,找到Qt Creator的图标后点击打开。单击文件Qt Creator的文件,选择新建文件或者项目。注意有快捷键Ctrl + N。直接在Qt Creator激活状态和英文状态的输入法下使用“Ctrl + N”也可以快速打开新建项目。

弹出的新建项目如下图,这里我们可以看到有很多模板(包括项目模板和文件和类模板)可以使用,包括Qt,Qt Quick,Qt for Python,…,C++等等。作为初学者我们选择第一个Application(Qt)和Qt Widgets Application,所谓的模板就是Qt为了方便开发程序,在新建工程时可以让用户基于一种模板来编写程序,包括cpp文件,ui文件都已经快速的创建,而不用用户手动创建这些文件。这样对用户的开发带来极大的便捷。当然用户可以可以自己手动创建项目,一个一个往里面加也是可以的。但是初学者不建议这么做,我们的目的是先体验一遍项目搭建的流程,等日后有空再自己回头尝试这么做吧!

如果您的输入法现在处于中文输入法,先按Ctrl再按Space(空格)切换成英文输入法,在名称处输入项目为“01_hello_world”,这里的项目路径为编者个人的家目录路径下的Qt目录下,勾选设为默认的项目路径,这样以后做项目实验时都是默认选择这个目录作为项目路径而不用自己手动选择路径了。选择下一步。

默认已经是选择qmake编译,主要用qmake生成Makefile用于项目的编译。点击下一步即可。

这里默认选择的基类为QMainWindow。在Base class一项中我们还可以看到还有QWidget和QWialog这样的基类可以选择。在C++篇我们已经学习什么叫基类,简单的来说,我们创建的这个项目是基于QMainWindow类去开发的。默认勾选“Generate form”,意思是生成ui窗体文件mainwindow.ui。为了学习方便,我们统一默认基类为QMainWindow,但是注意,在嵌入式里一般不需要标题栏,状态栏等,所以常用的是QWidget基类。

QMainWindow:主窗口类,主窗口具有主菜单栏、工具栏和状态栏。类似于一般的应用程序的主窗口。如果您想做个嵌套的窗口程序开发的软件,不妨选择这个QMainWindow。

QWidget:是可视界面类的基类,也就是说QMainWindow类也是由QWidget继承封装而来。所以QWidget要比QMainWindow功能少一些。

QDialog:对话框类,建立一个对话框界面。比较少使用此项作为基类。一般以QMainWindow和QWidget作为基类的居多。注因为QWidget不带窗口标题栏等,嵌入式里最好QWidget。

在高版本的Qt Creator里,有Translation这一项,Qt提供了一个(.ts)的文件给您,.ts是可读的翻译文件,使用简单的XML格式。我们暂时只需要知道这个东西是个可读的翻译文件即可。极少需要使用到。点击下一步。

勾选编译器,这个编译器是我们在安装组件时选择的,使用这个编译器可以编译出Ubuntu版本上跑的可执行程序。这么一说是不是觉得还能编译出其他平台的可执行程序?没错,假若我们现在有ARM平台的Qt编译器,那么选择ARM平台的Qt编译器即可编译出Qt在ARM平台上的可执行文件(这里说的可执行文件类似window的exe程序文件一样,直接能够运行)。点击下一步。

到这里,Qt Creator询问是否使用版本控制,如果您学习过像Git这样的版本控制工具,可以选择Git,将您的项目使用版本控制。默认选择是无版本控制,直接点击完成即可。

新建的“01_hello_world”项目如下。

3.6.2项目文件介绍

其中,左侧有上下两个子窗口,上面的窗口显示了项目的文件结构,显示当前的项目为“01_hello_world”,细心的还会发现“01_hello_world”是用粗体黑色标明。说明此项目是活动项目,活动项目的项目根节点都是用粗体字体表示的。如果打开了多个项目,那么我们只需要观察哪个是加粗的项目名就表示当前活动项目。

Qt Creator和其他IDE开发软件一样。都是分组管理项目内的各种源文件,下面是项目内的文件简介。

01_hello_world.pro是项目管理文件,这个项目管理文件十分重要,当您加入了文件或者删除了文件,Qt Creator会自动修改这个*.pro文件。有时候需要打开这个*.pro文件添加我们的设置项。

Header分组,这个节点下存放的是项目内所有的头文件*.h。

Source分组,这个节点下存放的是项目内的所有C++源码文件*.cpp。

Forms分组,这个节点下是存放项目内所有界面文件*.ui。*.ui文件由XML语言描述组成,编译时会生成相应的cpp文件,这样交叉编译器就可以编译它了。

3.6.2.1项目文件*.pro

01_hello_world.pro文件如下所示。此pro文件在高版本的Qt与低版本的Qt文件有些区别,且在Windows与Linux系统下生成的pro也有些区别,但是变化不大。

01_hello_world.pro文件内容

1 QT += core gui

2

3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

4

5 CONFIG += c++11

6

7 # The following define makes your compiler emit warnings if you use

8 # any Qt feature that has been marked deprecated (the exact warnings

9 # depend on your compiler). Please consult the documentation of the

10 # deprecated API in order to know how to port your code away from it.

11 DEFINES += QT_DEPRECATED_WARNINGS

12

13 # You can also make your code fail to compile if it uses deprecated APIs.

14 # In order to do so, uncomment the following line.

15 # You can also select to disable deprecated APIs only up to a certain version of Qt.

16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

17

18 SOURCES +=

19 main.cpp

20 mainwindow.cpp

21

22 HEADERS +=

23 mainwindow.h

24

25 FORMS +=

26 mainwindow.ui

27

28 # Default rules for deployment.

29 qnx: target.path = /tmp/$${TARGET}/bin

30 else: unix:!android: target.path = /opt/$${TARGET}/bin

31 !isEmpty(target.path): INSTALLS += target

第1行,添加了Qt的支持的模块,core与gui库是Qt的默认设置。

第3行,比较Qt5版本,如果是Qt5版本,在main.cpp中application是在QtWidgets中的,因此要包含这个库。

第5行和第11行,分别配置的是使用c++11和添加QT_DEPRECATED_WARNINGS定义。

第18行,SOURCES下的是源文件。

第22行,HEADERS下是头文件。

第25行,FORMS下是ui界面文件。

第28行,部署默认的规则。

第29行,qnx:判断是不是qnx操作系统,赋值target.path = /temp/$${TARGET}/bin。

第30行,如果是unix系统但不是安卓,赋值target.path = /opt/$${TARGET}/bin。

第31行,如果target.path为空目录,赋值INSTALLS += target。

如果需要修改生成目标的可执行程序名字,可赋值TARGET = xxx。否则TARGET将默认取值为项目的名字。

3.6.2.2样式文件*.ui

mainwindow.ui是一个xml类型的文件,它的xml内容如下。这个文件是生成的不能手动编辑。只能够通过图形界面修改其属性。

mainwindow.ui文件内容

1 <?xml version="1.0" encoding="UTF-8"?>

2 <ui version="4.0">

3 <class>MainWindow</class>

4 <widget class="QMainWindow" name="MainWindow">

5 <property name="geometry">

6 <rect>

7 <x>0</x>

8 <y>0</y>

9 <width>800</width>

10 <height>600</height>

11 </rect>

12 </property>

13 <property name="windowTitle">

14 <string>MainWindow</string>

15 </property>

16 <widget class="QWidget" name="centralwidget"/>

17 <widget class="QMenuBar" name="menubar">

18 <property name="geometry">

19 <rect>

20 <x>0</x>

21 <y>0</y>

22 <width>800</width>

23 <height>28</height>

24 </rect>

25 </property>

26 </widget>

27 <widget class="QStatusBar" name="statusbar"/>

28 </widget>

29 <resources/>

30 <connections/>

31 </ui

双击mainwindow.ui后可以跳转到设计界面,如下图。下面主要介绍主体部分。

1. ①是控件栏,有各种各样的控件,上方的Filter是过滤器,输入首写字母就可以快速定到我们想要找的控件。

2. ②显示的是我们的窗口程序了,上面已经带有MainWindow对象及其几个子对象,默认MainWindow就带有菜单栏和状态栏。

3. ③是对象栏,②处用到的对象都在③处显示。

4. ④是属性栏,点击③处对象栏的某个对象,就可以在④属性栏里编辑它的属性了。属性项有很多,包括位置,大小,文字,颜色,字体等等。

3.6.2.3头文件*.h

点击左边栏的编辑,回到项目的编辑工作窗口。点击项目下的Headers下的mainwindow.h,

mainwindow.h一般有与之对应的一个cpp文件叫mianwindow.cpp。其中mainwindow.h包含类的声明,mianwindow.cpp包含类的实现。这与我们前面学习的c++是一样的。

mainwindow.h的内容如下。

mianwindow.h定义如下

1 #ifndef MAINWINDOW_H

2 #define MAINWINDOW_H

3

4 #include <QMainWindow>

5

6 QT_BEGIN_NAMESPACE

7 namespace Ui { class MainWindow; }

8 QT_END_NAMESPACE

9

10 class MainWindow : public QMainWindow

11 {

12 Q_OBJECT

13

14 public:

15 MainWindow(QWidget *parent = nullptr);

16 ~MainWindow();

17

18 private:

19 Ui::MainWindow *ui;

20 };

21 #endif // MAINWINDOW_

第7行,定义名称空间Ui ,里面有一个类MainWindow ,这个MainWindow和第10行里的MainWindow不是同一个对象。实际上,这个文件里的MainWindow类有一个成员*ui就是指向第19行的Ui::MainWindow的指针。这都是为了使用.ui文件设计界面的。

第12行,MainWindow的声明中第一行是Q_OBJECT,这是一个宏,由Qt进行处理,这也是Qt针对C++扩展的地方,所有用到信号的类都要加这个宏。

3.6.2.4源文件*.cpp

点击项目下的Sources下的mainwindow.cpp。可以看到它的内容如下。

mianwindow.cpp实现如下

1 #include "mainwindow.h"

2 #include "ui_mainwindow.h"

3

4 MainWindow::MainWindow(QWidget *parent)

5 : QMainWindow(parent)

6 , ui(new Ui::MainWindow)

7 {

8 ui->setupUi(this);

9 }

10

11 MainWindow::~MainWindow()

12 {

13 delete ui;

14 }

第2行,MainWindow的实现类中,第2行include了一个文件ui_mainwindow.h 这个文件是Qt根据.ui文件自动生成的,也就是说ui_mainwindow.h要点击编构建后才生成,我们才能看到这个文件。构建/编译后可以在debug/release的目录找到这个文件。

第6行,在MainWindow构造函数中用“,”隔开,new一个Ui中的MainWindow。这里是一种初始化成员的方法。

第8行,ui->setupUi(this);这句话是进行界面初始化,将this(指的是MainWindow类的本身),作为参数传到setupUi里,ui界面文件的对象会以this为父对象,所有子对象都将显示在MainWindow里。我们要想使用ui里的对象,必须将代码写在ui->setupUi(this)这句话之后,因为ui->setupUi(this)会先初始化里面的对象,只有初始化里面的对象我们才能使用这个对象。

第13行,析构函数里delete掉ui。在Qt里我们需要在析构函数里delete的对象一般是new创建的并且没有父对象的对象。

小提示:this在成员函数的开始执行前构造的,在成员的执行结束后清除。

点击项目下的Sources下的main.cpp。可以看到它的内容如下。

mian.cpp实现如下

1 #include "mainwindow.h"

2

3 #include <QApplication>

4

5 int main(int argc, char *argv[])

6 {

7 QApplication a(argc, argv);

8 MainWindow w;

9 w.show();

10 return a.exec();

11 }

第3行,包含QApplication类的定义。在每一个使用Qt的应用程序中都必须使用一个QApplication对象。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。

第5行,main()函数是程序的入口。几乎在使用Qt的所有情况下,main()只需要在把控制转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。argc是命令行变量的数量,argv是命令行变量的数组。

第7行,a是这个程序的QApplication。它在这里被创建并且处理这些命令行变量。

第8行,创建一个对象w,这个对象就是MainWindow。

第9行,调用方法show()。这样程序界面才能显示。

第10行,这里就是main()把控制转交给Qt,并且当应用程序退出的时候exec()就会返回。

在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。

3.6.3修改ui文件显示hello world

双击mainwindow.ui,进入“Ui设计器”页面如下。

可以看到中间的要设计的主窗体目前是空的,但是窗体上已经有好几个成员了,可以看到右边的对象栏,已经有3个对象成员在里面了,只是我们看不出来而已,效果不太明显。

我们要在窗体里显示“Hello World!”,那么需要使用左边的控件栏,目前左边的控件栏的控件有很多,也分很多类别。这些对于我们初学者来说,暂时不用知道它们是怎么用的。后面教程其中的类别进行说明它们是如何使用的。现在我们主要是想要显示“Hello World!”。要明白我们的主要目的,切勿看到左边的控件栏就想一个个的去试,又不知道怎么去用。这样的学习方式是不对的。要显示“Hello World!”,那么我们需要用常用的文本显示控件,常用的就是Label文本控件了,当然PushButon按钮类也是可以显示文本的。但是我们不需要按钮的功能,只需要显示文本。所以用Label文本控件就可以了。

如下图,在左边的控件图,找到Label控件,Label控件在“Display Widgets”(翻译为显示小部件)下,选中Label控件,将其拖至②处中间的设计窗体里。然后在③处选中label对象,再在④处label对象的属性栏找到text文件属性,修改里面的文本为“Hello World!”。这样我们就已经显示“Hello World”在窗口里了。当然双击中间的Label控件也是可以修改其文本属性的,对初学者来说还是按步骤修改,这样学习“Ui设计器”是如何使用的。这里我们已经完成显示“Hello World!”的设计了。

3.6.4项目编译&调试&运行

完成上面的“Hello World!”后,我们肯定下一步是想编译运行我们的程序了,看看效果如何!

按如下步骤,先返回编辑页面,再点击②处左下角的绿色三角符号(或者按Ctrl + R快捷键编译且运行),编辑时会输出编译信息,点击③处的编译输出窗口里,可以看到编译时的编译信息,能看到编译警告、编译错误、编译链接、相关编译器编译过程等。

在Ubuntu下刚装的Qt Creator,毫无意外,第一次编译时会报“Cannot find -lgL”的错误。由于 Qt5.0的库默认会链接到OpenGL,但是在Ubuntu机器上没有安装OpenGL,所以们需要在Ubuntu下安装OpenGL Library。在Ubuntu终端下输入如下指令。

sudo apt-get install libglu1-mesa-dev

安装完成后,我们再点击左下角的绿色三角形试试,可以看到如下结果!在下图②处已经看到没有报错信息了。如果还有其他报错,建议回到第一章C++环境设置里寻找C++环境配置的相关指令安装好相应的库。可能初学者跳过了C++就直接到Qt这部分了,Qt也依赖C++的环境的!

运行的结果如③处,弹出一个窗口,中间就是我们设计的Hello World!

如果需要调试,请先关闭上面的“Hello World!”窗口,点击右上角的“x”关闭即可!再按如下步骤点击,在程序里右键设置断点,再点击左下角③处的Debug绿色三角符号按钮。不过我们很少使用调试,这种简单的程序完全是可以预知它的运行过程的,如果我们想要知道它的运行过程,是可以使用这个调试的功能去了解Qt程序的运行流程的!

谷歌翻译又迈出了一大步

自从2015年以来,语言助手“谷歌翻译”就一直致力于开发相机翻译(Word Lens),帮助用户进行不同语言之间的实时翻译。它支持多种语言——英语、西班牙语、俄语、意大利语、法语、葡萄牙语、德语等等,如今它已发展到30种语言,包括日语。

不像传统的谷歌翻译,相机翻译并不需要用户提供照片或者打字。要得到快速的实时翻译,只需把相机对准你不认识的生词,不论是在路牌上、菜单上,甚至是在食物标签上,它们的翻译就会立刻出现在你的屏幕上。

谷歌认为此项功能对于日本的游客来说尤为实用。有了相机翻译,你就再也不用担心在街上拐错弯,在菜单上点错菜。你不必再猜测生词的意思,只需尽情享受你的假期。而且这个功能还可以离线使用哦!

相机翻译除了能把日文翻译成英文,还能把英文也翻译成日文。相机翻译支持的语言也在不断扩充,目前在苹果和安卓双平台都提供下载。

虽然相机翻译2015年就已经面世,但是日文最近才被添加到其支持语言库中。

除了相机翻译,谷歌翻译还自带支持多语言的其他快捷翻译功能。

离线翻译功能。

支持手写翻译。

还拥有32种语言的双向快速翻译功能。

翻译:竺怡冰

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

想要获取更多有意思的内容,请移步界面网站首页(https://www.jiemian.com/),并在微博上和我们互动,调戏萌萌哒歪楼菌→【歪楼-Viral】(请猛戳这里)。

你也可以关注乐趣频道的微信公众号【歪楼】:esay1414

我可以做一名翻译!微软快捷键输入法Android更新

IT之家9月28日消息 日前SwiftKey官方发布了推特,宣布SwiftKey输入法安卓版已经集成微软翻译,将可以为用户提供实时的翻译体验。

微软官方表示,该功能支持超过60种语言,且无需另外安装微软翻译App。不过IT之家发现,该功能需要连接到网络使用,而微软翻译App则支持离线翻译功能。

以下为新版本更新日志:

  • 从工具栏访问Microsoft Translator

  • 你现在可以输入Adyghe、Nubian(Dongolawi)、Dotyali、Gorontalo、Ingush、Kabiye、Mi’kmaq、Newar、Wakhi、Kalmyk和Nubian(Kenzi)

  • 更新了阿拉伯语(埃及)、S’gaw Karen、马拉地语、奥里亚语、旁遮普语和沃洛夫语

微软SwiftKey下载地址:点此前往(Google Play商店)

谷歌输入法背后的机器智能:想你想什么,想你想什么!

很多人每天花费大量时间使用移动设备键盘:撰写电子邮件,发短信,参与社交媒体等。 然而,移动键盘仍然在处理速度方面处于劣势。 用户平均在移动设备上的打字速度比在物理键盘上慢35%。 为了改变这一点,最近谷歌团队为Gboard for Android提供了许多改进,致力于创建一个智能机制的 键盘,能够为用户以任何选择的语言提供建议和纠正错误,从而实现更快更高质量的输入。

事实上,移动键盘将触摸输入转换为文本的方式类似于语音识别系统将语音输入转换为文本的方式,雷锋网了解到,该团队将利用语音识别的经验来实现触摸输入。

  • 团队首先创建了一个强大的空间模型,将原始触摸点的模糊序列映射到键盘上的按键,就像用声学模型将声音定位到语音单元的顺序一样。

  • 第二,构建一个基于有限状态传感器(FST)的核心解码引擎,以确定给定输入触摸序列的最有可能的字符序列。 随着数学形式主义和语音应用的广泛成功, FST解码器将提供支持各种复杂键盘输入行为以及语言特性所需的灵活性。 在这篇文章中,将为您详细介绍这两个系统的发展。

神经空间模型

移动键盘输入的错误通常归结于“胖手指打字”(fat finger typing,或在滑动打字中定位到空间位置相似的词,如下图所示)以及认知和操作错误(表现为拼写错误,字符插入,删除或互换等)。 智能键盘需要能够解决这些错误,并且可以快速准确地预测正确的单词。 据雷锋网了解,该团队为Gboard构建了一个空间模型,在字符级别处理这些错误,将屏幕上的触摸点映射到实际按键。

两个位置相似的词:“吸血鬼vampire”和“价值value”的平均滑动路径

一直到最近,Gboard还在使用高斯模型量化敲击相邻按键的概率和基于规则的模型,来表示认知和动作错误。 这些模型简单直观,但并不能直接优化与更高的打字质量相关的指标。 根据语音搜索声学模型方面的经验,用连接时间分类(CTC)标准训练的单个高效长期短期记忆(LSTM)模型替代了高斯模型和基于规则的模型。

然而,训练这个模型比预期的要复杂得多。 虽然声学模型是从人类转录的音频数据进行训练的,但是并不能轻松地转录数百万的触摸点序列和滑动轨迹。 所以该团队利用用户交互信号,例如自动修正和建议选择作为负面和正面的半监督学习信号,因此形成了丰富的培训和测试集。

对应单词“可以could”(左)的原始数据点,以及每个采样方差(右)的归一化采样轨迹

使用来自语音识别文献的大量技术来迭代NSM模型,使其足够小且足够快以便在任何设备上运行。 TensorFlow基础设施用于训练数百种模型,优化键盘上显示的各种信号:完成,建议,滑动等。

经过一年多的 努力,完成的模型比初始版本快6倍,大小仅是最初的十分之一。同时,它还显示出在脱机数据集上的错误自动更正减少约15%的错误,而错误解码手势则减少了10%。

有限状态转换器

虽然NSM使用空间信息来帮助确定敲击或滑动的字符是什么,但还是有一些额外的限制——词汇和语法 ——这些是可以承受的。词典告诉我们语言中出现了什么词汇,而概率语法告诉我们什么话可能接在其他的话后面。为了对这些信息进行编码,使用有限状态换能器。 FST(Finite-State Transducers)一直是Google语音识别和综合系统的关键组成部分。它提供了一种原则性的方式来表示自然语言处理中使用的各种概率模型(词典,语法,规范化等)以及操纵,优化,组合和搜索模型所需的数学框架。

在Gboard中,一个键传感器紧凑地表示键盘这个词,如下图所示。 它编码从按键序列到字的映射,允许替代键序列和可选空格。

该转换器沿着从起始状态(粗体1)到最终状态(两圈状态0和1)的路径编码“I”,“I’ve”,“If”。 每个弧用一个输入按键(“:”之前)和一个对应的输出字符(“:”之后)标记,其中ε编码空符号。 “I’ve”中的撇号可以省略。 用户有时会跳过空格键。 为了说明这一点,转换器中的单词之间的过渡空格键是可选的。 ε和空格后弧允许存在多个单词。

概率n元传感器用于表示键盘的语言模型。 模型中的状态代表一个(直到)n-1个字的上下文,并且离开该状态的弧,将被标记为一个后续字符以及跟随该上下文的概率(由文本数据估计)。 这些与给出关键触摸序列的可能性(滑动中的离散触摸或连续手势)的空间模型被组合并且用波束搜索进行探索。

通用FST原则,如流式传输,动态模型支持等,为构建新的键盘解码器带来了很大的帮助,但还需要添加一些新的功能。 当人们说话的时候,并不需要解码器来完善你所说的话,或者猜测你会在后面说些什么来省下几个音节; 但是当你输入时,你会感受到词语完成和预测的帮助。 此外,该团队希望键盘可以提供无缝多语言支持,如下所示。

在Gboard上输入三种语言

让新的解码器投入实际应用是一项复杂的工作,但FST原则有很多好处。 例如,支持印地语等语言的音译只是解码器的简单扩展。

音译模型

在许多具有复杂脚本的语言中,已经开发了罗马化系统,以将字符映射成拉丁字母,通常根据其发音。 例如,拼音“xièxiè”对应汉字“谢谢”。 拼音键盘允许用户在QWERTY布局上方便地输入单词,并将它们自动“翻译”到目标脚本中。 同样,一个音译印地语键盘允许用户输入“daanth”(牙齿)“दांत”。 而拼音确定是一个罗马化系统,印地语音译则更模糊; 例如“daant”将是“दांत”的有效替代方案。

印地语的滑动字符转换

正如从字母序列到单词(词典)的传感器映射以及为单词序列提供概率的加权语言模型自动化,该团队为拉丁语按键序列和目标脚本符号序列构建了22种印度语的加权转换器映射。 一些语言属于多个书写系统(例如Bodo可以写在孟加拉文或梵文的脚本中),因此在音译和本机布局之间,在短短几个月内就建立了57种新的输入法。

FST解码器的本质性质将支持完成所有的工作,预测,滑动打字和许多UI功能,无需额外的工作,从而使 Gboard能够从一开始就向印度用户提供丰富的体验,一个更智能的键盘。

总而言之,最近的工作将解码延迟降低了50%,将用户手动更正的字数减少了10%以上,能够为印度的22种官方语言提供音译支持,并启用了许多新功能。

虽然谷歌团队希望这些最近的变化能够改善用户的打字体验,但他们也同时认识到,在移动设备上打字的问题绝对不能算是解决了。 Gboard仍然会提出似乎不直观或低效用的建议,并且手势的解码建议仍然可能为人类永远不会选择的词语。 然而,该团队的工作为强大的机器智能算法的转变开辟了新的空间,谷歌正在积极探索为全球用户提供更有用的工具和产品。

via research.googleblog,雷锋网编译

Gboard输入法下载新高度!可比instagram

IT之家8月23日消息 Gboard是谷歌推出的一款输入法,也是Google Play商店最受欢迎的移动设备键盘应用之一。 现在这款应用在Google Play商店店的下载量已经突破了10亿次。

IT之家报道,10亿的下载量在Google Play商店中已经是比较罕见的了,没有多少应用程序能够取得这一成就。目前已经加入Google Play商店“10亿下载量俱乐部”的有Skype、Facebook Messenger、Instagram、谷歌相册等。

Gboard提供了多种语言支持,并具备滑行输入、语音输入、表情符号及GIF搜索以及翻译功能。在最近的更新中,Gboard输入法加入了如下新功能和特性:

  • 更实用的语言包下载内容

  • 改进了摩斯电码

  • Android TV 支持日语

  • 新增了 18 种支持的语言,包括:布里亚特语、下索布語、塞浦路斯希腊语、冈德语、客家话、康沃尔语、曼迪阿里语、西伯利亚鞑靼语、沙卡瓦蒂语、塔里什语和蒙达里语

谷歌输入帮助你通过人工智能选择最好的GIF地图

【手机中国新闻】近日,谷歌宣布开始安卓平台上的谷歌输入法将使用人工智能来推荐和对话相关的动图,表情和贴纸。该功能目前仅服务英语用户,其将在未来支持更多语言。“面对几千张表情和贴纸或者数不清的动图,从中找到一个合适的来表达‘我爱你’等你想要传达的讯息需要花费一定时间,”谷歌输入法产品领导Angana Ghosh表示。“该功能可以让你更快更便捷地在聊天中表达感受和展示个性,你将会看到一系列谷歌输入法认为你可能想要分享的动图,表情和贴纸。”

谷歌输入法(图片来自网络)

用户可以在输入法界面左下角找到人工智能的推荐,谷歌声称所有的运算过程都在设备上离线完成,其中收集使用的数据对你来说依旧是隐私的。动图推荐并非谷歌输入法唯一的人工智能组件。2017年6月,谷歌发布了借助机器学习匹配涂鸦和表情的特性,同时也翻新了谷歌键盘用于提升输入预测和正确率的AI模型。今年8月,它还发布了根据一个人相似度生成贴纸套装的人工智能工具。

它的翻译功能也收益于AI。3月,谷歌输入法新增了包括中文,韩文和刚果文在内的20种支持语言。根据谷歌的数据,目前它共支持超过300种语言,能够覆盖全世界74%的人口。

详细神经网络结构搜索(NAS)

雷锋网 AI 科技评论按:本文作者为东北大学自然语言处理实验室 2018 级研究生胡驰,他的研究方向包括神经网络结构搜索、自然语言处理。雷锋网 AI 科技评论经作者授权发表本文章。

近年来,深度学习的繁荣,尤其是神经网络的发展,颠覆了传统机器学习特征工程的时代,将人工智能的浪潮推到了历史最高点。然而,尽管各种神经网络模型层出不穷,但往往模型性能越高,对超参数的要求也越来越严格,稍有不同就无法复现论文的结果。而网络结构作为一种特殊的超参数,在深度学习整个环节中扮演着举足轻重的角色。在图像分类任务上大放异彩的 ResNet、在机器翻译任务上称霸的 Transformer 等网络结构无一不来自专家的精心设计。这些精细的网络结构的背后是深刻的理论研究和大量广泛的实验,这无疑给人们带来了新的挑战。

1. 经典的NAS方法

正如蒸汽机逐渐被电机取代一般,神经网络结构的设计,正在从手工设计转型为机器自动设计。这一进程的标志事件发生在2016年,Google发表论文Neural Architecture Search with Reinforcement Learning,他们使用强化学习进行神经网络结构搜索(NAS),并在图像分类和语言建模任务上超越了此前手工设计的网络。如图1所示,经典的NAS方法使用RNN作为控制器(controller)产生子网络(child network),再对子网络进行训练和评估,得到其网络性能(如准确率),最后更新控制器的参数。然而,子网络的性能是不可导的,我们无法直接对控制器进行优化,幸好有强化学习这一利器,学者们采用了策略梯度的方法直接更新控制器参数。

图1 经典NAS方法概览图

经典的NAS方法形式简单,并且取得了令人瞩目的效果,例如:在PTB语言建模任务上,NAS搜索出来的RNN模型击败了当时最先进的RHN网络,在测试集上取得了62.4的PPL(困惑度,越低越好)。然而受限于其离散优化的本质,这类方法有一个致命的缺点:太耗费计算资源了!例如,在CIFAR-10这么一个小数据集上进行搜索就需要800张GPU计算3到4周,受限于当时的深度学习框架,该论文甚至专门提出了基于参数服务器的分布式训练框架。如此巨大的算力需求实在是令人望洋兴叹,那有没有办法加速搜索,让NAS变得亲民呢?首先我们来思考一下NAS为何如此耗时,在NAS中,为了充分挖掘每个子网络的“潜力”,控制器每次采样一个子网络,都要初始化其网络权重从头训练,那每次采样不重新初始化是不是就能大大减少训练时间?为此,后面有人提出了ENAS,即Efficient NAS,顾名思义,其目的就是提高NAS的搜索效率。ENAS将搜索空间表示为一个有向无环图(DAG),其中的任一子图都代表了一个网络结构,每个节点代表了局部的计算,如矩阵乘法,而节点间的有向连接代表了信息的流动。所谓的权重共享,也就是不同的网络结构共享整个有向无环图节点上的参数。如图2所示,其中左边是一个有向无环图,假设红色的连接被控制器选中,我们就可以将其转换为右边的网络结构,其中包含4个计算节点,而输入输出是固定的节点,此外激活函数也是控制器选择出来的。ENAS提出的权重共享,极大地减少了搜索时间,使用一张GTX1080Ti只需10小时就可以完成在CIFAR-10上的搜索。

图2 ENAS中的有向无环图和对应的网络结构

2. NAS的发展现状

在NAS、ENAS提出后,相关论文如同雨后春笋一般出现,神经网络结构搜索已经成为了一大研究潮流。虽然方法层出不穷,但基本都包括这三大部分:1. 定义搜索空间; 2. 执行搜索策略采样网络; 3. 对采样的网络进行性能评估。接下来我们从这三个方面介绍NAS的发展现状。

搜索空间

搜索空间,即待搜索网络结构的候选集合。搜索空间大致分为全局搜索空间和基于细胞的搜索空间,前者代表搜索整个网络结构,后者只搜索一些小的结构,通过堆叠、拼接的方法组合成完整的大网络。如图3(a)所示,早期的NAS的搜索空间是链式结构,搜索的内容只是网络的层数、每层的类型和对应的超参数。而后受到ResNet等网络的启发,跳跃连接、分支结构也被引入了搜索空间中,如图3(b)所示。搜索空间的复杂程度决定了网络结构的潜力,最近的一些工作表明,精心设计的搜索空间可以大大提高网络性能的下限,换言之,在这些空间里进行随机搜索也能取得不错的效果。目前最先进的方法都得益于其适当的搜索空间,而且几乎都是类似于图4中的细胞结构,既减少了搜索代价,也提高了结构的可迁移性。

图3 全局搜索空间示意图

图4 基于细胞的搜索空间示意图

搜索策略

搜索策略,即如何在搜索空间中进行选择,根据方法的不同,搜索策略大致分为三种。

1. 基于强化学习的方法。强化学习被广泛应用于连续决策建模中,该方法通过智能体(agent)与环境交互,每次agent都会执行一些动作(action),并从环境中获得回馈,强化学习的目标就是让回馈最大化。NAS可以很自然地被建模为一个强化学习任务,最初的NAS使用RNN作为控制器来采样子网络,对子网络训练、评估后使用策略梯度方法更新RNN参数。这种方法简单可操作,易于理解和实现,然而基于策略梯度的优化效率是很低的,而且对子网络的采样优化会带来很大的变异性(策略梯度有时方差很大)。其实这也是无奈之举,RNN只能生成网络描述,因而无法通过模型的准确率直接对其进行优化。同样的策略也适用于各种其他的约束,如网络时延等各项衡量网络好坏的指标。

2. 基于进化算法的方法。进化算法的由来已久,该方法受生物种群进化启发,通过选择、重组和变异这三种操作实现优化问题的求解。Google在2017年的论文Large-Scale Evolution of Image Classifiers首次将进化算法应用于NAS任务,并在图像分类任务上取得了不错的成绩。该方法首先对网络结构进行编码,维护结构的集合(种群),从种群中挑选结构训练并评估,留下高性能网络而淘汰低性能网络。接下来通过预设定的结构变异操作形成新的候选,通过训练和评估后加入种群中,迭代该过程直到满足终止条件(如达到最大迭代次数或变异后的网络性能不再上升)。后续的论文Regularized Evolution for Image Classifier Architecture Search对这一方法进行了改进,为候选结构引入年代的概念(aging),即将整个种群放在一个队列中,新加入一个元素,就移除掉队首的元素,这样使得进化更趋于年轻化,也取得了网络性能上的突破。

3. 基于梯度的方法。前面的方法网络空间是离散的,它们都将NAS处理为黑盒优化问题,因而效率不尽人意。如果能将网络空间表示为连续分布,就能通过基于梯度的方法进行优化。CMU和Google的学者在DARTS: Differentiable Architecture Search一文中提出可微分结构搜索方法。该方法与ENAS相同,将网络空间表示为一个有向无环图,其关键是将节点连接和激活函数通过一种巧妙的表示组合成了一个矩阵,其中每个元素代表了连接和激活函数的权重,在搜索时使用了Softmax函数,这样就将搜索空间变成了连续空间,目标函数成为了可微函数。在搜索时,DARTS会遍历全部节点,使用节点上全部连接的加权进行计算,同时优化结构权重和网络权重。搜索结束后,选择权重最大的连接和激活函数,形成最终的网络,DARTS的整个搜索过程如图5所示。

图5 DARTS在搜索时不断优化结构权重,最终只保留一个子结构

此外中科大和微软发表的论文Neural Architecture Optimization中提出另一种基于梯度的方法,该方法基于经典的encode-decode框架。首先将网络结构映射到连续空间的表示(embedding),这个空间中的每一个点对应一个网络结构。在这个空间上可以定义准确率的预测函数,以它为目标函数进行基于梯度的优化,这样就可以对embedding进行优化。网络收敛后,再将这个表示映射回网络结构。这些方法与强化学习和进化算法相比,极大提高了搜索效率,在权重共享的情况下,单卡一天就能够完成搜索。

性能评估

性能评估,即在目标数据集上评估网络结构的性能好坏。上一节讨论的搜索策略旨在找到某些性能(如准确度)最高的网络,为了引导它们的搜索过程,这些策略需要考虑如何评判给定架构的性能高低。最简单的方法是在训练数据上训练每个子网络并评估其在测试数据上的表现,然而,从头训练这么多结构太过耗时。上面提到过,ENAS、DARTS和NAO都使用了权重共享来代替重新初始化,并大大加速了搜索过程。除此之外,还有别的方法吗?当然是有的,例如评估时使用数据集的一小部分、减少网络参数、训练更少的轮数或者预测网络训练的趋势等,这和充分的训练相比大大加快了速度,然而由于超参数的选择,这样会带来新的问题:我们无法公平地对比网络结构。例如,有的结构在训练早期性能突出,但最终不如其他的结构,这样就会错过最优的网络。

基于One-Shot的结构搜索是目前的主流方法,该方法将搜索空间定义为超级网络(supernet),全部网络结构都被包含其中。这个方法最显著的特征就是在一个过参数化的大网络中进行搜索,交替地训练网络权重和模型权重,最终只保留其中一个子结构,上面提到的DARTS和ENAS就是这一类方法的代表。该类方法的本质其实是对网络结构进行排序,然而不同的网络共享同一权重这一做法虽然大大提高搜索效率,却也带来了严重的偏置。显然,不同的神经网络不可能拥有相同的网络参数,在共享权重时,网络输出必定受到特定的激活函数和连接支配。ENAS和DARTS的搜索结果也反应了这一事实,如图6所示,其中ENAS搜索出来的激活函数全是ReLU和tanh,而DARTS搜索出来激活函数的几乎全是ReLU。此外,DARTS等方法在搜索时计算了全部的连接和激活函数,显存占用量很大,这也是它只能搜索较小的细胞结构的原因。

图6 ENAS(左)和DARTS(右)在PTB上搜索的RNN模型

最近的一些工作着眼于解决共享权重带来的偏置问题和超级图的高显存占用问题,并将新的搜索目标如网络延时、结构稀疏性引入NAS中。商汤研究院提出的随机神经网络结构搜索(SNAS)通过对NAS进行重新建模,从理论上绕过了基于强化学习的方法在完全延迟奖励中收敛速度慢的问题,直接通过梯度优化NAS的目标函数,保证了结果网络的网络参数可以直接使用。旷视研究院提出的Single Path One-Shot NAS与MIT学者提出的ProxylessNAS类似,都是基于One-Shot的方法,与DARTS相比,它们每次只探索一条或者两条网络路径,大大减少了显存消耗,从而可以搜索更大的网络。其中,SNAS将结构权重表示为一个连续且可分解的分布,而ProxylessNAS将二值化连接引入NAS中。这些方法的涌现还标志着NAS正在朝着多任务、多目标的方向前进。

3. NAS未来展望

目前NAS搜索的网络都是比较简单的节点和激活函数的排列组合,尽管在一些任务上性能表现突出,但仍离不开繁琐的超参数选择。个人认为未来NAS技术的发展趋势有这几点:

1. 网络设计自动化:真正做到把数据丢给机器,直接获得最优的模型,而不是依赖众多超参数。谷歌、阿里巴巴等巨头都早已推出了AutoML的云服务产品,实现了随机搜索、进化算法和网格搜索等方法,在一定程度上达到了超参数选择的自动化,但不能为网络设计带来新的灵感。

2. 多目标搜索:根据不同任务,朝着多目标的方向继续前进。这和模型的应用场景是息息相关的,例如目前手机端的模型一般都是对特定模型进行剪枝或低精度化实现,而ProxylessNAS等方法将网络时延、稀疏性纳入搜索考虑的指标,提出了针对不同平台的结构搜索,使得这些工作逐渐转型为自动化设计。不难预见,未来还会有更多的NAS工作聚焦于其他的搜索目标。

3. 大规模搜索:直接在大规模数据集上进行搜索,而不仅仅是在几个小型数据集上搜索、强化手工设计的网络。要实现这个目标,需要在搜索空间的定义、搜索策略的制定和性能评估方法的选择上取得关键性的突破。2019年初CMU学者的一篇论文Random Search and Reproducibility for Neural Architecture Search就给此前的各类NAS方法泼了一盆冷水,该论文证明了在使用权重共享的情况下,随机搜索可以打败ENAS、DARTS等一系列强劲的方法。

4. 拓展应用领域:尽管NAS在图像分类、目标检测和语义分割等图像和视觉领域表现突出,但自然语言处理领域方面的工作寥寥无几,现有的方法主要集中在语言建模任务,而目前Transformer及其变种在语言模型的王者地位依然无人动摇。

相关资料

1. Zoph, B., & Le, Q.V. (2017). Neural Architecture Search with Reinforcement Learning. ArXiv, abs/1611.01578.

2. Pham, H., Guan, M.Y., Zoph, B., Le, Q.V., & Dean, J. (2018). Efficient Neural Architecture Search via Parameter Sharing. ArXiv, abs/1802.03268.

3. Liu, H., Simonyan, K., & Yang, Y. (2019). DARTS: Differentiable Architecture Search. ArXiv, abs/1806.09055.

4. Xie, S., Zheng, H., Liu, C., & Lin, L. (2019). SNAS: Stochastic Neural Architecture Search. ArXiv, abs/1812.09926.

5. Guo, Z., Zhang, X., Mu, H., Heng, W., Liu, Z., Wei, Y., & Sun, J. (2019). Single Path One-Shot Neural Architecture Search with Uniform Sampling. ArXiv, abs/1904.00420.

6. Cai, H., Zhu, L., & Han, S. (2019). ProxylessNAS: Direct Neural Architecture Search on Target Task and Hardware. ArXiv, abs/1812.00332.

7. Real, E., Aggarwal, A., Huang, Y., & Le, Q.V. (2018). Regularized Evolution for Image Classifier Architecture Search. ArXiv, abs/1802.01548.

8. Real, E., Moore, S., Selle, A., Saxena, S., Suematsu, Y.L., Tan, J.Y., Le, Q.V., & Kurakin, A. (2017). Large-Scale Evolution of Image Classifiers. ICML.

9. Wistuba, M., Rawat, A., & Pedapati, T. (2019). A Survey on Neural Architecture Search. ArXiv, abs/1905.01392.

10. Li, L., & Talwalkar, A. (2019). Random Search and Reproducibility for Neural Architecture Search. ArXiv, abs/1902.07638.

作者单位信息:

东北大学自然语言处理实验室由姚天顺教授创建于 1980 年,现由朱靖波教授领导,长期从事计算语言学的相关研究工作,主要包括机器翻译、语言分析、文本挖掘等。