使用 Python 进行 AI – 语音识别
使用 Python 进行现代 AI – 语音识别
Section titled “使用 Python 进行现代 AI – 语音识别”在本章中,我们将使用 Python 探索迷人的
语音是人类交流的基础。
首先, 自动语音识别 (ASR),它允许机器将语音中的词、短语和句子转录成文本。其次, 自然语言处理 (NLP),使机器能够理解转录文本背后的含义和意图。第三, 语音合成 (Text-to-Speech, TTS),它允许机器从文本生成类似人类的语音。
本章主要关注
理解和构建语音识别器
Section titled “理解和构建语音识别器”开发语音识别系统的挑战
Section titled “开发语音识别系统的挑战”词汇量大小:针对小而固定词汇(例如语音菜单中的“是”、“否”、“下一项”)设计的系统,比针对大词汇量(例如包含数万词汇的通用听写)设计的系统更容易构建。 通道和录音质量:来自近距离麦克风的高保真音频比来自远距离麦克风或低带宽电话通话的嘈杂音频更容易处理。 说话模式:孤立的词语比连贯的词语(短语)或连续的、会话性的语音更容易识别,会话性语音通常包含不流畅和语速变化(coarticulation)。 说话风格:朗读的语音(例如有声书)通常比自发的、会话性的语音更清晰、更正式,后者更具挑战性。 说话人变异性:系统可以是说话人依赖型的(为特定用户训练),说话人自适应型的(随时间适应新用户),或说话人独立型的(旨在适用于任何用户)。说话人独立型系统最复杂,但也最通用。 噪声水平: 信噪比 (SNR)显著影响性能。高 SNR (>30dB) 环境是理想的,而低 SNR (<10dB) 且有明显背景噪音的环境则是一个主要障碍。口音和方言:地区口音、方言和个人说话习惯增加了复杂性。
可视化和理解音频信号
Section titled “可视化和理解音频信号”数字音频基础
Section titled “数字音频基础”采样:模拟信号以规则间隔进行采样。每秒的样本数是 采样率 (例如,CD 质量为 44100 Hz,语音常用 16000 Hz)。更高的采样率捕获更多细节。量化:每个样本的 振幅 被映射到一个离散的数值。位深 (例如 16 位、24 位)决定了这些值的分辨率。
librosa 库,这是一个用于音频和音乐分析的强大 Python 包。如果您尚未安装它,可以使用 pip 进行安装:
pip install librosa matplotlib numpy示例:加载和可视化音频文件
Section titled “示例:加载和可视化音频文件”example_audio.wav 的音频文件,或提供正确的路径。
import librosaimport librosa.displayimport matplotlib.pyplot as pltimport numpy as nplibrosa.load() 返回音频时间序列(作为 NumPy 数组)和
# Replace 'example_audio.wav' with the path to your audio fileaudio_file_path = 'example_audio.wav'
try: audio_signal, sampling_rate = librosa.load(audio_file_path, sr=None) # sr=None to preserve original sampling rateexcept FileNotFoundError: print(f"Error: The file {audio_file_path} was not found.") print("Please ensure you have a valid audio file and path.") # As a fallback for the tutorial, create a dummy signal if file not found sampling_rate = 22050 # A common default duration = 3 # seconds audio_signal = np.sin(2 * np.pi * 440 * np.linspace(0, duration, int(sampling_rate * duration))) print("Using a dummy sine wave for demonstration.")
print(f'Signal Shape: {audio_signal.shape}')print(f'Sampling Rate (Hz): {sampling_rate}')print(f'Signal Datatype: {audio_signal.dtype}')print(f'Signal Duration (s): {librosa.get_duration(y=audio_signal, sr=sampling_rate):.2f}')librosa.load
plt.figure(figsize=(12, 4))librosa.display.waveshow(audio_signal, sr=sampling_rate)plt.xlabel('Time (s)')plt.ylabel('Amplitude')plt.title('Audio Waveform')plt.tight_layout()plt.show()Signal Shape: (some_number,)Sampling Rate (Hz): your_audio_sampling_rate (e.g., 22050 or 44100)Signal Datatype: float32Signal Duration (s): duration_of_your_audio_file (e.g., 3.00 seconds)转换到频域:声谱图
Section titled “转换到频域:声谱图”示例:生成和可视化声谱图
Section titled “示例:生成和可视化声谱图”audio_signal 和 sampling_rate:
# Compute STFTstft_signal = librosa.stft(audio_signal)
# Convert amplitude to decibels (dB) for better visualizationस्पेक्टrogram_db = librosa.amplitude_to_db(abs(stft_signal), ref=np.max)
# Plot the spectrogramplt.figure(figsize=(12, 6))librosa.display.specshow(स्पेक्टrogram_db, sr=sampling_rate, x_axis='time', y_axis='hz') # or y_axis='log' for logarithmic frequencyplt.colorbar(format='%+2.0f dB')plt.title('Spectrogram (Hz scale)')plt.tight_layout()plt.show()# Compute Mel spectrogrammel_spectrogram = librosa.feature.melspectrogram(y=audio_signal, sr=sampling_rate, n_mels=128, fmax=8000) # n_mels: number of Mel bandsmel_spectrogram_db = librosa.power_to_db(mel_spectrogram, ref=np.max)
# Plot the Mel spectrogramplt.figure(figsize=(12, 6))librosa.display.specshow(mel_spectrogram_db, sr=sampling_rate, x_axis='time', y_axis='mel', fmax=8000)plt.colorbar(format='%+2.0f dB')plt.title('Mel Spectrogram')plt.tight_layout()plt.show()生成一个简单的音频信号
Section titled “生成一个简单的音频信号”soundfile 库进行保存(因为 scipy.io.wavfile.write 处理浮点数据或归一化有时会比较麻烦)。
soundfile,请安装:pip install soundfile
pip install soundfileimport numpy as npimport matplotlib.pyplot as pltimport soundfile as sf # For saving audio files
# Parameters for the toneduration_tone = 3 # secondssampling_rate_tone = 44100 # Hzfrequency_tone = 440 # Hz (A4 note)
# Generate time axistime_axis = np.linspace(0, duration_tone, int(sampling_rate_tone * duration_tone), endpoint=False)
# Generate sine wavetone_signal = 0.5 * np.sin(2 * np.pi * frequency_tone * time_axis) # 0.5 amplitude to avoid clipping
# Save the generated audio to a fileoutput_file = 'generated_tone.wav'try: sf.write(output_file, tone_signal, sampling_rate_tone) print(f"Generated tone saved to {output_file}")except Exception as e: print(f"Error saving audio file: {e}")
# Visualize a small portion of the generated signalplt.figure(figsize=(10, 4))plt.plot(time_axis[:500], tone_signal[:500]) # Plot first 500 samplesplt.xlabel('Time (s)')plt.ylabel('Amplitude')plt.title(f'Generated Sine Wave ({frequency_tone} Hz)')plt.grid(True)plt.show()语音特征提取:MFCCs
Section titled “语音特征提取:MFCCs”示例:使用 Librosa 提取 MFCCs
Section titled “示例:使用 Librosa 提取 MFCCs”audio_signal 和 sampling_rate:
# Extract MFCCs# Common parameters: n_mfcc (number of coefficients), hop_length, win_lengthmfccs = librosa.feature.mfcc(y=audio_signal, sr=sampling_rate, n_mfcc=13)
print(f'MFCCs Shape: {mfccs.shape}') # (n_mfcc, number_of_frames)
# Visualize the MFCCsplt.figure(figsize=(12, 4))librosa.display.specshow(mfccs, sr=sampling_rate, x_axis='time')plt.colorbar()plt.title('MFCCs')plt.tight_layout()plt.show()mfccs n_mfcc 行(系数)和与时间帧对应的列数。该
MFCCs Shape: (13, number_of_frames_in_your_audio)使用 SpeechRecognition 库进行语音识别
Section titled “使用 SpeechRecognition 库进行语音识别”SpeechRecognition 库提供了一种方便的方式来使用各种
pip install SpeechRecognition PyAudio(PyAudio 需要用于PyAudio 时遇到问题,请查阅其文档以获取特定平台的说明(例如,在 Windows 上您可能需要预编译的二进制文件,或者在 Linux 上需要 portaudio 开发库)。
示例:从麦克风识别语音
Section titled “示例:从麦克风识别语音”import speech_recognition as sr
# Initialize the recognizerrecognizer = sr.Recognizer()
# Use the default microphone as the audio sourcewith sr.Microphone() as source: print("正在校准麦克风以适应环境噪音... 请稍候。") # Adjust for ambient noise for 1-2 seconds for better accuracy recognizer.adjust_for_ambient_noise(source, duration=1) print("麦克风已校准。请清晰地说些话!")
try: audio_data = recognizer.listen(source, timeout=5, phrase_time_limit=10) # Listen for up to 5s, max 10s phrase print("正在识别您的语音...")
# Recognize speech using Google Web Speech API text = recognizer.recognize_google(audio_data) print(f"您说的是:{text}")
except sr.WaitTimeoutError: print("在超时时间内未检测到语音。") except sr.UnknownValueError: print("Google Web Speech API 无法理解音频。") except sr.RequestError as e: print(f"无法从 Google Web Speech API 请求结果;{e}") except Exception as e: print(f"发生了一个意外错误:{e}")正在校准麦克风以适应环境噪音... 请稍候。麦克风已校准。请清晰地说些话!(您说:“Hello world AI”)正在识别您的语音...您说的是:hello world AI从音频文件识别语音
Section titled “从音频文件识别语音”# Assuming 'example_audio.wav' is a clear recording of speechaudio_file_for_recognition = 'example_audio.wav'
with sr.AudioFile(audio_file_for_recognition) as source: try: audio_data_file = recognizer.record(source) # Read the entire audio file print(f"正在识别音频文件 {audio_file_for_recognition} 中的语音...") text_from_file = recognizer.recognize_google(audio_data_file) print(f"音频文件包含:{text_from_file}") except FileNotFoundError: print(f"错误:未找到文件 {audio_file_for_recognition}。") except sr.UnknownValueError: print("Google Web Speech API 无法理解文件中的音频。") except sr.RequestError as e: print(f"无法从 Google Web Speech API 请求结果;{e}") except Exception as e: print(f"发生了一个意外错误:{e}")SpeechRecognition 库也支持其他引擎。例如,recognizer.recognize_sphinx(audio_data) 可用于使用 CMU Sphinx 进行PocketSphinx:pip install pocketsphinx)。这对于没有互联网访问或出于隐私考虑的应用非常有用。
- Librosa Documentation: [https://librosa.org/doc/latest/index.html]
(Librosa 文档) - SpeechRecognition Library Documentation: [https://pypi.org/project/SpeechRecognition/]
(SpeechRecognition 库文档) - A beginner’s guide to STFT: [https://www.gaussianwaves.com/2015/11/interpreting-fft-results-obtaining-magnitude-and-phase-information/]
(STFT 入门指南) - Introduction to MFCC: [https://wiki.aalto.fi/display/ITSP/Mel-frequency+cepstral+coefficient+(MFCC)]
(MFCC 简介)