摘要:本文将介绍如何使用录音文件识别极速版给无字幕视频自动生成字幕。
本文分享自华为云社区《利用录音文件极速版为视频生成字幕》,作者:戈兀。
越来越多的人们使用抖音、B站等视频app,记录、分享日常生活,随之互联网上产生了大量的长、短视频。字幕是影响视频观看体验的重要因素。以日常分享为主的视频创作者往往没有时间为视频制作字幕,在创作者发音不清楚的前提下,没有字幕的视频可能会让观众困惑甚至产生理解偏差。而带字幕的视频让观众有更好的观看体验,“一气呵成”顺畅地看完。
语音识别技术(Automatic Speech Recognition)是一种将人的语音转换为文本的技术。随着深度学习的发展,端到端语音识别技术也取得了巨大的突破。将原始的音频数据,经过分帧、加窗、FFT等操作后,得到描述音频在时、频域信息的梅尔特征或是Fbank特征。将特征送入transformer等神经网络,输出对应的文本信息。此外,由大量文本训练的语言模型(language model)能够纠正语音识别输出文本不通顺的问题,改善阅读体验。而热词技术也被用来解决语音识别的领域适配问题,如同音不同字。
本文将介绍如何使用录音文件识别极速版给无字幕视频自动生成字幕。
录音文件识别极速版采用同步接口,利用GPU加速模型的推理过程。对于两个小时内的音、视频文件,可以在1分钟内返回识别结果,满足准实时字幕、音频质检等对识别速度有要求的场景。感兴趣的读者可以点击录音文件识别极速版文档,了解详情。
注:本文同步发布至华为云AI Gallery Notebook,可以在AI Gallery上运行:利用录音文件极速版为视频生成字幕
给无字幕视频生成字幕,就是从视频中的提取音频流,将音频流送入录音文件识别极速版,得到识别文字,和对应的时间戳信息。然后将其转换为视频字幕文件格式,如srt文件。得到srt字幕文件后,在播放视频时,载入字幕文件,就可以看到字幕了。
因此,整个流程如下:
1、利用ffmpeg工具,从视频中提取音频流
2、设置适合的参数,使用录音文件识别极速版,催音频文件进行识别
3、对识别结果,包括文字和时间戳信息,进行处理,得到视频字幕文件
4、将命名相同的视频文件与 srt 文件放在同一目录下,用播放器打开,即可得到有字幕的视频。或者利用ffmpeg,以硬字幕的形式,将字幕嵌入到视频中。
注:SRT(SubRip 文件格式)是以 SubRip 文件格式保存的简单字幕文件,扩展名为 .srt。每个字幕在 SRT 文件中有四个部分:
采用ffmpeg从视频文件中提取音频流,并保存为音频文件output.wav
ffmpeg -i input.mp4 -ar 16000 -ac 1 output.wav
-ar指定保存音频文件的采样率,这里16000表示1秒钟,保存16000个采样点数据;-ac指定保存音频的通道数,这里1表示保存为单通道音频。
在安装python3后,用pip安装其他依赖依赖包
pip install setuptools
pip install requests
pip install websocket-client
下载最新版python sdk源码:http://sis-sdk-repository.obs.cn-north-1.myhuaweicloud.com/python/huaweicloud-python-sdk-sis-1.8.1.zip
进入下载的Python SDK目录,在setup.py所在层目录执行 python setup.py install 命令,完成SDK安装。
from huaweicloud_sis.client.flash_lasr_client import FlashLasrClient from huaweicloud_sis.bean.flash_lasr_request import FlashLasrRequest from huaweicloud_sis.exception.exceptions import ClientException from huaweicloud_sis.exception.exceptions import ServerException from huaweicloud_sis.bean.sis_config import SisConfig import json
config = SisConfig() config.set_connect_timeout(50) config.set_read_timeout(50) client = FlashLasrClient(ak=ak, sk=sk, region=region, project_id=project_id, sis_config=config)
asr_request = FlashLasrRequest() asr_request.set_obs_bucket_name(obs_bucket_name) # 设置存放音频的桶名,必选 asr_request.set_obs_object_key(obs_object_key) # 设置OBS桶中的对象的键值,必选 asr_request.set_audio_format(audio_format) # 音频格式,必选 asr_request.set_property(property) # property,比如:chinese_16k_conversation asr_request.set_add_punc('yes') asr_request.set_digit_norm('no') asr_request.set_need_word_info('yes') asr_request.set_first_channel_only('yes')
为视频产生字幕文件时,不仅需要文字,也需要文字对应的时间戳信息。当一句话过长,屏幕无法完整显示时,就需要对这句话进行切分。因此,仅仅根据每个句子的起始和截止时间,无法准确的确定切分后两句话的起始和截止时间。因此我们需要字级别的时间信息。而将need_word_info配置为‘yes’,就可以输出字级别的时间戳信息。如下:
"word_info": [ { "start_time": 590, "word": "哎", "end_time": 630 }, { "start_time": 830, "word": "大", "end_time": 870 }, { "start_time": 950, "word": "家", "end_time": 990 }, { "start_time": 1110, "word": "好", "end_time": 1150 }, ]
result = client.get_flash_lasr_result(asr_request)
"result": { "score": 0.9358551502227783, "word_info": [ { "start_time": 590, "word": "哎", "end_time": 630 }, { "start_time": 830, "word": "大", "end_time": 870 }, { "start_time": 950, "word": "家", "end_time": 990 }, { "start_time": 1110, "word": "好", "end_time": 1150 }, { "start_time": 1750, "word": "我", "end_time": 1790 }, { "start_time": 1910, "word": "是", "end_time": 1950 }, { "start_time": 2070, "word": "你", "end_time": 2110 }, { "start_time": 2190, "word": "们", "end_time": 2230 }, { "start_time": 2350, "word": "的", "end_time": 2390 }, { "start_time": 2870, "word": "音", "end_time": 2910 }, { "start_time": 3030, "word": "乐", "end_time": 3070 }, { "start_time": 3190, "word": "老", "end_time": 3230 }, { "start_time": 3350, "word": "师", "end_time": 3390 }, { "start_time": 3590, "word": "康", "end_time": 3630 }, { "start_time": 3750, "word": "老", "end_time": 3790 }, { "start_time": 3950, "word": "师", "end_time": 3990 }, { "start_time": 4830, "word": "那", "end_time": 4870 }, { "start_time": 4990, "word": "么", "end_time": 5030 }, { "start_time": 5350, "word": "这", "end_time": 5390 }, { "start_time": 5550, "word": "几", "end_time": 5590 }, { "start_time": 5750, "word": "系", "end_time": 5790 }, { "start_time": 5870, "word": "列", "end_time": 5910 }, { "start_time": 6070, "word": "呢", "end_time": 6110 }, { "start_time": 6310, "word": "我", "end_time": 6350 }, { "start_time": 6390, "word": "们", "end_time": 6470 }, { "start_time": 6510, "word": "来", "end_time": 6550 }, { "start_time": 6670, "word": "到", "end_time": 6710 }, { "start_time": 6830, "word": "了", "end_time": 6870 }, { "start_time": 7430, "word": "发", "end_time": 7470 }, { "start_time": 7630, "word": "声", "end_time": 7670 }, { "start_time": 7830, "word": "练", "end_time": 7870 }, { "start_time": 8030, "word": "习", "end_time": 8070 }, { "start_time": 8950, "word": "三", "end_time": 8990 }, { "start_time": 9190, "word": "十", "end_time": 9230 }, { "start_time": 9350, "word": "五", "end_time": 9390 }, { "start_time": 9470, "word": "讲", "end_time": 9510 } ], "text": "哎,大家好,我是你们的音乐老师康老师。那么这几系列呢,我们来到了发声练习三十五讲。" }, "start_time": 510, "end_time": 9640 }
由于视频播放界面的宽度有限,当一句话包含的文字数过多时,会存在一行放不下的问题。因此我们在生成srt文件时,需要将文字数量过长的一句话切分为两句话,分别在不同的时间段显示。企切分后的第一句话的起始时间不变,截止时间为最后一个字的截止时间;第二句话的起始时间为第一个字的起始时间,截止时间不变。这样就保证切分后两句话的时间戳也是正确的,进而在合适的视频帧中显示正确的文本内容。
def json2srt(json_result): results = "" count = 1 max_word_in_line = 15 min_word_in_line = 3 punc = ["。", "?", "!", ","] segments = json_result['flash_result'][0]['sentences'] for i in range(len(segments)): current_result = segments[i] current_sentence = current_result["result"]["text"] if len(current_result["result"]["word_info"]) > max_word_in_line: srt_result = "" srt_result_len = 0 current_segment = "" cnt = 0 start = True for i in range(len(current_sentence)): if current_sentence[i] not in punc: if start: start_time = current_result["result"]["word_info"][cnt]['start_time'] start = False else: end_time = current_result["result"]["word_info"][cnt]['end_time'] current_segment += current_sentence[i] srt_result_len += 1 cnt += 1 else: if srt_result_len < min_word_in_line: srt_result += current_segment + current_sentence[i] current_segment = "" else: srt_result += current_segment + current_sentence[i] current_segment = "" start_time = time_format(start_time) end_time = time_format(end_time) if srt_result[-1] == ",": srt_result = srt_result[:-1] results += str(count) + "\n" + start_time + "-->" + end_time + "\n" + srt_result + "\n" + "\n" count += 1 start = True srt_result = "" else: start_time = time_format(current_result["start_time"]) end_time = time_format(current_result["end_time"]) if current_sentence[-1] == ",": current_sentence = current_sentence[:-1] results += str(count) + "\n" + start_time + "-->" + end_time + "\n" + current_sentence + "\n" + "\n" count += 1 return results
得到srt格式的字幕文件
修改文件名,保证srt文件和原始视频文件命名相同,然后用播放器播放视频:
ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output_srt.mp4
注: 硬字幕是将字幕渲染到视频的纹理上,然后将其编码成独立于视频格式的一个完整视频。硬字幕与视频是一个整体,不能更改或删除。
点击关注,第一时间了解华为云新鲜技术~
在上一篇分享中,我们为大家罗列了几个简单、易上手的NFT制作工具,比如Opensea、NiftyInk等,基本算是有手就行~但对于更加专业的NFT玩家或者制作者来说,单张图的“傻瓜式”制作不足以满足他们的需求。他们更想制作类似BAYC或者CryptoPunks之类的系列NFT,并且还需要增加稀有度、可玩性等额外功能。*图源:网络 那么,接下来两类工具,你可以试一试~进阶版如果说傻瓜式制作已经满足不了你,但你又不是技术流玩家,那么你可以尝试算法合成类基础的NFT制作,比如使用NiftyGenerator、Artiva、GitHub合成软件、NFT画师助手等。这种工具制作出来的就是系列型的NFT。*图源:NiftyGenerator通过这一类的工具,创作者只需要创作NFT的不同部件或者说属性,然后通过算法进行随机合成来铸造NFT。但并不是所有的创作者同时也是程序员,所以就有了这类产品。*图源:NiftyGenerator以NiftyGenerator为例:铸造开始时,你会进入一个文件夹定义界面,需要对不同的文件夹进行定义,比如想要用算法合成1000个小人、小人由5个不同的元素构成。并在这些
机器之心专栏作者:网易互娱AILab网易互娱AILab提出了一种基于单幅图片的实时高分辨率人脸重演算法,分别在台式机GPU和手机端CPU上支持以实时帧率生成1440x1440和256×256分辨率的人脸重演图像。近年来,面部重演 (FaceReenactment) 技术因其在媒体、娱乐、虚拟现实等方面的应用前景而备受关注,其最直接的帮助就是能够帮助提升音视频的制作效率。 面部重演算法是一类以源人脸图像作为输入,可以将驱动人脸的面部表情和头部姿态迁移到源图像中,同时保证在迁移过程中源人脸的身份不变。相关技术在虚拟主播、视频会议等媒体和娱乐应用方面都具有巨大潜力。但现有算法往往计算复杂度较高,性能无法满足实时应用环境的要求。针对这一痛点,网易互娱AILab提出了一种基于单幅图片的实时高分辨率人脸重演算法,与已有SOTA方法相比,算法可以在保证结果质量的同时,最高可将算法速度提升至原来的9倍,分别在台式机GPU和手机端CPU上支持以实时帧率生成1440x1440和256×256分辨率的人脸重演图像。近日,网易互娱AILab与清华大学合作对该方案进行了系统性技术梳理,并撰写论文《:Real-T
Java单例模式推荐写法--双重检测机制实现单例双重检测机制不仅可以既线程安全问题,又解决懒加载问题,同时保证了效率。packagecom.joshua317.pattern; /** *推荐使用:双重检测机制实现单例模式 *既解决线程安全问题,又解决懒加载问题,同时保证了效率。 */ publicclassSingleton{ /** *定义静态属性使用volatile关键字 *volatile关键字修饰变量来解决无序写入产生的问题,因为volatile关键字的一个重要作用是即使在多线程环境下,也可以禁止指令重排序, *即保证不会出现内存分配、返回对象引用、初始化这样的顺序,从而使得双重检测真正发挥作用 */ privatestaticvolatileSingletoninstance; privateSingleton(){} publicstaticSingletongetInstance() { //第1次判断,做一般性检查,但是有并发隐患:可能有多执行流同时进入改处 if(instance==null){ /** *synchronized关键字 *代表这个方法加锁,相当
为什么使用深层网络对于人脸识别等应用,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息;网络的第二层将第一层学得的边缘信息组合起来,形成人脸的一些局部的特征,例如眼睛、嘴巴等;后面的几层逐步将上一层的特征组合起来,形成人脸的模样。随着神经网络层数的增加,特征也从原来的边缘逐步扩展为人脸的整体,由整体到局部,由简单到复杂。层数越多,那么模型学习的效果也就越精确。通过例子可以看到,随着神经网络的深度加深,模型能学习到更加复杂的问题,功能也更加强大。1.4.1深层神经网络表示1.4.1.1什么是深层网络?使用浅层网络的时候很多分类等问题得不到很好的解决,所以需要深层的网络。1.4.2四层网络的前向传播与反向传播在这里首先对每层的符号进行一个确定,我们设置L为第几层,n为每一层的个数,L=[L1,L2,L3,L4],n=[5,5,3,1]1.4.2.1前向传播首先还是以单个样本来进行表示,每层经过线性计算和激活函数两步计算z^{[1]}=W^{[1]}x+b^{[1]},a^{[1]}=g^{[1]}(z^{[1]})z[1]=W[1]x+b[1]
提示的错误信息如下:-bash:/usr/local/go/bin/go:cannotexecutebinaryfile:Execformaterror复制问题和解决出现上面问题的原因可能是你下载了不用架构的版本。RaspberryPi的CPU架构为ARM,如果你下载使用了X86架构的话,你的安装是没有办法运行的。进入go的下载界面:https://golang.org/dl 然后选择基于ARM架构版本。然后运行下面的命令进行安装。rm-rf/usr/local/go&&tar-C/usr/local-xzfgo1.16.4.linux-armv6l.tar.gz复制在安装完成后,需要参考官方的文档设置路径。可以编辑$HOME/.profile或/etc/profile文件,在这个文件的最后添加下面这句话:exportPATH=$PATH:/usr/local/go/bin复制然后再执行 source/etc/profile 命令,简单点,你也可以退出当前会话后重新登录。遇到的坑如果你的RaspberryPi版本不是非常新,你需要确定下CPU的版本。运行命令:cat/p
本文使用ZhihuOnVSCode创作并发布在训练GAN的过程中,一次只训练一个类别据说有助于模型收敛,但是PyTorch里面没有预设这种数据加载方式,要这样训练的话,需要自己定义Sampler,即自定义数据采样方式。下面是自定义的方法:首先,我们虚构一个Dataset类,用于测试。这个类中的label标签是混乱的,无法通过控制index范围来实现单类别训练。classData(Dataset): def__init__(self): self.img=torch.cat([torch.ones(2,2)foriinrange(100)],dim=0) self.num_classes=2 self.label=torch.tensor( [random.randint(0,self.num_classes-1)foriinrange(100)] ) def__getitem__(self,index): returnself.img[index],self.label[index] def__len__(self): returnlen(self.label)复制然后,自定义一个
本文经AI新媒体量子位(QbitAI)授权转载,转载请联系出处无论你使用的是Python、Java、Perl还是Shell,正则表达式是学习主流编程语言几乎绕不开的话题。有了它,就能帮你快速定位到符合筛选条件的文本内容。但对于初学者来说,有两座摆在面前的“大山”:一是正则表达式包含的符号种类非常多,如果只是死记硬背,学习起来会非常痛苦; 二是单独介绍正则表达式的中文图书资源非常少,而且存在介绍混乱的问题,不利于系统学习。现在GitHub上的有个2万星的项目learn-regex解决了初学者的困难。最近这个教程刚完成了汉化工作,还附有在线练习,帮助初学者快速入门正则表达式。 什么是正则表达式正则表达式(Regularexpression)是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。比如我们在网站中看到对用户名规则做出了如下限制:只能包含小写字母、数字、下划线和连字符,并且限制用户名长度在3~15个字符之间,如何验证一个用户名是否符合规则呢?我们使用以下正则表达式:以上的正则表达式可以接受john_doe、jo-hn_doe、john12_as,但不能匹
一个专门为生物信息专门开发的Linux系统:Bio-LinuxBio-Linux是功能齐全的、强大的、可定制的、易于维护的生物分析工作站。Bio-Linux基于Ubuntu提供500多个生物分析程序,由一个图形化的菜单进行管理,能方便地访问到其生物分析文档系统及对测试程序有用的样本数据。用于处理新型序列数据类型的Bio-Linux软件包可额外安装。Bio-Linux下载地址:http://environmentalomics.org/bio-linux-download/这里我们介绍虚拟机的安装,选择VirtualBox软件,因为VMWare虽然经典,但是收费呀,VirtualBox是一个不错的选择!VirtualBox下载地址:https://www.virtualbox.org/wiki/Downloads安装好VirtualBox后打开该软件>>>管理>>>导入虚拟电脑。然后选择刚刚下载的Bio-Linux系统文件,是ova格式的。点击:下一步设置好相应的参数,比如计算机名称,内存等等,建议内存2G!点击:导入导入需要一定时间。导入成功后左侧就
用C#在去中心化交易所OceanOne上挂单买卖任意ERC20token在上一课中,我们介绍了如何在OceanOne交易比特币。OceanOne支持交易任何MixinNetwork上的token,包括所有的ERC20和EOStoken,不需要任何手续和费用,直接挂单即可。下面介绍如何将将一个ERC20token挂上OceanOne交易。掌握了ERC20的代币买卖之后,你就可以用同样的方法买卖任何EOS以及其他MixinNetwork上的token此处我们用一个叫做Benz的ERC20token为例。这个token已经被充值进MixinNetwork,你可以在区块链浏览器看到这个token在MixinNetwork内部的总数和交易预备知识:先将Ben币存入你的钱包,然后使用getAssetsAPI读取它的UUID.取得该币的UUID调用getAssetsAPI会返回json数据,如:asset_id币的UUID.public_key该币的当前钱包的地址.symbol币的名称.如:Benz.if(cmd=="aw"){ //Console.WriteLine(mixin
web工程中如何将大量数据从服务器端传送到浏览器一直是很重要的一个问题。 其中一个解决方法是在服务器端将将数据封装成json格式,然后传给前台。废话不多说,下面讲干货。 1.要用json必须下载一个库和必须的依赖项。json-lib-2.3-jdk15.jar commons-beanutils-1.7.0.jar commons-httpclient-3.1.jar commons-lang-2.3.jar commons-logging-1.0.4.jar commons-collections-3.1.jar ezmorph-1.0.3.jar 这些包可以从一下地方下载: http://commons.apache.org/index.html http://json-lib.sourceforge.net/ http://ezmorph.sourceforge.net/ http://www.docjar.com/复制2.导入到eclipse/myeclopseweb工程中web-inf/lib中。3.java源代码中引用包,注意json有两种,一种是org.下的,一种是
我需要查找美国华盛顿市一座建筑物的资料,顺便就比较了一下互联网上的卫星地图服务。GoogleMaps当然是最出名的,除它以外,还有三个网站也提供卫星地图服务。它们分别是YahooMaps、Ask.comMaps和MicrosoftWindowsLiveLocal。我使用以后的感受是,对于最基本的地图需求--地理位置定位和地貌照片--这些网站都提供了。它们之间的差别主要是一些次要的方面,比如行车路线查询和手持设备支持。这些次要的功能,普通的中国用户基本都用不上,所以,如果想要查找卫星地图,上面4个网站都是可以考虑的。卫星地图很重要的一个指标是分辨率,我把4个网站的最大分辨率做了截图,大家自己比较吧。(1)YahooMaps(2)GoogleMaps(3)Ask.comMaps(4)MicrosoftWindowsLiveLocal除了正常的卫星地图以外,LiveLocal还提供45度角的航拍视图,效果很出色。
短版本:一个渗透测试人员探测?基于web的应用、网络、系统的安全漏洞。用另一种话说,就是你被付薪水来做合法hack。在这个很酷的工作,你将会使用一系列的渗透测试工具一些是预先决定的,一些事你自己设计的,来模拟真实生活中的网络攻击。你的最终目标就是帮助组织证明他们的安全性。渗透测试者的责任:合法的hacking是性感和无聊的部分的混合。不像真实世界的黑客,你可能只有几天的时间来侵入一个系统。甚至,你被期望说明和解释你的方法和你的发现。渗透测试被称作信息安全领域最令人沮丧的工作之一。总体来说,你可能被要求:执行一个常规渗透测试给基于web的程序网络以及计算机系统。给服务器系统网络设置进行一个物理性安全评估设计和创建一个新的渗透测试工具探测?web应用,客户端应用和标准协议的漏洞指出攻击者可能使用的方法来利用弱点和缺陷利用社会工程来揭露系统漏洞(脆弱的用户安全操作或密码策略)与之合作的公司的考虑(比如因停机而遭受的损失)与管理者、IT队伍研究、说明、议论安全发现检查和定义信息安全措施的要求。致力于提高安全服务,包括持续的提高现有的方法来支持评估提供回馈和评估为一个组织解决安全问题~在一个渗透
2022年8月26日,无锡数字鲸科技有限公司发布《无锡经开区智慧城市一期项目——一网统管平台及部分智慧应用》招标公告,合同估算价3578.93万元。2022年9月20日发布预中标结果公示:牵头人:京东智能城市(无锡)科技有限公司 成员:京东城市(北京)数字科技有限公司、京东城市(南通)科技有限公司、中电鸿信信息科技有限公司投标报价:3560.000000万元2022年8月26日,无锡数字鲸科技有限公司发布《无锡经开区智慧城市一期项目——数字底座-城市物联操作系统》招标公告,合同估算价3720.8万元。 招标范围:主要包括建设统一能力运营、中枢系统、物联能力中心、数据能力中心、视频能力中心、人工智能能力中心、应用支撑能力中心、容器云操作系统,并配套密码应用安全硬件等。 2022年9月20日发布预中标结果公示:牵头人:国电投远景智能科技(江苏)有限公司成员:上海远景科创智能科技有限公司、星环信息科技(上海)股份有限公司、中邮建技术有限公司投标报价:3700万元 相关阅读 ·浪潮1亿元智慧城市大单:被废
2022年10月28日,国务院办公厅发布《全国一体化政务大数据体系建设指南》(以下简称《指南》)。《指南》明确了全国一体化政务大数据体系的分阶段建设目标,有利于在全国构建标准统一、布局合理、管理协同、安全可靠的政务大数据体系,并不断发挥政务数据在提升政府履职能力、支撑数字政府建设以及推进国家治理体系和治理能力现代化中的重要作用。第一阶段目标是在全面摸清政务数据资源底数的基础上,初步建立政务大数据管理机制、标准规范、安全保障体系,立足于解决政务大数据体系的基本能力问题。第二阶段进一步完善这些能力:一是覆盖范围扩大,政务数据资源全部纳入目录管理,政务数据共享需求普遍满足;二是数据质量提升,一数一源、多源校核等数据治理机制基本形成,政务数据标准规范更加健全;三是管理安全高效,数据资源实现有序流通、高效配置,数据安全保障体系进一步完善;四是应用赋能显著,政务数据与社会数据融合应用水平大幅提升,大数据分析应用能力显著增强,有效支撑数字政府建设,推动经济社会可持续高质量发展。《指南》通过全局谋划、整体布局,提出了全国一体化政务大数据体系的总体架构,在继承现有的平台与系统的基础上,充分整合利用各地区
本文的最新内容将在GitHub上实时更新。欢迎在GitHub上关注我,一起入门和进阶前端。 前言 我周围的码农当中,有很多是技术大神,却常常被字体这种简单的东西所困扰。 这篇文章,我们来讲一讲关于字体的常识。这些常识所涉及到的问题,有很强的可操作性,都是在实际业务中真实遇到的,都是需要开发同学和产品经理、设计师不断重复沟通的。 字体真的只是“系统默认,无从解释”这么简单吗?是产品被忽悠?还是开发在敷衍?二者之间的博弈究竟谁能胜出?学会本文,你就能胜出。 字体分类 常见的字体可以分为两类:衬线体、无衬线体。 1、serif(衬线体):在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。 常见的衬线体有: 宋体、楷体 TimesNewRoman 2、sans-serif(无衬线体):笔划粗细基本一致,只剩下主干,造型简明有力,起源也很晚。适用于标题、广告等,识别性高。 常见的无衬线体有: 黑体 Windows平台默认的中文字体:微软雅黑(MicrosoftYahei) Windows平台默认的英文字体:Arial Mac&iOS平台默认的中文字体:
原文地址: MySQL数据库设置允许其他电脑访问(windows环境下)_Iloveyougirls的博客-CSDN博客_mysql允许其他机器访问 按照原文内容操作完成后,重启MySQL服务后,才可以正常访问哦。 以下内容为原文的复制内容。(原文连接丢失后可参考以下内容) 一、打开Windows的命令行窗口,用dos命令中的ping命令试一下两台电脑是否可以连接通;在命令行中输入:ping另一台电脑的IP地址; 二、如果可以用ping通,然后修改MySQL数据库;打开MySQL数据库中得user表; 把里面的Host字段改为%(允许所有人访问,localhost是本地访问),然后重启MySQL服务; 如果其他电脑链接你的数据库时出现错误: 说明,你的Windows防火墙阻止了其他电脑的访问,需要添加一条端口例外的情况; 三、在Windows防火墙中添加一条端口以外的情况;1,打开的控制面板中的Windows防火墙2,打开高级设置 3.点击左上角的入站规则,然后再单击右上角新建规则; 4,选择端口,然后下一步; 5,输入MySQ
同学一 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 我是田青正,初次接触计算机呢,是在我上六年级的时候,那时候应为还很懵懂,只知道在电脑上玩玩游戏之外,对计算机的运行原理的一概不知,在我读了高中,因为是选择了计算机专业,所以,我对计算机有了初步的认识,在老师叫教授中,我们学习了简单的计算机组装知识,计算机网络,和数据库,还有 visualbasic这门编程语言,才知道,计算机是多么的神奇,也特别好奇,为什么我输入几行简单的码,计算机就能给我反馈,这种简单的反馈给我提供了很多前进的动力,然后就到了大学,在大学,开始学习java这门编程语言,因为有高中语言的基础,这门语言入手很快,我学了很多,从简
因为项目中需要传输用户密码,为了安全需要用RSA加密,所以就学习了下RSA加密在iOS中的应用。 关于RSA的历史及原理,下面的两篇文章讲的很清楚了: http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html 简单来说,RSA建立在一个数学难题之上,就是大数分解:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难。至于为什么难,难在哪里那就是数学家的事了。。。 明白了这个就可以大致知道RSA的原理:非对称加密 (1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。 (2)甲方获取乙方的公钥,然后用它对信息加密。 (3)乙方得到加密后的信息,用私钥解密。 就好比有一套特殊的锁和钥匙,锁是公开的,谁都可以拿这个锁来锁住他的东西,只有有钥匙的人可以打开。 那么问题
一、回顾 1、keepalived:HACluster a、vrrp:vrrp_instance 虚拟路由器:物理路由器; VRID:VirutalRouterID; Master/Backup 一主一备或一主多备; priority 抢占模式/非抢占模式 b、ipvswrapper:通过ipvswrapper去完成调用内核中的ioctl桶系统调用,从而实现向ipvs上添加或管理规则。ipvswrapper的变动将取决于各种各样的checkers所获取的结果 checkers:对各vs的各RS做健康状态检测; 应用层检测:HTTP_GET,SSL_GET,SMTP_CHECK 传输层检测:TCP_CHECK 自定义检测:MISC_CHECK 二、使用keepalived+nginx 1、架构图 2、配置 a、主机规划: (1)、nginx1(node1):外网网卡:172.16.