闻其声而知雅意,基于Pytorch(mps/cpu/cuda)的人工智能AI本地语音识别库Whisper(Python3.10)

前文回溯,之前一篇:含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入),利用AI技术将文本合成语音,现在反过来,利用开源库Whisper再将语音转回文字,所谓闻其声而知雅意。

Whisper 是一个开源的语音识别库,它是由Facebook AI Research (FAIR)开发的,支持多种语言的语音识别。它使用了双向循环神经网络(bi-directional RNNs)来识别语音并将其转换为文本。 Whisper支持自定义模型,可以用于实现在线语音识别,并且具有高级的语音识别功能,支持语音识别中的语音活动检测和语音识别中的语音转文本。它是使用PyTorch进行开发,可以使用Python API来调用语音识别,并且提供了一系列的预训练模型和数据集来帮助用户开始使用。

PyTorch基于MPS的安装

我们知道PyTorch一直以来在M芯片的MacOs系统中都不支持cuda模式,而现在,新的MPS后端扩展了PyTorch生态系统并提供了现有的脚本功能来在 GPU上设置和运行操作。

截止本文发布,PyTorch与Python 3.11不兼容,所以我们将使用最新的 3.10.x 版本。

确保安装Python3.10最新版:

➜  transformers git:(stable) python3  
Python 3.10.9 (main, Dec 15 2022, 17:11:09) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin  
Type "help", "copyright", "credits" or "license" for more information.  
>>>

随后运行安装命令:

pip3 install --pre torch torchvision torchaudio --extra-index-url http://download.pytorch.org/whl/nightly/cpu

安装成功后,在终端里验证PyTorch-MPS的状态:

➜  transformers git:(stable) python3  
Python 3.10.9 (main, Dec 15 2022, 17:11:09) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import torch  
>>> torch.backends.mps.is_available()  
True  
>>>

返回True即可。

PyTorch MPS (Multi-Process Service)性能测试

PyTorch MPS (Multi-Process Service)是 PyTorch 中的一种分布式训练方式。它是基于Apple的MPS(Metal Performance Shaders) 框架开发的。MPS可以在多核的苹果设备上加速tensor的运算。MPS使用了多个设备上的多个核心来加速模型的训练。它可以将模型的计算过程分配到多个核心上,并且可以在多个设备上进行训练,从而提高训练速度。

PyTorch MPS 可以在 Apple 的设备(如 iPhone 和 iPad)上加速模型训练,也可以在 Mac 上使用。可以使用MPS来加速卷积神经网络(CNNs)、循环神经网络(RNNs)和其他类型的神经网络。使用MPS可以在不改变模型结构的情况下,通过分布式训练来加速模型的训练速度。

现在我们来做一个简单测试:

import torch  
import timeit  
import random  
  
x = torch.ones(50000000,device='cpu')  
print(timeit.timeit(lambda:x*random.randint(0,100),number=1))

首先创建一个大小为 50000000 的全为1的张量 x,并将其设置为在cpu上运算。最后使用 timeit.timeit 函数来测量在 CPU 上执行 x 乘以一个随机整数的时间。 number=1表示只运行一次。这段代码的作用是在cpu上测量运算一个张量的时间。

运行结果:

➜  nlp_chinese /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/nlp_chinese/mps_test.py"  
0.020812375005334616

在10核M1pro的cpu芯片加持下,运行时间为:0.020812375005334616

随后换成MPS模式:

import torch  
import timeit  
import random  
  
x = torch.ones(50000000,device='mps')  
print(timeit.timeit(lambda:x*random.randint(0,100),number=1))

程序返回:

➜  nlp_chinese /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/nlp_chinese/mps_test.py"  
0.003058041911572218

16核的GPU仅用时:0.003058041911572218

也就是说MPS的运行速度比CPU提升了7倍左右。

Whisper语音识别

安装好了PyTorch,我们安装Whisper:

pip install --upgrade --no-deps --force-reinstall git+http://github.com/openai/whisper.git

安装好之后进行验证:

➜  transformers git:(stable) whisper     
usage: whisper [-h] [--model {tiny.en,tiny,base.en,base,small.en,small,medium.en,medium,large}] [--model_dir MODEL_DIR]  
               [--device DEVICE] [--output_dir OUTPUT_DIR] [--verbose VERBOSE] [--task {transcribe,translate}]  
               [--language {af,am,ar,as,az,ba,be,bg,bn,bo,br,bs,ca,cs,cy,da,de,el,en,es,et,eu,fa,fi,fo,fr,gl,gu,ha,haw,hi,hr,ht,hu,hy,id,is,it,iw,ja,jw,ka,kk,km,kn,ko,la,lb,ln,lo,lt,lv,mg,mi,mk,ml,mn,mr,ms,mt,my,ne,nl,nn,no,oc,pa,pl,ps,pt,ro,ru,sa,sd,si,sk,sl,sn,so,sq,sr,su,sv,sw,ta,te,tg,th,tk,tl,tr,tt,uk,ur,uz,vi,yi,yo,zh,Afrikaans,Albanian,Amharic,Arabic,Armenian,Assamese,Azerbaijani,Bashkir,Basque,Belarusian,Bengali,Bosnian,Breton,Bulgarian,Burmese,Castilian,Catalan,Chinese,Croatian,Czech,Danish,Dutch,English,Estonian,Faroese,Finnish,Flemish,French,Galician,Georgian,German,Greek,Gujarati,Haitian,Haitian Creole,Hausa,Hawaiian,Hebrew,Hindi,Hungarian,Icelandic,Indonesian,Italian,Japanese,Javanese,Kannada,Kazakh,Khmer,Korean,Lao,Latin,Latvian,Letzeburgesch,Lingala,Lithuanian,Luxembourgish,Macedonian,Malagasy,Malay,Malayalam,Maltese,Maori,Marathi,Moldavian,Moldovan,Mongolian,Myanmar,Nepali,Norwegian,Nynorsk,Occitan,Panjabi,Pashto,Persian,Polish,Portuguese,Punjabi,Pushto,Romanian,Russian,Sanskrit,Serbian,Shona,Sindhi,Sinhala,Sinhalese,Slovak,Slovenian,Somali,Spanish,Sundanese,Swahili,Swedish,Tagalog,Tajik,Tamil,Tatar,Telugu,Thai,Tibetan,Turkish,Turkmen,Ukrainian,Urdu,Uzbek,Valencian,Vietnamese,Welsh,Yiddish,Yoruba}]

随后安装ffmpeg:

brew install ffmpeg

然后编写语音识别代码:

import whisper  
  
model = whisper.load_model("small")  
  
# load audio and pad/trim it to fit 30 seconds  
audio = whisper.load_audio("/Users/liuyue/wodfan/work/mydemo/b1.wav")  
audio = whisper.pad_or_trim(audio)  
  
# make log-Mel spectrogram and move to the same device as the model  
  
mel = whisper.log_mel_spectrogram(audio).to("cpu")  
  
# detect the spoken language  
_, probs = model.detect_language(mel)  
print(f"Detected language: {max(probs, key=probs.get)}")  
  
# decode the audio  
options = whisper.DecodingOptions(fp16 = False)  
result = whisper.decode(model, mel, options)  
  
# print the recognized text  
print(result.text)

这里导入音频后,通过whisper.log_mel_spectrogram方法自动检测语言,然后输出文本:

➜  minGPT git:(master) ✗ /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/minGPT/wisper_test.py"  
Detected language: zh  
Hello大家好,这里是刘悦的技术博客,众神殿内,高朋满座,圣有如云,VMware,Virtual Box,UPM等虚拟机大神群英汇翠,指见位于C位王座上的Parallels唱网抬头,缓缓群寻,屁腻群小,目光到处,无人敢抬头对视。是的,如果说虚拟机领域有一位王者,非Parallels不能领袖群伦,毕竟大厂背书,功能满格,美中不足之处就是价格略高,

这里使用的small模型,也可以用更大的模型比如:medium、large。模型越大,效果越好。

如果想使用MPS的方式,需要改写一下Whisper源码,将load_model方法的参数改为mps即可:

def load_model(name: str, device: Optional[Union[str, torch.device]] = None, download_root: str = None, in_memory: bool = False) -> Whisper:  
    """  
    Load a Whisper ASR model  
  
    Parameters  
    ----------  
    name : str  
        one of the official model names listed by `whisper.available_models()`, or  
        path to a model checkpoint containing the model dimensions and the model state_dict.  
    device : Union[str, torch.device]  
        the PyTorch device to put the model into  
    download_root: str  
        path to download the model files; by default, it uses "~/.cache/whisper"  
    in_memory: bool  
        whether to preload the model weights into host memory  
  
    Returns  
    -------  
    model : Whisper  
        The Whisper ASR model instance  
    """  
  
    if device is None:  
        device = "cuda" if torch.cuda.is_available() else "mps"

代码在第18行。

随后运行脚本也改成mps:

import whisper  
  
model = whisper.load_model("medium")  
  
# load audio and pad/trim it to fit 30 seconds  
audio = whisper.load_audio("/Users/liuyue/wodfan/work/mydemo/b1.wav")  
audio = whisper.pad_or_trim(audio)  
  
# make log-Mel spectrogram and move to the same device as the model  
  
mel = whisper.log_mel_spectrogram(audio).to("mps")  
  
# detect the spoken language  
_, probs = model.detect_language(mel)  
print(f"Detected language: {max(probs, key=probs.get)}")  
  
# decode the audio  
options = whisper.DecodingOptions(fp16 = False)  
result = whisper.decode(model, mel, options)  
  
# print the recognized text  
print(result.text)

这回切换为medium模型,程序返回:

➜  minGPT git:(master) ✗ /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/minGPT/wisper_test.py"  
100%|█████████████████████████████████████| 1.42G/1.42G [02:34<00:00, 9.90MiB/s]  
Detected language: zh  
Hello 大家好,这里是刘悦的技术博客,众神殿内,高朋满座,圣有如云,VMware,Virtualbox,UTM等虚拟机大神群音惠翠,只见位于C位王座上的Parallels唱往抬头,缓缓轻寻,屁逆群小,目光到处,无人敢抬头对视。

效率和精准度提升了不少,但medium模型的体积也更大,达到了1.42g。

结语

Whisper作为一个开源的语音识别库,支持多种语言,并且使用双向循环神经网络(bi-directional RNNs)来识别语音并将其转换为文本,支持自定义模型,可以用于实现在线语音识别,并且具有高级的语音识别功能,支持语音识别中的语音活动检测和语音识别中的语音转文本,在PyTorch的MPS加成下,更是猛虎添翼,绝世好库,值得拥有。

本文转载于网络 如有侵权请联系删除

相关文章

  • IP (定位数据库)地理位置查找真的能有效帮助阻止网络攻击吗?

    网络攻击可以袭击任何组织,甚至大规模破坏其运作。就在最近,设施管理服务提供商ISSWorld发布了一份声明,其中提到自己是恶意软件攻击的受害者。ISSWorld的客户遍布全球70多个国家。ISSWorld还声称已经控制了袭击,并确定了威胁的根源。总之,ISSWorld是幸运的,因为它能够相当快地解决这个问题。在某些情况下,受影响的组织可能需要数周或更长时间才能挫败复杂的攻击。通常,在发现威胁源之前,这些事件已经危及受害者的整个行动一段时间。这就是网络安全专家强调主动防御重要性的主要原因。公司不仅需要保护其运营,还需要保护其客户和员工免受网络攻击的破坏性影响。确保操作顺利无阻碍的一种方法是,在允许使用IP地理定位API等解决方案访问网络之前,仔细检查每个连接的IP地址。IP地址屏蔽如何帮助用户抵御网络攻击?经营一家全球性公司意味着来自世界任何地方的任何人都可以通过其网络与员工沟通。但并非所有所谓的“全球组织”都在每个国家从事商业交易。也就是说,安全团队可以限制来自和前往他们不开展业务的国家的访问。例如,一家只在亚太地区、欧洲和美国运营的公司可以避免来自中东的威胁,至少通过仔细检查与该地区

  • 【STM32H7的DSP教程】第41章 FIR滤波器的群延迟(重要)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547第41章FIR滤波器的群延迟(重要)本章节为大家介绍FIR滤波器的群延迟问题。41.1FIR滤波器介绍41.2总结41.1FIR滤波后的群延迟波形经过FIR滤波器后,输出的波形会有一定的延迟。对于线性相位的FIR,这个群延迟就是一个常数。但是实际应用中这个群延迟是多少呢?关于群延迟的数值,filterDesigner工具箱会根据用户的配置计算好。比如前面章节设计的28阶FIR高通,低通,带通和带阻滤波器的群延迟就是14,反映在实际的采样值上就是滤波后输出数据的第15个才是实际滤波后的波形数据起始点。下面是群延迟采样点的位置:细心的读者可能发现全面做低通,高通,带通和带阻滤波后,输出的波形前面几个点感觉有问题,其实就是群延迟造成的。为了更好的说明这个问题,下面再使用Matlab举一个低通和一个高通滤波的例子:信号由50Hz正弦波和200Hz正弦波组成,采样率1Kbps,截止频率125Hz,采样320个数据,采用函数fir1进行设计,滤波器阶数设置为28

  • 【NLP】NER数据标注中的标签一致性验证

    最近看到一篇论文,是探讨关于NER数据标注中标签一致性问题的。数据标注在建立基准和确保使用正确的信息来学习NER模型方面起着至关重要的作用。要想获得准确的标签,不仅需要时间还需要专业知识。然而标签错误又几乎是无法避免的,错误的标签会导致标注数据子集(例如,训练集和测试集,或多个训练子集)之间的标签不一致。标签的不一致性是影响NER任务性能提升的因素之一,比如在被引用超过2300次的标准NER基准CoNLL03数据集中,发现测试集中有5.38%的标签错误,当对其中的错误标签进行纠正后,相比于原始测试集得到的结果更加准确和稳定。标签的一致性验证需要解决两个关键问题:1)如何识别标注的数据子集之间的标签不一致?2)如何验证纠正后的标签一致性得到恢复?1标签不一致性示例如下表所示,三个示例是用于比较SCIERC数据集的测试集中原始标注和校正后的标注。其中前两个是具有错误的实体类型,第三个是具有错误的实体边界。像前两个示例中的实体标记,如果在标注过程中始终遵循用于标注训练数据的“codebook”,那么一定能够将前两个示例中的实体标记为“Task”,而非“Method”。2 标签不一致性识别如下

  • 在剪贴板上读取/写入数据,太方便了吧!

    朱小五:一只不务正业的数据狗大家好,我是小五?Pandas是基于NumPy的一种工具,也是我们解决数据分析问题的左膀右臂。说起处理数据,就离不开导入导出,而我们使用Pandas时候最常用的就是read_excel、read_csv了。不过我们有时候只想用一些“小数据”来验证一些问题/新知识点,那么为此还要创建一个一个excel、csv文件,就有点大费周章了。今天小五要给大家介绍一种轻便的方法——在剪贴板上读取/写入数据。读取剪贴板上的数据先给大家介绍pandas.read_clipboard,从剪贴板上读取数据。官方介绍其中参数sep是字段定界符,默认为'\s+',也就是说将tab和多个空格都当成一样的分隔符。光说不练假姿势,录个gif给大家演示一下:上图中Excel有很多行,我们只想读取其中几行,那就选中→Ctrl+C复制→再执行以下代码importpandasaspd df=pd.read_clipboard()#读取剪切板中的数据 df 复制这样就轻松导入了刚刚选中的几行数据df。但这种情况比较极端,只是为了方便展示(毕竟都有Excel了,这不是脱裤子**嘛)

  • 电子商务数据分析

    通过具体的项目案例,学习面对数据和业务问题,如何去展开分析。下面是社群会员的作业,本文最后会给出项目的修改意见,通过本项目提高你的分析思维。​ 1.平台销售情况1)交易额度信息2)订单变化量3)客单价:4)不同产品类的订单情况2.物流交付表现在此项中,只统计已成功配送至客户手中的订单。不计算尚未发货或取消发货的订单3.用户信息1)各州订单量及用户地域分布2)用户评价平台满意度打分情况如何,利用描述统计分析来表示得分概况及随时间变化的趋势3)分析1-2分客户评论内容(词云图展示)4)消费分组情况+付款方式占比五.分析总结和建议1.平台本身的销售额与订单量年度增长明显。但是从季度与月度情况细分下来看,目前处于增长缓慢的状态,需要及时的调整,获取未处于热图区域的用户。另外,低消费人群庞大,但高消费人群的消费也需要平台方的引导,高消费人群的上升空间还有很高。2.物流交付情况不乐观,是因为运费价格稍高,用户付出高价的运费却享受不到与之匹配的配送服务,导致1-2分的评价上升明显。平台对于物流方的运营需要共同探讨对策并及时调整。3.客户满意度略微下降,主要集中在三个方向:1)产品本身的质量问题,平台

  • Spring Cloud OAuth 微服务内部Token传递的源码实现解析

    背景分析1.客户端携带认证中心发放的token,请求资源服务器A(SpringSecurityOAuth发放Token源码解析)2.客户端携带令牌直接访问资源服务器,资源服务器通过对token的校验(SpringCloudOAuth2资源服务器CheckToken源码解析 )判断用户的合法性,并保存到上下文中3.A服务接口接收到请求,需要通过Feign或者其他RPC框架调用B服务来组装返回数据本文主要来探讨第三部A-->B,token自定维护的源码实现如何实现token传递配置OAuth2FeignRequestInterceptor即可此类是Feign的拦截器实现@Bean @ConditionalOnProperty("security.oauth2.client.client-id") publicRequestInterceptoroauth2FeignRequestInterceptor(OAuth2ClientContextoAuth2ClientContext, OAuth2ProtectedResourceDetai

  • 计算机网络【开山篇】

    前言今天推送了计算机网络的文章,这部分我在最初是没有打算发出来的。最近在看相关面经时,发现对于计算机网络的考察还是挺多的。于是就看回这些曾经做过的笔记复习了一下。这些文章是我在学校学习计算机网络课程的时候做的笔记(摘录),参考于谢希仁的计算机网络此部分文章不会发到各个博客平台,有兴趣的同学可以简单浏览一下(….一、三网融合大众熟悉的三大类网络有:电信网络:提供电话、电报及传真等服务;有线电视网络:向用户传送各种电视节目;计算机网络:使用户能在计算机之间传送数据文件;随着技术的发展,网络技术相互融合:电信网络和有线电视网络都逐渐融入了现代计算机网络技术,扩大了原有的服务范围;计算机网络也能够向用户提供电话通信、视频通信以及传送视频节目的服务。电信网络、有线电视网络、计算机网络三类网络互相融合为一个网络就被称之为三网融合二、互连网与互联网相关概念互连网:指在局部范围互连起来的计算机网络。 互联网:指当今世界上最大的计算机网络。Internet。三、互联网基本特点连通性(connectivity)好像彼此的计算机相互连通共享(Sharing)资源共享3.1互联网的两种通信方式客户服务器方式(

  • 揭秘:为什么数据科学家都钟情于这个“错误”的正态分布?

    导读:“所有模型都是错的,但有些是有用的”——GeorgeBox对于深度学习和机器学习工程师们来说,正态分布是世界上所有概率模型中最重要的一个。即使你没有参与过任何人工智能项目,也一定遇到过高斯模型,今天就让我们来看看高斯过程为什么这么受欢迎。编译:JonyKai、元元、云舟来源:大数据文摘(ID:BigDataDigest)高斯分布(Gaussiandistribution),也称正态分布,最早由A.棣莫弗在求二项分布的渐近公式中得到。C.F.高斯在研究测量误差时从另一个角度导出了它。P.S.拉普拉斯和高斯研究了它的性质。是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟形曲线。若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ=0,σ=1时的正态分布是标准正态分布。▲高斯概率分布的数学表达式01在自然现象中随处可见所有模型都是错的,但有些是有用的 ——Geor

  • 清除浮动的方法

    本章主要介绍三种常用的清除浮动的方法,主要包括:[1]增加一个空div,使用clear:both将浮动元素"挤到"父元素中[2]在父元素里增加overflow:hidden[3]使用伪类:after(推荐)清除浮动,其实就是清除元素被定义浮动之后带来的脱离文档流的影响。如果我们不想浮动元素后面的文字环绕着它,而是希望后面的元素回归到正常文档流时候的布局,这个时候我们可以使用清除浮动来实现。如果父元素不设置高度,并且没有使用清除浮动,浮动的子元素就无法填入到父元素中,造成父元素高度塌陷。高度的塌陷使我们页面后面的布局不能正常显示。<!DOCTYPEhtml> <html> <head> <title>清除浮动</title> <metacharset="utf-8"> </head> <styletype="text/css"> /*方法1:增加一个空div,将浮动元素"挤到"父元素中*/ .div1{ width

  • 教你写一个云上Hello world小程序

    小程序上线一月有余,有不少创业团队如朝夕日历、小睡眠、小密圈等工具性的应用享受了这一波产品红利,收获了数十万新用户。笔者近期接触了不少从事后端开发的Java、C++程序员,纷纷表示了想要了解小程序开发技术的兴趣。下面,结合一个Helloworld的小程序示例,给大家简单讲解一下如何在腾讯云上开发一个简单的小程序demo,小程序示例的完成结果如下:1.HelloWorld小程序代码结构app.js定义了小程序的启动逻辑app.json定义了小程序的页面结构,目前我们的小程序只有一个index页面index.wxml定义了欢迎页面的有什么,目前我们放了一张gif、一个按钮和一个文字标签。index.wxss定义了欢迎页面的样式index.js定义了欢迎页面的业务逻辑2.小程序用到的组件与云服务腾讯云CVM:https://www.qcloud.com/product/cvm腾讯云Mysql:https://www.qcloud.com/product/cdbXMP.JS:https://git.oschina.net/xpmjs/xpmjs3.前端代码//app.jsApp({ onLau

  • kubernetes安装及集群搭建

    k8s安装kubernetes官网安装环境不支持centos8的系统IP服务硬件要求192.168.2.10(node1)Docker(已安装)、kubernetes内存4G,双核CPU192.168.2.20(node2)Docker(已安装)、kubernetes内存4G,双核CPU192.168.2.30(node3)Docker(已安装)、kubernetes内存4G,双核CPU安装步骤环境准备 为了修改文件传输文件的方便,将主机名更改为安装环境所述的node,并写入hosts文件ssh设置node1[root@localhost~]#vim/etc/hosts 192.168.2.10node1 192.168.2.20node2 192.168.2.30node3复制ssh免密方便传输文件node1[root@localhost~]#ssh-keygen [root@localhost~]#ssh-copy-id-iroot@node2 [root@localhost~]#ssh-copy-id-iroot@node3复制传输hosts文件[root@localhost~]

  • 2019年高级Java程序员面试题汇总

    目录JDKDubboZookeeperStrut2Spring系列Redis系列Mysql系列Java多线程消息中间件线程池事物JVM设计模式其他程序设计基础知识编程题面试技术外的问题 引言:随着金九银十的到来,回首在经历了两周的跳槽求职路后,终于成功拿到offer,距今已经入职快一个月了,因此,这几天抽空将之前的面试题做了个汇总,一方面自己以后回顾学习用,一方面为大家奉送上一份秋收的福利。 JDK jdk1.8版本后的新特性有哪些? 如何避免空指针异常? Dubbo Dubbo是什么? Dubbo和SpringCloud有什么区别? dubbo都支持什么协议,推荐用哪种? Dubbo需要Web容器吗? Dubbo内置了哪几种服务容器? Dubbo里面有哪几种节点角色? Dubbo的服务注册与发现的流程图是怎样的? Dubbo默认使用什么注册中心,还有别的选择吗? Dubbo有哪几种配置方式? Dubbo核心的配置有哪些? Dubbo启动时如果依赖的服务不可用会怎样? Dubbo推荐使用什么序列化框架,你知道的还有哪些? Dubbo默认使用的是什么通信框架,还有别的选择吗?

  • 端口映射

      有机器不能直接访问其他网段的服务器,需要用台机器做“跳板”。特记录windows及centos下的操作。   场景如下:在SRV_a上设置端口映射后,client通过访问SRV_a的port1端口即可达到访问SRV_b的port2的目的。所有操作均在SRV_a上。 windows:需要开启路由服务。通过netsh命令进行设置: 添加映射:netshinterfaceportproxyaddv4tov4listenaddress=0.0.0.0(或SRV_a)listenport=port1connectaddress=SRV_bconnectport=port2 删除映射:netshinterfaceportproxydeletev4tov4listenaddress=0.0.0.0(或者SRV_a)listenport=port1 查看映射:netshinterfaceportproxyshowall 补充说明:必须增加路由服务的角色,同时必须保证IPHelper服务是启动的(如果禁用,会出现一切命令正常,但始终没有端口侦听,netstat-na看不到listenport)。

  • IP/TCP/UDP/RTP/RTCP 包结构图

    http://blog.csdn.net/cosmoslife/article/details/7654056 IP包头结构:     TCP 包头结构: UDP 包头结构:    RTP 包头结构: RTCP包头结构:    

  • [ZJOI2006]物流运输

    TimeLimit:10Sec  MemoryLimit:162MBSubmit:8278  Solved:3486 Description   物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转 停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种 因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是 修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本 尽可能地小。 Input   第一行是四个整数n(1<=n<=100)、m(1<=m<=20)、K和e。n表示货物运输所需天数,m表示码头总数,K表示 每次修改运输路线所需成本。接下来e行每行是一条航线描述,包括了三个整数,依次表示航线连接的两个码头编 号以及航线长度(>0)。其中码头A编号为1,码头B编号为m。单位长度的运输费用为1。航线是双向的。再接下来 一行是一

  • browserCaps与浏览器功能设置

    使用Web.config文件中的browserCaps元素来定义浏览器的行为在.NETFramework2.0中被否决,但仍受支持。此元素中的数据与浏览器定义文件(.browser)中的信息合并在一起。在本次学习将会连带.browser文件的相关内容    元素 说明 filter 可选的元素。 指定搜索字符串列表,通过这些字符串可以将各个设置分别应用于特定的浏览器定义。 result 指定 HttpCapabilitiesBase 派生类,该类用于保存分析 browserCaps 节所得的结果。这些功能针对各个浏览器存储为键/值字符串对。 此元素在.NETFramework2.0版中仍然适用。 use 指定HTTP请求字符串,该字符串用于分析存储在 filter 和 case 元素中的浏览器功能信息。    另外filter包含子元素case,case中则是filter筛选过后保存的结果。结果以键值对形式,

  • 计算机网络-IP类型判断

    第一个类别为A类,最后一个类别为E类,前边三个类别(A类、B类和C类)被用来标识工作站、路由器、交换机以及其他设备,而最后两个类别(D类和E类)被保留做特殊用途。   一个IP地址由32个比特位构成,这就意味着它有四个字节长,IP地址的第一个八位位组(或者说前八个比特、第一个字节)就足于决定该IP地址究竟属于那个类别。同时,根据IP地址归属的这个类别的属性我们就能决定IP地址的那个部分代表网络ID,那个部分代表主机ID。   所有的A类网络都有一个总共7比特的网络ID部分(第8位恒为0)和24个比特的主机ID部分,现在我们需要做的所有事情就是计算这7位比特将含有多少中可能性:2的7次方为128,所以A类地址可以包含128个大型网络,同时对于主机ID来说,2的24次方为16,777,216,所以每个A类网络中可以包含16,777,216个主机,但是这16,777,216个主机地址中有两个不能使用,一个用来作为该网络地址,另外一个用来作为该网络内的广播地址(查看本页末尾部分的表格)。这也是我们在计算某个网络中的“合法”主机数目总是减去2的原因,所以,如果我问你在一个A类网络中最多可以有多少

  • vue上传文件

    elementplus弹框版本可忽略 <el-dialogv-model="showForm"title="数据导入"width="30%":before-close="handleClose"> <!--<span>Thisisamessage</span>--> <el-uploadclass="upload-file"action="#":before-upload="beforeUpload":http-request="uploadFile" accept="xls,xlsx"style="text-align:center;"> <el-buttontype="primary"size="small" style="background:#31c75f;color:white;height:40px;">点击上传 </el-button> </el-upload> <template#footer>

  • Flink基本概念

    Flink基本概念 1.ThehistoryofFlink? 2.WhatisFlink? ApacheFlink是一个开源的分布式、高性能、高可用、准确的流处理框架,主要由Java代码实现,支持实时流(stream)处理和批(batch)处理,批数据只是流数据的一个极限的特例。原生支持了迭代管理、内存计算和程序优化。 3.TheFeatureofFlink? 流式优先(streaming-first:连续处理),容错(fault-tolerant:有状态的计算),可伸缩(scalable:可支持上千个节点),性能(performance:高吞吐-每秒处理的数据量很大、低延迟-数据产生时Flink立刻可以处理掉数据的产生到处理间隔的时间很短)。 4.TheArchitectureofFlink? (1)部署deploy:支持local(singlejvm)、支持cluster(standalone、yarn)、支持cloud(GCE、EC2) (2)核心core:分布式流处理框架 (3)APIs:DataStreamAPI、DataSetAPI (4)L

  • yocto基础知识

    yocto基本概念及介绍: https://blog.csdn.net/weixin_41965270/article/details/82893870   yocto 使用实例 https://blog.csdn.net/qq_28992301/article/details/52922314   使用YoctoProject构建自定义嵌入式Linux发行版 https://www.ibm.com/developerworks/cn/linux/l-yocto-linux/

  • ubuntu APT-GET工作原理

    sudoapt-getupdate执行这条命令后计算机做了什么? 无论用户使用哪些手段配置APT软件源,只是修改了配置文件——/etc/apt/sources.list,目的只是告知软件源镜像站点的地址。但那些所指向的镜像站点所具有的软件资源并不清楚,需要将这些资源列个清单,以便本地主机知晓可以申请哪些资源。 用户可以使用“apt-getupdate”命令刷新软件源,建立更新软件包列表。在UbuntuLinux中,“apt-getupdate”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。因此,在计算机设备空闲时,经常使用“apt-getupdate”命令刷新软件源,是一个好的习惯。   sudoapt-getinstallXXX后计算机做了什么? 使用“apt-getinstall”下载软件包大体分为4步:第一步,扫描本地存放的软件包更新列表(由“apt-getupdate”命令刷新更新列表,也就是/var

相关推荐

推荐阅读