语音识别与Python编程实践

news2024/12/22 12:05:49

博主简介

博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c++,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,如果有错误之处,大家可以指正。

专栏简介:   本专栏主要研究python在人工智能方面的应用,涉及算法,案例实践。包括一些常用的数据处理算法,也会介绍很多的Python第三方库。如果需要,点击这里   订阅专栏

给大家分享一个我很喜欢的一句话:“每天多努力一点,不为别的,只为日后,能够多一些选择,选择舒心的日子,选择自己喜欢的人!”


 

目录

背景引入

语音识别简介

语音识别的起源与发展

语音识别的基本原理

语音识别Python SDK

Microsoft 语音识别框架SAPI

Speech

Python_Speech_Features工具库

params

SpeechRecognition库工具


背景引入

自动语音识别(Automatic Speech Recognition,ASR)是近十年来发展较快的技术之一。随着深度学习 在AI领域的广泛应用,语音识别技术开始逐步从实验室走向市场,百度公司基于深度学习研发的新一代深度语音识别系统Deep Speech 2,识别准确率可以达到97%,美国著名杂志《MIT Technology Review》将他评为“2016年十大突破技术”之一,并认为该技术在未来几年将会极大改变人们的生活。

在人工智能领域,语音识别是非常重要的一个环节,因为语音是智能系统获取外界信息的重要途径之一,较之于键盘和鼠标等输入方法,语音输入更快捷,高效。近年来,智能手机等各种高端的移动应用终端都集成了语音识别系统,使得这些智能化程度更高,使用起来也更方便。语音交互产品中具有代表性的有Apple公司的Siri,Microsoft公司的Cortana,Amazon公司的Alexa,华为公司的小E和百度公司的小度等。随着语音技术的高速发展,各大软硬件厂商纷纷布局,在推出相关硬件产品的同时,也开始关注语音芯片的研发。语音识别技术的确带给了人们方便,尤其是对于一些文化水平不高的人群具有很大的便利性。

语音识别简介

语音识别的起源与发展

语音识别是一门复杂的交叉技术学科,通常涉及声学,信号处理,模式识别,语言学,心理学,以及计算机等多个学科领域。语音识别技术的发展可追寻到20世纪50年代,贝尔实验室首次实现Audrey英文数字识别系统(可识别0——9单个数字英文识别),并且准确识别率达到90%以上。普林斯顿大学和麻省理工学院在同一时期也推出了少量词语的独立识别系统。到20世纪80年代,隐马尔可夫模型(Hidden arkov Model,HMM)N-gram语言模型等重要技术开始被应用于语言识别领域,是的语音识别技术从孤立词识别到连续词识别。到20世纪90年代,大词汇量连续识别技术持续进步,最小分类错误(Minimum Classification Error,MCE)以及最大互信息(Maximum Mutual Information,MMI)等区分性十五模型训练方法开始被应用,使得语音识别的准确率逐步提高,尤其适用于长句子情形。与此同时,最大后验概率(Maximum Aposteriori Probablity,MAP)与最大似然线性回归(Maximum Likelihood Linear Regression,MLLR)等模型自适应方法也开始被应用于语音识别模型的训练。到了21世纪,随着深度学习的不断发展,神经网络之父杰弗里·辛顿(Geoffrey Hinton)提出深度置信网络(Deep Belief Network,DBN)。2009年,辛顿和他的学生默罕默德(Mohamed)将深度神经网络应用于语音识别,在TIMIT语音库上进行的小词汇量连续语音识别任务获得成功。TIMIT是由德州仪器(Texas Instruments,TI)。麻省理工学院和斯坦福国际研究学院(SRI International)合作构建的声学-音频连续识别语音库。

语音识别的基本原理

语音是一种非常复杂的现象,很少人能够理解它是如何被感知的。我们通常的直觉是语音是由单词构成,而单词又是由各种音素(Phoneme)构成。然而事实上并非如此,语音本身是一个动态的过程,是一种连续的音频流,是由一部分相当稳定状态与诸多动态变化的状态混合而成。在这种状态序列中,人们可以定义或多或少类似的声音或音素。通过Adobe Audition等音频编辑软件进行录音播放,可看到随时间变化的语音动态波形。

 一个典型的语音对话系统一般包括如下几个技术模块:对话管理器(Dialog Manager),语音识别器(Speech Recognizer),语言解析器(Language Parser),语言生成器(Language Generator)和语音合成器(Speech Synthesizer)。其中,语音识别器(又可称为语音识别模块或者语言识别系统)主要用于将用户输入的语音转化为文本,这也是我们最关注的核心技术。语音识别由以下几个部分构成。

语音识别是一个先编码后解码的过程。其中,信号处理(Signal Processing)与特征提取(Feature Extraction)是语音识别系统的开始。,这是一个编码的过程。特征提取是指从原始的语音输入经过相应处理后得到的语音特征向量(Eigenvector)。语音识别的一般方法是:首先提取一个波形,然后将其分解为语音片段并尝试识别每个语音片段中的内容。通常情况下,要做到这一点,我们需要尝试将所有可能的单词进行组合然后与音频进行匹配,最后选择最佳匹配。由于参数数量过大,需要对其进行优化,所以我们会将语音分解成帧,然后对于每帧,提取出39个代表语音特征的代表数字,这些数字即语音特征向量。

我们在提取音频信息后,通过噪声和消除和信道畸变(Channel Distortion)进行语音增强,将信号从时域转化为频域,并为后面的操作提供具有特侦的特征向量。在信号处理过程中,常用梅尔频率倒谱系数(Mel-Frequency Cepsptral Coefficient,MFCC)或感知线性预测(Perceptual Linear Prediction,PLP)作为特征向量,然后使用混合高斯模型-隐马尔可夫模型(GMM-HMM)作为声学模型,再利用最大似然(Maximum Likelihood,ML)准则,序列鉴别性训练算法,例如,最小分类错误和最小音素错误(Minimum Phone Error,MPE)等模型进行训练。

声学模型则以特征提取部分生成的特征为输入,为可变特征长序列(Variable -Length)生成声学模型分数(Acoustic Model Score)。声学模型处理的问题主要在于特征向量序列的可变长和音频信号的丰富变化性。因为语音长度是不确定的,所i特征向量序列的长度也不确定。我们一般通过动态时间规整(Dynamic Time Warping,DTW)算法和隐马尔可夫模型来处理可变长特征序列。语言模型通过训练语料来学习词语词之间的关系,估计假设词序列的可能性,又称为语言模型分数。下面我们来介绍一下具体操作。

语音识别Python SDK

Microsoft 语音识别框架SAPI

SAPI是Microsoft公司提供的语音接口框架,提供了应用程序和语音引擎之间的高级接口,实现了控制和管理各种语音引擎的实时操作所需的所有细节。SAPI引擎主要由文本转语音(Text-To-Speech,TTS)系统和语音识别器构成。

import win32com.client #载入SAPI语音识别转换
from win32com.client import constants
import pythoncom #主要应用于python调用com接口

载入SAPI语音处理模块并合成和输出指定语音的示例代码如下。


speaker=win32com.client.Dispatch('SAPI.SPVOICE')
speaker.Speak('开启微软语音接口')
speaker.Speak('Microsoft Speech API Initialized.')#英文语音合成

除了语音合成功能,SAPI可通过以下示例代码开启语音识别代码:

win32com.client.Dispatch('SAPI.SpSharedRecognizer')

以下为一个基于Microsoft语音识别框架SAPI的语音识别应用的完整代码。

import win32com.client #载入SAPI语音识别转换
from win32com.client import constants
import pythoncom #主要应用于python调用com接口
#定义语音识别对象并开启SAPI语音识别引擎
speaker=win32com.client.Dispatch('SAPI.SPVOICE')
#定义一个语音识别类
class SpeechRecognition:
    #用传入的单词列表初始化语音识别
    def __init__(self,wordsToAdd):
        #启动TTS
        self.speaker=win32com.client.Dispatch('SAPI.SpVoice')
        #启动语音识别引擎,首先创建一个侦听器
        self.listener=win32com.client.Dispatch("SAPI.SpSharedRecognizer")
        #创建语音识别上下文
        self.context=self.listener.CreateRecoContext()
        #不允许自由识别单词————仅限命令和控制识别语法中的单词
        self.grammar=self.context.CreateGrammar()
        #为语法创建一个新规则,即顶级规则和动态规则
        self.grammar.DictationSetState(0)
        self.wordsRule=self.grammar.Rules.Add("wordsRule",constants.SRATopLevel+\
                                              constants.SRADynamic,0)
        #清除规则
        self.wordsRule.Clear()
        #浏览单词列表
        [self.wordsRule.InitialState.AddWordTransition(None,word) for word in wordsToAdd]
        #将设置好的wordsrule规则激活
        self.grammar.Rules.Commit()
        self.grammar.CmdSetRuleState("wordsRule",1)
        #提交对语法规则的更改
        self.grammar.Rules.Commit()
        #添加一个事件处理程序
        self.eventHandler=ContextEvents(self.context)
        #设置一个语音提示
        self.say("Successfully Started.")
    #定义一个函数进行TTS语音输出
    def say(self,phrase):
        self.speaker.Speak(phrase)
#处理语音对象引发的事件的回调类
class ContextEvents(win32com.client.getevents("SAPI.SpSharedRecoContext")):
    def OnRecognition(self,StreamNumber,StreamPosition,RecognitionType,Result):
        newResult=win32com.client.Dispatch(Result)
        print("You just said:",newResult.PhraseInfo.GetText())
        speechstr=newResult.PhraseInfo.GetText()
        #定义语音识别关键词及其对应的语音输出信息
        if speechstr=="你好":
            speaker.Speak("How are you doing?")
        elif speechstr=="测试":
            speaker.Speak("This is a testing program for speech recognition.")
        elif speechstr=="欢迎你":
            speaker.Speak("You are welcome to be here")
        elif speechstr=='新年快乐':
            speaker.Speak("Happy New Year in 2019")
        elif speechstr=="作者":
            speaker.Speak("心随而动")
        else:
            pass
if __name__=='__main__':
    speaker.Speak("语音识别系统开启")
    wordsToAdd=['你好','测试','欢迎你','新年快乐','作者']
    speechReco=SpeechRecognition(wordsToAdd)
    while True:
        pythoncom.PumpWaitingMessages() #检查是否有事件在等待,然后再调用适当的回调



可能由于python版本的问题,可能会出现报错,这是版本的问题。

程序运行后,会出现“语音识别系统开启”的提示,然后等待用户语音输入。

Speech

Speech是一个智能语音模块,其主要功能包括语音识别,将指定文本合成为语音及将语音信号输出等。该模块不是内置模块,所以需要我们去下载:

pip install speech 

Speech模块安装完后,我们可使用以下示例代码来实现启动和关闭语音系统:


#speech
import speech
while True:
    phrase=speech.input() #循环等待语音输入
    speech.say("You said %s" %phrase)
    if phrase=='turn off':
        break

 如果你使用的是python3版本,那么下载后的speech是不能直接使用,需要你将代码改变一下。打开speech.py文件,

  • 修改一:第157行,print prompt改为print(prompt)
  • 修改二:第59行,thread改为_thread
  • 修改三:最后一行的thread应该改为_thread

下列示例代码演示了如何通过speech模块调用Microsoft SAPI语音识别处理模块来对计算机进行简单的语音指令控制:


#语音控制计算机
import sys #用于windows系统操作
import speech
import webbrowser #用于打开指定网络连接
import os
def callback(phr):
    if phr=="关闭语音识别":
        speech.say("Goodbye,Speech Recognition system is closing.") #播放提示语音
        speech.stoplistening() #关闭SAPI
        sys.exit() #推出程序
    elif phr=="播放电影":
        speech.say("I am prepaing the movie for you.") #播放提示语音
        webbrowser.open_new('https://www.youku.com/')
    elif phr=="看新闻":
        speech.say("I want to know what the world is going on")
        webbrowser.open_new("https://www.baidu.com/")
    elif phr=="打开控制台":
        speech.say("打开CMD")
        os.popen("C:\\Windows\\System32\\cmd.exe")
while True:
    phr=speech.input() #语音输入
    speech.say("You said is %s"%phr)
    callback(phr) #调用函数

Python_Speech_Features工具库

Python_Speech_Features工具库提供了诸如MFCC,SSC,Fiterbank等进行语音识别的算法和工具。运行库需要Numpy,Scipy库的支持。可以按照上面的安装方式安装。

由于该库中的函数太多,很难详细介绍,大家可以去官网查看:

这里介绍了一下mfcc函数的参数:

params

  • signal:
    the audio signal from which to compute features.Should be an N1 array
    用来计算梅尔频率倒谱系数特性的音频信号。是一个N
    1的数组
  • samplerate:
    the samplerate of the signal we are working with.
    音频信号的采样率
  • winlen:
    the length of the analysis window in seconds. Default is 0.025s (25 milliseconds)
    分析窗口的长度,以秒为单位。默认值为0.025s(25毫秒)(ps: 短时傅里叶变换的窗口长度)
  • winstep:
    the step between successive windows in seconds. Default is 0.01s (10 milliseconds)
    连续窗口之间的步长,以秒为单位。默认值为0.01s(10毫秒)
  • numcep:
    the number of cepstrum to return, default 13
    返回倒谱的数量,默认为13
  • nfilt:
    the number of filters in the filterbank, default 26.
    滤波器组中的过滤器数量,默认为26个。
  • nfft:
    the FFT size. Default is 512.
    FFT大小。默认是512。
  • lowfreq:
    lowest band edge of mel filters. In Hz, default is 0.
    梅尔滤波器的最低频带边缘。在频率(HZ)中,默认值为0。
  • highfreq:
    highest band edge of mel filters. In Hz, default is samplerate/2
    梅尔过滤器的最高频带边缘。在频率(HZ)中,默认值为1/2倍音频信号采样率
  • preemph:
    apply preemphasis filter with preemph as coefficient. 0 is no filter. Default is 0.97.
    采用preemph为系数的预加重滤波器。0不是过滤器。默认是0.97。
  • ceplifter:
    apply a lifter to final cepstral coefficients. 0 is no lifter. Default is 22.
    将一个lifter应用到最终倒谱系数。0不是lifter。默认是22。
  • appendEnergy:
    if this is true, the zeroth cepstral coefficient is replaced with the log of the total frame energy.
    如果这个参数的值是True,第0阶倒谱系数被替换为总帧能量的对数。
  • winfunc:
    the analysis window to apply to each frame. By default no window is applied. You can use numpy window functions here e.g. winfunc=numpy.hamming
    分析窗口应用于每一帧。默认情况下不应用任何窗口。您可以在这里使用numpy窗口函数,例如winfunc=numpy.hamming(汉明窗)c

 下列函数代码,我们载入一段音频。利用库中的函数进行分析和提取:


from python_speech_features import mfcc
from python_speech_features import logfbank
import scipy.io.wavfile as wav #用于语音文件载入
(rate,sig)=wav.read("file.wav") #载入音频文件,大家自己使用自己的音频文件,这里博主随便写了一个
mfcc_feat=mfcc(sig,rate)
fbank_feat=logfbank(sig,rate)    #计算滤波器组能量特征的对数
#输出结果
print("MFCC Features:")
print(mfcc_feat[1:3,:])
print("LogFBank Features:")
print(fbank_feat[1:3,:])

SpeechRecognition库工具

SpeechRecognition是一个用于语音识别的Python库,他同时支持python2和python3联机或离线的多个引擎和API。

为确保SpeechRecognitional能够正常使用,我们需要先安装PyAudio模块,这是用于话筒相关的操作需要该模块的支持。安装完成后,我们可以输入以下的命令来进行检测:

python -m speech_recognition

该语音识别引擎支持以下几种不同的API:

①CMU Sphinx。

②Google Speech Recognition

③Google Cloud Speech

④Microsoft Bing Voice Recognition

⑤IBM Speech to Text

⑥ Houndify

其中,CMU Sphinx支持离线语音识别,其他诸如Microsoft Bing Voice Recognition,IBM Speech to Text等则需要语音识别引擎在线联机工作。

下列示例代码将演示如何将SpeechRecognition和上述的API进行联合使用,以此达到语音识别的目的。

import speech_recognition as sr#导入SpeechRecognition库
#从话筒获取语音识别的音频源
r=sr.Recognizer()
with sr.Microphone() as source:
    print("Say something")
    audio=r.listen(source)
#利用Cmu Sphinx进行语音识别
try:
    print("Sphinx thinks you said"+r.recognize_sphinx(audio))
except sr.UnknownValueError:
    print("Sphinx could not undestand audio")
except sr.RequestError as e:
    print("Sphinx error;{0}".format(e))

#利用Google Speech Recognition进行语音识别
try:
    '''
    处于测试的目的,我们使用默认的API密钥,若要使用其他的API密钥,建议使用
    r.recognize_google(audio,key="GOOGLE_SPEECH_RECOGNITION_API_KEY"),而不是用r.recognize_google(audio)
    '''
    print("Google Speech Recognition thinks you said"+r.recognize_google(audio))
except sr.UnknownValueError:
    print("Google Speech Recognition could not wnderstand audio")
except sr.RequestError as e:
    print("Could not equest results from Google Speech Recognition service;{0}".format(e))
GOOGLE_CLOUD_SPEECH_CREDENTIALS=r"""INSERT THE CONTENTS OF THE GOOGLE CLOUD SPEECH JSON CREDENTIALS FILE HERE"""
try:
    print("Google cloud speech thinks you said"+r.recognize_google_cloud(audio,credentials_json=GOOGLE_CLOUD_SPEECH_CREDENTIALS))
except sr.UnknownValueError:
    print("Google Cloud Speech could not understand audio")
except sr.RequestError as e:
    print("Could not request results from google cloud Speech service;{0}".format(e))
#利用Microsoft Bing voice Recognition进行语音识别
BING_KEY="INSERT BING API KEY HERE"
try:
    print("Microsoft Bing Voice Recognition thinks you said"+r.recognize_bing(audio,key=BING_KEY))
except sr.UnknownValueError:
    print("Microsoft Bing Voice Recognition could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Microsoft Bing Voice Recognition service;{0}".format(e))
#利用Houndify进行语音识别。Hounddify客户端ID是Base64编码字符串
HOUNDIFY_CLIENT_ID="INSERT HOUNDIFY CLIENT ID HERE"
#加密客户端密钥是Base64编码字符串
HOUNDIFY_CLIENT_KEY="INSERT HOUNDIFY CLIENT KEY HERE"
try:
    print("Houndify thinks you said"+r.recognize_houndify(audio,client_id=HOUNDIFY_CLIENT_ID,client_key=HOUNDIFY_CLIENT_KEY))
except sr.UnknownValueError:
    print("Houndify could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Houndify service;{0}".format(e))
    '''
    利用IBM Speech to Text进行语音识别
    '''
    IBM_USERNAME="INSERT IBM SPEECH TO TEXT USERNAME HERE"
    #IBM Speech to Text密码是混合大小,小写字母和数字的字符串
    IBM_PASSWORD="INSERT IBM SPEECH TO TEXT PASSWORD HERE"
    try:
        print("IBM Speech to Text thinks you said"+r.recognize_ibm(audio,username=IBM_USERNAME,password=IBM_PASSWORD))
    except sr.UnknownValueError:
        print("IBM Speechh to Text could not understand audio")
    except sr.RequestError as e:
        print("Could not request results from IBM Speech to Text service;{0}".format(e))

 

 运行程序,我们就可以从话筒获取语音,然后通过几种不同的语音识别引擎来进行启动。

当然,我么也可以直接导入音频文件来进行语音识别。示例代码:



from os import path
AUDIO_FILE=path.join(path.dirname(path.realpath(__file__)),"English.wav") #导入音频文件,大家自己更改路径
r=sr.Recognizer()
with sr.AudioFile(AUDIO_FILE) as source:
    audio=r.record(source)

除了使用音频文件,我么也可以使用话筒来获取语音并存储为不同格式的文件


import speech_recognition as sr
r=sr.Recognizer()#从话筒获取语音
with sr.Microphone() as source:
    print("Say something!")
    audio=r.listen(source)
#将音频写入.raw文件
with open('microphone-results.raw','wb') as f:
    f.write(audio.get_raw_data())
#写入.wav文件
with open('microphone-results1.wav','wb') as f:
    f.write(audio.get_wav_data())
#写入.aiff文件
with open('microphone-results2.aiff','wb') as f:
    f.write(audio.get_aiff_data())
#写入.flac文件
with open('microphone-results.flac','wb') as f:
    f.write(audio.get_flac_data())

语音识别对环境有一定的要求,环境噪声和干扰对语音识别会有一定的影响,我们可以通过以下示例代码来校准环境噪声的识别器能量阈值:


r=sr.Recognizer()
with sr.Microphone()as source:
    #倾听1秒以内能量校准阈值
    r.adjust_for_ambient_noise(source)
    print("Say something!")
    audio=r.listen(source)

 好了,本期的内容就到此结束了,后面会介绍MFCC算法用于语音特征分析提取。感兴趣的小伙伴可以留意关注一下。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app入门并使用学习

笔记课程 工具准备 下载HBuilderX 点击下载HBuilderX 下载微信开发者工具 点击下载微信开发者工具 使用参考uni-app官网 官网 新建项目运行 文件---新建----项目 运行到谷歌浏览器H5 运行------谷歌浏览器打开---打开成功(第一次可能需要安装插件&#xff0…

React(三) ——新、旧生命周期

🧁个人主页:个人主页 ✌支持我 :点赞👍收藏🌼关注🧡 文章目录⛳React生命周期🌋初始化阶段👣运行中阶段🏓销毁阶段🏫新生命周期的替代🚚react中性…

MS9123是一款单芯片USB投屏器,内部集成了USB2 0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、

MS9123是一款单芯片USB投屏器,内部集成了USB2.0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上,支持CVBS、S-Video视频接口。 主要功能特征 C…

基本中型网络的仿真(RYU+Mininet的SDN架构)-以校园为例

目录 ​​​​​​​具体问题可以私聊博主 一、设计目标 1.1应用场景介绍 1.2应用场景设计要求 网络配置方式 网络技术要求 网络拓扑要求 互联互通 二、课程设计内容与原理 (1)预期网络拓扑结构和功能 (1)网络设备信息 …

aws ecr 使用golang实现的简单镜像转换工具

https://pkg.go.dev/github.com/docker/docker/client#section-readme 通过golang实现一个简单的镜像下载工具 总体步骤 启动一台海外区域的ec2实例安装docker和awscli配置凭证访问国内ecr仓库编写web服务实现镜像转换和自动推送 安装docker和awscli sudo yum remove awsc…

超市怎么做微信小程序_线上超市小程序开发可以实现什么功能呢

1。开发超市小程序有什么价值? 1、对于消费者来说:通过超市小程序能够更加直接的购买到想要的产品,消费者无需再到门店寻找商品可以直接通过超市小程序进行在线浏览;通过在线搜索的方式能够更加便捷的搜索到相应的商品&#xff0…

第一篇自我介绍(单片机)

小白的单片机之旅 🤔自我介绍🤔 😊学习目标😊 😜关于单片机😜 🌝小结🌝 🎉博客主页:小智_x0___0x_ 🎉欢迎关注:👍点赞&…

JavaSE学习笔记day14

二、Set Set集合是Collection集合的子接口,该集合中不能有重复元素!! Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法 Set接口,它有两个常用的子实现类HashSet,TreeSet 三、HashSet HashSet实现了Set接口,底层是hash表(实际上底层是HashM…

QML 中的 5 大布局

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在 QML 中,可以通过多种方式对元素进行布局 - 手动定位、坐标绑定定位、锚定位(anchors)、定位器和布局管理器。 说到 anchors,可能很多人都不太了解,它是 QML 中一个非常重要的概念,主要提供了一种相…

C语言几种判断语句简述

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。 C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 fals…

Vuex基础语法

Vuex vuex官网 文章目录Vuexvuex的工作原理图2.vuex的环境搭建3.vuex的使用1.actons2. mutations3.getters4.vuex中的map映射属性4.1 mapState和mapGetters4.2 mapMutations和mapActions5.vuex多组件通信1.通过计算属性获得2.通过mapState获得6.vuex模块化和命名空间6.1模块化…

为什么要用线程池?

1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2.提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源&#…

王道《操作系统》学习(一)——计算机系统概述

1.1 操作系统的概念、功能 1.1.1 操作系统的概念(定义) (1)操作系统是系统资源的管理者 (2)向上层用户、软件提供方便易用的服务 (3)是最接近硬件的一层软件 1.1.2 操作系统的功能…

Java 输入输出流

应用程序经常需要访问文件和目录,读取文件信息或写入信息到文件,即从外界输入数据或者向外界传输数据,这些数据可以保存在磁盘文件、内存或其他程序中。在Java中,对这些数据的操作是通过 I/O 技术来实现的。所谓 I/O 技术&#xf…

Vue2.0开发之——使用ref引用DOM元素(40)

一 概述 什么是ref引用ref引用示例 二 什么是ref引用 ref用来辅助开发者在不依赖于jQuery的情况下,获取DOM元素或组件的引用每个vue的组件实例上,都包含一个$refs对象,里面存储着对应的DOM元素或组件的应用默认情况下,组件的$re…

Vue3之事件绑定

何为事件绑定 当我们开发完UI界面后,还需要和用户交互,所谓交互也就是用户可以点击界面上的按钮,文字,链接等以及点击键盘上的按钮,我们开发的程序可以做出对应的反应。做出的反应会通过UI界面再反馈给用户&#xff0c…

CSS 之层叠规则(权级、权重、顺序)详解

文章目录参考描述定义层叠层叠与冲突规则权重(优先级)权重值的叠加顺序权级权级层叠规则的运用顺序尾声参考 项目描述MDN WEB Docs优先级Amily_mo令人烦恼的css选择器权值问题 - Amily_mo深入解析CSS基思J.格兰特 / 黄小、高楠 译MDN WEB Docs:not() 描…

华为OD机试用Python实现 -【字符串重新排序】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲字符串重新排序题目描述输入描述输出描述示例一输入输出示例二输入输出Python 代码实现算法思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.…

JavaEE|TCP/IP协议栈之TCP协议工作机制下

文章目录一、滑动窗口二、流量控制三、拥塞控制四、延时应答五、捎带应答六、面向字节流(了解)七、异常情况(了解)关于其他传输层协议一、滑动窗口 为什么要引入滑动窗口? 确认应答和超时重传为TCP可靠传输机制提供支持…

FTP中的TCP传输服务(电子科技大学TCP/IP实验五)

目录 一.实验目的 二.预备知识 三.实验原理 四.实验内容 五.实验步骤 八、总结及心得体会 九、对本实验过程及方法、手段的改进建议 一.实验目的 1、掌握 TCP 协议工作原理 2、掌握 TCP 的连接建立…