从零开始:Python语音识别实战指南(附完整代码)

语音识别实战(Python代码)(一):基础环境搭建与音频处理

一、语音识别技术概述与Python生态选择

语音识别(Automatic Speech Recognition, ASR)作为人机交互的核心技术,近年来因深度学习发展取得突破性进展。Python凭借其丰富的科学计算库和简洁的语法,成为语音识别开发的理想选择。主流Python语音识别方案可分为三类:

  1. 云服务API:如Google Speech-to-Text、Azure Speech Services(本文不涉及具体厂商)
  2. 开源工具包:Kaldi、Mozilla DeepSpeech
  3. 轻量级库:SpeechRecognition(本文核心)

SpeechRecognition库的优势在于其极简的API设计和对多种后端引擎的支持(包括CMU Sphinx、Google Web Speech API等),特别适合快速原型开发。配合PyAudio进行音频采集,可构建完整的本地语音识别系统。

二、开发环境配置指南

2.1 系统要求与依赖安装

  • Python 3.6+(推荐3.8+)
  • 依赖库:
    1. pip install SpeechRecognition pyaudio

    Windows用户注意:PyAudio安装可能失败,需先下载对应版本的wheel文件(如PyAudio-0.2.11-cp38-cp38-win_amd64.whl)手动安装。

2.2 麦克风测试工具

使用以下代码验证音频设备是否正常工作:

  1. import pyaudio
  2. p = pyaudio.PyAudio()
  3. for i in range(p.get_device_count()):
  4. dev = p.get_device_info_by_index(i)
  5. print(f"{i}: {dev['name']} (输入通道: {dev['maxInputChannels']})")

正常应显示至少一个输入设备(如内置麦克风或外接USB麦克风)。

三、核心代码实现:从录音到文本转换

3.1 基础录音功能实现

  1. import pyaudio
  2. import wave
  3. CHUNK = 1024
  4. FORMAT = pyaudio.paInt16
  5. CHANNELS = 1
  6. RATE = 44100
  7. RECORD_SECONDS = 5
  8. WAVE_OUTPUT_FILENAME = "output.wav"
  9. p = pyaudio.PyAudio()
  10. stream = p.open(format=FORMAT,
  11. channels=CHANNELS,
  12. rate=RATE,
  13. input=True,
  14. frames_per_buffer=CHUNK)
  15. print("开始录音...")
  16. frames = []
  17. for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
  18. data = stream.read(CHUNK)
  19. frames.append(data)
  20. print("录音结束")
  21. stream.stop_stream()
  22. stream.close()
  23. p.terminate()
  24. wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
  25. wf.setnchannels(CHANNELS)
  26. wf.setsampwidth(p.get_sample_size(FORMAT))
  27. wf.setframerate(RATE)
  28. wf.writeframes(b''.join(frames))
  29. wf.close()

关键参数说明

  • CHUNK:每次读取的音频数据块大小,影响实时性
  • RATE:采样率(常见值16000Hz用于语音,44100Hz用于音乐)
  • FORMAT:16位整型是语音处理的常用格式

3.2 语音识别核心代码

  1. import speech_recognition as sr
  2. def recognize_speech_from_mic(recognizer, microphone):
  3. if not isinstance(recognizer, sr.Recognizer):
  4. raise TypeError("`recognizer`必须是Recognizer实例")
  5. if not isinstance(microphone, sr.Microphone):
  6. raise TypeError("`microphone`必须是Microphone实例")
  7. with microphone as source:
  8. recognizer.adjust_for_ambient_noise(source)
  9. print("请说话...")
  10. audio = recognizer.listen(source)
  11. response = {
  12. "success": True,
  13. "error": None,
  14. "transcript": None
  15. }
  16. try:
  17. response["transcript"] = recognizer.recognize_google(audio, language='zh-CN')
  18. except sr.RequestError:
  19. response["success"] = False
  20. response["error"] = "API不可用"
  21. except sr.UnknownValueError:
  22. response["error"] = "无法识别语音"
  23. return response
  24. # 使用示例
  25. r = sr.Recognizer()
  26. m = sr.Microphone()
  27. result = recognize_speech_from_mic(r, m)
  28. if result["transcript"]:
  29. print(f"识别结果: {result['transcript']}")
  30. else:
  31. print(f"错误: {result['error']}")

后端引擎选择

  • recognize_google():免费但需联网
  • recognize_sphinx():离线但准确率较低
  • recognize_bing():需API密钥(本文不展开)

四、常见问题与优化方案

4.1 环境噪音处理

  1. 动态噪音阈值调整
    1. with microphone as source:
    2. recognizer.dynamic_energy_threshold = True
    3. audio = recognizer.listen(source, timeout=5)
  2. 预加重滤波(提升高频信号):
    1. import numpy as np
    2. def pre_emphasis(signal, coeff=0.95):
    3. return np.append(signal[0], signal[1:] - coeff * signal[:-1])

4.2 性能优化技巧

  • 降低采样率:语音识别通常16kHz足够
  • 分块处理:对长音频分段识别
  • GPU加速:后续进阶篇将介绍CUDA加速方案

五、完整项目结构建议

  1. speech_recognition/
  2. ├── config.py # 配置参数
  3. ├── audio_processor.py # 音频采集与处理
  4. ├── speech_recognizer.py # 核心识别逻辑
  5. ├── utils.py # 辅助函数
  6. └── main.py # 入口程序

六、扩展方向提示

  1. 实时语音转写:结合多线程实现边录音边识别
  2. 多语言支持:通过language参数切换(如en-USja-JP
  3. 命令词识别:使用CMU Sphinx的关键词检测功能

本文提供的代码可直接运行,建议从基础录音功能开始,逐步添加识别逻辑。下一篇将深入讲解:

  • 使用深度学习模型(如DeepSpeech)
  • 实现命令词唤醒功能
  • 部署为RESTful API服务

通过系统化的实践,读者可掌握从音频采集到语义理解的全流程开发能力,为智能客服、语音助手等应用打下基础。