Linux下利用python实现语音识别详细教程

语音识别工作原理简介

语音识别源于 20 世纪 50 年代早期在贝尔实验室所做的研究。早期语音识别系统仅能识别单个讲话者以及只有约十几个单词的词汇量。现代语音识别系统已经取得了很大进步,可以识别多个讲话者,并且拥有识别多种语言的庞大词汇表。
语音识别的首要部分当然是语音。通过麦克风,语音便从物理声音被转换为电信号,然后通过模数转换器转换为数据。一旦被数字化,就可适用若干种模型,将音频转录为文本。
大多数现代语音识别系统都依赖于隐马尔可夫模型(HMM)。其工作原理为:语音信号在非常短的时间尺度上(比如 10 毫秒)可被近似为静止过程,即一个其统计特性不随时间变化的过程。
许多现代语音识别系统会在 HMM 识别之前使用神经网络,通过特征变换和降维的技术来简化语音信号。也可以使用语音活动检测器(VAD)将音频信号减少到可能仅包含语音的部分。
幸运的是,对于 Python 使用者而言,一些语音识别服务可通过 API 在线使用,且其中大部分也提供了 Python SDK。

选择合适的python语音识别包

PyPI中有一些现成的语音识别软件包。其中包括:
•apiai
•google-cloud-speech
•pocketsphinx
•SpeechRcognition
•watson-developer-cloud
•wit
一些软件包(如 wit 和 apiai )提供了一些超出基本语音识别的内置功能,如识别讲话者意图的自然语言处理功能。其他软件包,如谷歌云语音,则专注于语音向文本的转换。
其中,SpeechRecognition 就因便于使用脱颖而出。
识别语音需要输入音频,而在 SpeechRecognition 中检索音频输入是非常简单的,它无需构建访问麦克风和从头开始处理音频文件的脚本,只需几分钟即可自动完成检索并运行。

安装SpeechRecognition

SpeechRecognition 兼容 Python2.6 , 2.7 和 3.3+,但若在 Python 2 中使用还需要一些额外的安装步骤。大家可使用 pip 命令从终端安装 SpeechRecognition:pip3 install SpeechRecognition
安装过程中可能会出现一大片红色字体提示安装错误!我在另一篇博客中有解决方法(https://blog.csdn.net/weixin_44895651/article/details/104276569
安装完成后可以打开解释器窗口进行验证安装:
在这里插入图片描述
注:不要关闭此会话,在后几个步骤中你将要使用它。
若处理现有的音频文件,只需直接调用 SpeechRecognition ,注意具体的用例的一些依赖关系。同时注意,安装 PyAudio 包来获取麦克风输入

识别器类

SpeechRecognition 的核心就是识别器类。
Recognizer API 主要目是识别语音,每个 API 都有多种设置和功能来识别音频源的语音,这里我选择的是recognize_sphinx(): CMU Sphinx - requires installing PocketSphinx(支持离线的语音识别
那么我们就需要通过pip命令来安装PocketSphinx,在安装过程中也容易出现一大串红色字体的错误。因为博主英语不太好,具体啥错误不知道。直接上解决方法吧!在我的另一篇文章有介绍:(https://blog.csdn.net/weixin_44895651/article/details/104445102

音频文件的使用

下载相关的音频文件保存到特定的目录(博主直接保存到ubuntu桌面):
链接:https://pan.baidu.com/s/1oWG1A6JnjpeT_8DhEpoZzw
提取码:sf73
注意:
AudioFile 类可以通过音频文件的路径进行初始化,并提供用于读取和处理文件内容的上下文管理器界面。
SpeechRecognition 目前支持的文件类型有:

  • WAV: 必须是 PCM/LPCM 格式
  • AIFF
  • AIFF-CFLAC: 必须是初始 FLAC 格式;OGG-FLAC 格式不可用

英文的语音识别

在完成以上基础工作以后,就可以进行英文的语音识别了。
(1)打开终端
(2)进入语音测试文件所在目录(博主的是 桌面)
(3)打开python解释器
(4)按照下图输入相关命令
在这里插入图片描述
最后就可以看到语音转文字的内容(this they’ll smell …),其实效果还是很不错的!因为是英文,并且没有噪音。

噪音对语音识别的影响

噪声在现实世界中确实存在,所有录音都有一定程度的噪声,而未经处理的噪音可能会破坏语音识别应用程序的准确性。
要了解噪声如何影响语音识别,请下载 “jackhammer.wav”(链接:https://pan.baidu.com/s/1AvGacwXeiSfMwFUTKer3iA
提取码:3pj7)
通过尝试转录效果并不好,我们可以通过尝试调用 Recognizer 类的adjust_for_ambient_noise()命令。
当然具体的博主没有实践,不知道准确性如何!大家可以借鉴这篇文章(https://mp.weixin.qq.com/s/B1w-ZLwoK1-5wDZW9pJ82g

麦克风的使用

若要使用 SpeechRecognizer 访问麦克风则必须安装 PyAudio 软件包。
如果使用的是基于 Debian的Linux(如 Ubuntu ),则可使用 apt 安装 PyAudio:sudo apt-get install python-pyaudio python3-pyaudio安装完成后可能仍需要启用 pip3 install pyaudio ,尤其是在虚拟情况下运行。
在安装完pyaudio的情况下可以通过python实现语音录入生成相关文件。
pocketsphinx的使用注意
支持文件格式:wav
音频文件的解码要求:16KHZ,单声道
利用python实现录音并生成相关文件程序代码如下:

from pyaudio import PyAudio, paInt16
import numpy as np
import wave
class recoder:
     NUM_SAMPLES = 2000   
     SAMPLING_RATE = 16000  
     LEVEL = 500     
     COUNT_NUM = 20   
     SAVE_LENGTH = 8     
     Voice_String = []
     def savewav(self,filename):
         wf = wave.open(filename, 'wb')
         wf.setnchannels(1)
         wf.setsampwidth(2)
         wf.setframerate(self.SAMPLING_RATE)
         wf.writeframes(np.array(self.Voice_String).tostring())
         wf.close()
     def recoder(self):
         pa = PyAudio()
         stream = pa.open(format=paInt16, channels=1, rate=self.SAMPLING_RATE, input=True,frames_per_buffer=self.NUM_SAMPLES)
         save_count = 0
         save_buffer = []
         while True:
            string_audio_data = stream.read(self.NUM_SAMPLES)
            audio_data = np.fromstring(string_audio_data, dtype=np.short)
            large_sample_count = np.sum(audio_data > self.LEVEL)
            print(np.max(audio_data))
            if large_sample_count > self.COUNT_NUM:
                save_count = self.SAVE_LENGTH
            else:
                save_count -= 1
            if save_count < 0:
                save_count = 0
            if save_count > 0:
                save_buffer.append(string_audio_data )
            else:
                if len(save_buffer) > 0:
                    self.Voice_String = save_buffer
                    save_buffer = []
                    print("Recode a piece of voice successfully!")
                    return True
		 else:
                    return False
if __name__ == "__main__":
    r = recoder()
    r.recoder()
    r.savewav("test.wav")

注意:在利用python解释器实现时一定要注意空格!!!
最后生成的文件就在Python解释器回话所在目录下,可以通过play来播放测试一下,如果没有安装play可以通过apt命令来安装。

中文的语音识别

在进行完以前的工作以后,我们对语音识别的流程大概有了一定的了解,但是作为一个中国人总得做一个中文的语音识别吧!
我们要在CMU Sphinx语音识别工具包里面下载对应的普通话升学和语言模型。在这里插入图片描述
图片中标记的就是普通话!下载相关的语音识别工具包。
但是我们要把zh_broadcastnews_64000_utf8.DMP转化成language-model.lm.bin,这里可以借鉴这篇博主的文章。最后得到chinese.lm.bin
再解压zh_broadcastnews_16k_ptm256_8000.tar.bz2得到zh_broadcastnews_ptm256_8000文件夹。
借鉴刚才那位博主的方法,在Ubuntu下找到speech_recognition文件夹。可能会有很多小伙伴找不到相关的文件夹,其实是在隐藏文件下。大家可以点击文件夹右上角的三条杠。如下图所示:
在这里插入图片描述
然后给显示隐藏文件打个勾,如下图所示:
在这里插入图片描述
然后依次按照以下目录就可以找到啦:在这里插入图片描述
然后把原来的en-US改名成en-US-bak,新建一个文件夹en-US,把解压出来的zh_broadcastnews_ptm256_8000改成acoustic-model,把chinese.lm.bin改成language-model.lm.bin,把pronounciation-dictionary.dic改后缀成dict,复制这三个文件到en-US里。同时把原来en-US文件目录下的LICENSE.txt复制到现在的文件夹下。
最终该文件夹下有以下文件:
在这里插入图片描述
然后我们就可以通过麦克风录入一个语音文件文件(“test.wav”)
在该文件目录下打开python解释器输入以下内容:
在这里插入图片描述
就看到了输出内容,但是我说的是两个中国,也测试了一下其他的发现识别效果很不好!!!
当然有好多同学可能想要语音包,我就分享给大家啦!(链接:https://pan.baidu.com/s/13DTDnv_4NYbKXpkXAXODpw
提取码:zh39)

小范围中文识别

用官方提供的效果太差,几乎不能用!那么我看了很多文章以后就想到了一种优化方法,但是只适合小范围的识别!一些命令啥的应该没有问题,但是聊天什么的可能就效果不太好。
找到刚才复制的4个文件夹,有一个pronounciation-dictionary.dict的文件夹,打开以后是以下内容:
在这里插入图片描述感觉这内容就是类似于一个字典,很多用词和平时交流的用词差距比较大。那么我们改成我们习惯的用词就可以啦! 抱着试一试的想法,结果还真的可以。识别效果真的不错!
我的做法是:
(1)把图片中红色标记以上的内容继续保留,红色以下的内容删除掉。当然处于保险考虑建议大家给该文件备份一下!
(2)给红色线以下输入自己想识别的内容!(按照规则输入,不同于拼音!!!)最近新型肺炎的情况不断的变好,听到最多的一句话就是“中国加油”那么今天的内容就是将“中国加油”实现语音转文字!希望能早日开学,哈哈哈哈。
在这里插入图片描述
(3)输入以下内容:
在这里插入图片描述
就可以看到中国加油啦!同时希望肺炎疫情早日康复!

语音合成

语音合成个人的理解就是文字转语音。这篇文章已经介绍的很详细啦!(https://blog.csdn.net/chadian3912/article/details/81077537)所以我就不多介绍啦!不过这句话中可以设置client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = client.synthesis('你好百度', 'zh', 1, { 'vol': 5,'spd': 3,'pit':9,'per': 3})音量、声调、速度、男/女/萝莉/逍遥。
大家快去尝试合成一下吧!最后来欣赏一下语音合成后4种不同风格的语音,你更喜欢那一款呢?

<think>好的,我现在需要帮助用户在Linux服务器上使用Python实现基于Whisper的语音识别。根据用户提供的引用内容,我需要整理出具体的步骤和方法。首先,我应该回忆一下Whisper的基本信息,比如安装方法、依赖项,以及如何使用Python调用它。 首先,用户提到他们想在Linux服务器上部署,所以可能需要考虑环境配置,比如Python版本、安装必要的系统依赖。根据引用[2]和[4],Whisper需要Python环境,可能还需要一些库比如PyTorch。引用[2]中的代码示例用了`import whisper`,所以需要安装Whisper的Python包。 然后,安装步骤可能包括安装FFmpeg,因为Whisper处理音频文件需要它。用户可能需要运行`sudo apt update && sudo apt install ffmpeg`之类的命令来安装系统依赖。 接下来是Python包的安装,比如使用pip安装whisper和PyTorch。引用[2]中的代码示例可能暗示需要安装whisper库,可能通过`pip install openai-whisper`。同时,PyTorch可能需要根据CUDA版本安装,比如`pip3 install torch torchaudio --index-url https://download.pytorch.org/whl/cu118`。 然后,用户需要加载模型,比如使用`model = whisper.load_model("base")`,不同的模型大小(tiny, base, small, medium, large)会影响性能和准确率。用户可能需要根据服务器资源选择合适的模型。 处理音频文件的话,需要将音频文件上传到服务器,然后使用transcribe方法。例如,引用[2]中的例子是`result = model.transcribe("audio.mp3")`,输出文本。 如果用户需要实时语音识别,可能需要结合音频流处理。引用[3]提到使用Flask创建服务器,可能用户需要构建一个Web服务来处理上传的音频文件,并返回识别结果。这时候需要编写Flask应用,处理POST请求,调用Whisper模型进行转录。 另外,可能要考虑性能优化,比如模型选择、缓存、异步处理等,特别是在服务器资源有限的情况下。比如,使用较小的模型(如base)而不是large,以节省内存和计算资源。 还要注意错误处理,比如文件不存在、格式不支持等情况,确保代码的健壮性。例如,检查上传的文件是否为支持的音频格式,或者捕获异常。 最后,可能需要远程访问,如引用[3]提到的,使用Flask服务器并设置host为0.0.0.0,允许外部访问。同时,可能需要处理跨域问题,或者结合Nginx进行反向代理。 总结步骤应该是:安装系统依赖→安装Python包→编写Python代码加载模型并转录→可选地构建Flask API→部署并测试。</think>### 分步解答:Linux服务器部署Whisper语音识别 #### 1. 环境准备 **系统依赖安装** Whisper依赖FFmpeg处理音频文件,在Ubuntu/Debian系统执行: ```bash sudo apt update && sudo apt install ffmpeg ``` **Python环境配置** 建议使用Python 3.8+,通过虚拟环境隔离依赖: ```bash python3 -m venv whisper-env source whisper-env/bin/activate ``` #### 2. 安装Python库 ```bash pip install openai-whisper # 安装Whisper主库 pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu # CPU版本(若无GPU) # 若使用NVIDIA GPU,替换为CUDA版本(需匹配驱动版本): # pip3 install torch torchaudio --index-url https://download.pytorch.org/whl/cu118 ``` #### 3. 基础语音识别实现 创建`whisper_demo.py`文件: ```python import whisper # 加载模型(首次运行会自动下载) model = whisper.load_model("base") # 可选模型:tiny, base, small, medium, large # 转录音频文件 result = model.transcribe("audio.mp3", fp16=False) # CPU需关闭fp16 print(result["text"]) ``` 执行脚本: ```bash python whisper_demo.py ``` #### 4. 构建Flask API服务(可选) 安装Flask: ```bash pip install flask ``` 创建`app.py`: ```python from flask import Flask, request, jsonify import whisper import tempfile import os app = Flask(__name__) model = whisper.load_model("base") @app.route('/transcribe', methods=['POST']) def transcribe(): if 'file' not in request.files: return jsonify({"error": "No file uploaded"}), 400 file = request.files['file'] with tempfile.NamedTemporaryFile(delete=False) as tmp: file.save(tmp.name) result = model.transcribe(tmp.name, fp16=False) os.unlink(tmp.name) # 删除临时文件 return jsonify({"text": result["text"]}) if __name__ == "__main__": app.run(host='0.0.0.0', port=5000) ``` 启动服务: ```bash python app.py ``` #### 5. 远程调用测试 使用curl测试API: ```bash curl -X POST -F "file=@audio.mp3" http://服务器IP:5000/transcribe ``` #### 关键参数说明 - **模型选择**:模型越大(如large-v3),精度越高但资源消耗越大,服务器推荐base/small - **硬件加速**:GPU需安装CUDA版PyTorch,并添加参数`fp16=True` - **音频格式**:支持mp3/wav/ogg等常见格式,建议采样率16kHz+ ### 性能优化建议 1. **模型裁剪**:使用`model = whisper.load_model("base").cpu()`释放显存 2. **批量处理**:对队列任务使用异步框架(Celery) 3. **内存管理**:对长音频分段处理,避免内存溢出[^4] ### 常见问题排查 - **CUDA内存不足**:换用更小模型或添加`device="cpu"`参数 - **无法加载模型**:手动下载模型到`~/.cache/whisper/` - **音频质量差**:预处理降噪或使用`condition_on_previous_text=False`参数
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值