在Ubuntu20.04上用Python搭建全流程离线语音识别系统
引言
在智能家居、个人助理等应用场景中,语音识别技术已成为人机交互的重要手段。然而,依赖云端服务的语音识别存在隐私泄露、网络延迟等问题。本文将详细介绍如何在Ubuntu20.04系统下,使用Python实现全流程离线语音识别,涵盖语音唤醒、语音转文字、指令识别及文字转语音四个核心环节。
准备工作
系统环境
- 操作系统:Ubuntu20.04 LTS
- Python版本:3.8或更高版本
- 依赖库:
pyaudio、vosk、pocketsphinx、gTTS(可选,用于TTS)、sounddevice、numpy等
安装依赖
首先,更新系统软件包列表并安装必要的依赖:
sudo apt updatesudo apt install python3-pip python3-dev portaudio19-dev libpulse-dev
接着,使用pip安装Python依赖库:
pip3 install pyaudio vosk pocketsphinx sounddevice numpy# 如需文字转语音功能,可安装gTTS(需联网下载模型,但生成语音文件后可离线使用)pip3 install gTTS
语音唤醒实现
语音唤醒(Keyword Spotting, KWS)用于在连续音频流中检测特定关键词,触发后续处理。这里我们使用pocketsphinx库实现简单的语音唤醒功能。
步骤
-
下载语音模型:从CMUSphinx网站下载适合的声学模型(如
en-us)。 -
配置
pocketsphinx:from pocketsphinx import LiveSpeech, get_model_pathimport osmodel_path = get_model_path()speech = LiveSpeech(lm=False, keyphrase='hello computer', kws_threshold=1e-20,hmm=os.path.join(model_path, 'en-us'),dict=os.path.join(model_path, 'en-us.dict'))print("Listening for 'hello computer'...")for phrase in speech:print(f"Detected: {phrase}")# 触发后续处理
keyphrase:设置要检测的关键词。kws_threshold:调整检测灵敏度。
语音转文字实现
语音转文字(Automatic Speech Recognition, ASR)是将语音信号转换为文本的过程。这里我们使用vosk库,它支持多种语言且离线运行。
步骤
-
下载
vosk模型:从Vosk官网下载适合的语音识别模型(如vosk-model-small-en-us-0.15)。 -
使用
vosk进行语音识别:from vosk import Model, KaldiRecognizerimport pyaudioimport jsonmodel = Model("path_to_vosk_model")recognizer = KaldiRecognizer(model, 16000) # 假设采样率为16000Hzp = pyaudio.PyAudio()stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=4096)print("Listening...")while True:data = stream.read(4096)if recognizer.AcceptWaveform(data):result = recognizer.Result()print(json.loads(result)["text"])
- 调整
frames_per_buffer和采样率以匹配实际音频设备。
指令识别实现
指令识别是对语音转文字结果的进一步处理,以识别用户意图并执行相应操作。这通常涉及自然语言处理(NLP)技术。
简单指令识别示例
def recognize_command(text):commands = {"turn on the light": "light_on","turn off the light": "light_off","what's the time": "get_time",# 添加更多指令...}for cmd, action in commands.items():if cmd in text.lower():return actionreturn "unknown_command"# 假设从ASR获取了文本asr_text = "turn on the light"action = recognize_command(asr_text)print(f"Executing action: {action}")
- 更复杂的指令识别可能需要使用NLP库如
spaCy或NLTK进行句法分析、实体识别等。
文字转语音实现
文字转语音(Text-to-Speech, TTS)是将文本转换为语音信号的过程。虽然gTTS需要联网下载语音模型,但生成语音文件后可离线播放。对于完全离线的解决方案,可考虑使用espeak或festival等工具。
使用gTTS(需初始联网)
from gtts import gTTSimport osdef text_to_speech(text, filename="output.mp3"):tts = gTTS(text=text, lang='en')tts.save(filename)os.system(f"mpg321 {filename}") # 使用mpg321播放,需安装`sudo apt install mpg321`text_to_speech("Hello, this is a test.")
完全离线方案:使用espeak
sudo apt install espeak
import subprocessdef text_to_speech_offline(text):subprocess.run(["espeak", text])text_to_speech_offline("Hello offline world.")
整合全流程
将上述各环节整合,形成一个完整的离线语音识别系统:
# 伪代码,展示流程整合def main_loop():while True:# 1. 语音唤醒检测if detect_wakeup_word():# 2. 录制语音并转文字asr_text = record_and_recognize_speech()# 3. 指令识别action = recognize_command(asr_text)# 4. 执行指令(可选)if action != "unknown_command":execute_action(action)# 反馈(可选文字转语音)feedback_text = get_feedback_text(action)text_to_speech_offline(feedback_text)else:text_to_speech_offline("Command not recognized.")# 实现各函数...
结论
本文详细介绍了在Ubuntu20.04系统下,使用Python实现全流程离线语音识别的步骤,包括语音唤醒、语音转文字、指令识别及文字转语音。通过结合pocketsphinx、vosk、自定义指令识别逻辑及espeak等工具,我们构建了一个功能完备的离线语音交互系统。此方案适用于对隐私保护要求高、网络环境不稳定的场景,如智能家居、个人助理等。未来工作可进一步优化各环节性能,如提升语音唤醒准确率、增强指令识别的上下文理解能力等。