在Ubuntu20.04上用Python搭建全流程离线语音识别系统

在Ubuntu20.04上用Python搭建全流程离线语音识别系统

引言

在智能家居、个人助理等应用场景中,语音识别技术已成为人机交互的重要手段。然而,依赖云端服务的语音识别存在隐私泄露、网络延迟等问题。本文将详细介绍如何在Ubuntu20.04系统下,使用Python实现全流程离线语音识别,涵盖语音唤醒、语音转文字、指令识别及文字转语音四个核心环节。

准备工作

系统环境

  • 操作系统:Ubuntu20.04 LTS
  • Python版本:3.8或更高版本
  • 依赖库pyaudiovoskpocketsphinxgTTS(可选,用于TTS)、sounddevicenumpy

安装依赖

首先,更新系统软件包列表并安装必要的依赖:

  1. sudo apt update
  2. sudo apt install python3-pip python3-dev portaudio19-dev libpulse-dev

接着,使用pip安装Python依赖库:

  1. pip3 install pyaudio vosk pocketsphinx sounddevice numpy
  2. # 如需文字转语音功能,可安装gTTS(需联网下载模型,但生成语音文件后可离线使用)
  3. pip3 install gTTS

语音唤醒实现

语音唤醒(Keyword Spotting, KWS)用于在连续音频流中检测特定关键词,触发后续处理。这里我们使用pocketsphinx库实现简单的语音唤醒功能。

步骤

  1. 下载语音模型:从CMUSphinx网站下载适合的声学模型(如en-us)。

  2. 配置pocketsphinx

    1. from pocketsphinx import LiveSpeech, get_model_path
    2. import os
    3. model_path = get_model_path()
    4. speech = LiveSpeech(
    5. lm=False, keyphrase='hello computer', kws_threshold=1e-20,
    6. hmm=os.path.join(model_path, 'en-us'),
    7. dict=os.path.join(model_path, 'en-us.dict')
    8. )
    9. print("Listening for 'hello computer'...")
    10. for phrase in speech:
    11. print(f"Detected: {phrase}")
    12. # 触发后续处理
    • keyphrase:设置要检测的关键词。
    • kws_threshold:调整检测灵敏度。

语音转文字实现

语音转文字(Automatic Speech Recognition, ASR)是将语音信号转换为文本的过程。这里我们使用vosk库,它支持多种语言且离线运行。

步骤

  1. 下载vosk模型:从Vosk官网下载适合的语音识别模型(如vosk-model-small-en-us-0.15)。

  2. 使用vosk进行语音识别

    1. from vosk import Model, KaldiRecognizer
    2. import pyaudio
    3. import json
    4. model = Model("path_to_vosk_model")
    5. recognizer = KaldiRecognizer(model, 16000) # 假设采样率为16000Hz
    6. p = pyaudio.PyAudio()
    7. stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=4096)
    8. print("Listening...")
    9. while True:
    10. data = stream.read(4096)
    11. if recognizer.AcceptWaveform(data):
    12. result = recognizer.Result()
    13. print(json.loads(result)["text"])
    • 调整frames_per_buffer和采样率以匹配实际音频设备。

指令识别实现

指令识别是对语音转文字结果的进一步处理,以识别用户意图并执行相应操作。这通常涉及自然语言处理(NLP)技术。

简单指令识别示例

  1. def recognize_command(text):
  2. commands = {
  3. "turn on the light": "light_on",
  4. "turn off the light": "light_off",
  5. "what's the time": "get_time",
  6. # 添加更多指令...
  7. }
  8. for cmd, action in commands.items():
  9. if cmd in text.lower():
  10. return action
  11. return "unknown_command"
  12. # 假设从ASR获取了文本
  13. asr_text = "turn on the light"
  14. action = recognize_command(asr_text)
  15. print(f"Executing action: {action}")
  • 更复杂的指令识别可能需要使用NLP库如spaCyNLTK进行句法分析、实体识别等。

文字转语音实现

文字转语音(Text-to-Speech, TTS)是将文本转换为语音信号的过程。虽然gTTS需要联网下载语音模型,但生成语音文件后可离线播放。对于完全离线的解决方案,可考虑使用espeakfestival等工具。

使用gTTS(需初始联网)

  1. from gtts import gTTS
  2. import os
  3. def text_to_speech(text, filename="output.mp3"):
  4. tts = gTTS(text=text, lang='en')
  5. tts.save(filename)
  6. os.system(f"mpg321 {filename}") # 使用mpg321播放,需安装`sudo apt install mpg321`
  7. text_to_speech("Hello, this is a test.")

完全离线方案:使用espeak

  1. sudo apt install espeak
  1. import subprocess
  2. def text_to_speech_offline(text):
  3. subprocess.run(["espeak", text])
  4. text_to_speech_offline("Hello offline world.")

整合全流程

将上述各环节整合,形成一个完整的离线语音识别系统:

  1. # 伪代码,展示流程整合
  2. def main_loop():
  3. while True:
  4. # 1. 语音唤醒检测
  5. if detect_wakeup_word():
  6. # 2. 录制语音并转文字
  7. asr_text = record_and_recognize_speech()
  8. # 3. 指令识别
  9. action = recognize_command(asr_text)
  10. # 4. 执行指令(可选)
  11. if action != "unknown_command":
  12. execute_action(action)
  13. # 反馈(可选文字转语音)
  14. feedback_text = get_feedback_text(action)
  15. text_to_speech_offline(feedback_text)
  16. else:
  17. text_to_speech_offline("Command not recognized.")
  18. # 实现各函数...

结论

本文详细介绍了在Ubuntu20.04系统下,使用Python实现全流程离线语音识别的步骤,包括语音唤醒、语音转文字、指令识别及文字转语音。通过结合pocketsphinxvosk、自定义指令识别逻辑及espeak等工具,我们构建了一个功能完备的离线语音交互系统。此方案适用于对隐私保护要求高、网络环境不稳定的场景,如智能家居、个人助理等。未来工作可进一步优化各环节性能,如提升语音唤醒准确率、增强指令识别的上下文理解能力等。