解决 PocketSphinx 中文模型缺失导致的无法实现语音识别

PocketSphinx是Sphinx旗下一个开源的语音识别引擎,字如其名,pocket说明该引擎适用于一些资源受限的环境,比如嵌入式设备,移动设备。因为它对计算资源的需求相对较低,本文我们来使用这个工具来实现一下**STT(Speech to Text)**语音转文本。

环境配置

SpeechRecognition是Sphinx调用pocketsphinx的一个外部API接口,如果要正常使用,二者必须同时安装。

bash 复制代码
pip install SpeechRecognition pocketsphinx

下载完成后,使用os.startfile打开pocketsphinx-data这个目录

python 复制代码
import os
import speech_recognition as sr
folder_path=os.path.join(os.path.dirname(sr.__file__),'pocketsphinx-data')
os.startfile(folder_path)

不难发现,这里边除了en-US这个模型以外毛都没有,也就是说该库默认只支持英文

如果需要识别中文,需要我们前往官网额外下载中文的语言和声学模型,并放在该目录下。

中文语音识别模型下载

点击下方链接,前往Speech Recognition Toolkit官网

https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/

点击Mandarian

点击cmusphinx-zh-cn-5.2tar.gz

路径配置

下载解压后的目录belike:

对比一下pocketsphinx-data内en-US内的目录:

显然,直接将解压得到的cmusphinx-zh-cn-5.2改名为zh-CN放到pocketsphinx-data内与en-US并列是不行的。这里,这里我们照猫画虎,将上边目录下的每个文件名都改成下边en-US内的格式,也就是:

zh-cn.dic----->pronounciation.dict

zh_cn.lm.bin---->language-model.lm.bin

zh_cn.cd_cont_5000---->acoustic-model

改名前:

改名后:

接着将文件夹改名为zh-CN,并将其移动到放在前边说到的pocketsphinx-data这个目录下,找不到直接运行下边的代码:

python 复制代码
import os
import speech_recognition as sr
folder_path=os.path.join(os.path.dirname(sr.__file__),'pocketsphinx-data')
os.startfile(folder_path)

也就是这个样子,然后便可以正常使用了

输入音频文件

SpeechRecognition内的语音识别方法或函数所支持的输入音频的格式必须是.wav,一般我们使用手机或电脑采集的录音的格式是.mp3或.m4a,无法直接传入使用。需要进行转换,说到音视频格式转换,那就不得不提到ffmpeg了,关与ffmpeg的配置方法,可以看我之前的这篇博客:

ffmpeg环境配置https://mrcrab.blog.csdn.net/article/details/148876751

ffmpeg格式转换

环境配置好后,在cmd终端中运行下方命令便可以实现.m4a-.wav的格式转换,当然.mp3类型文件也是支持的:

bash 复制代码
ffmpeg -i input.mp3 -ar 16000 -ac 1 output.wav

命令行中每个参数的具体含义:

  • -i :指定输入音频的文件路径
  • -ar:指定采样频率
  • -ac 1:指定输出音频通道为单通道
  • output.wav:输出的wav音频路径

这里之所以设定采样率是160kHZ,主要是因为​人类正常语音的主要频率范围 ​300Hz - 3400Hz根据​奈奎斯特采样定理 ​:要准确重建信号,采样率必须至少是信号最高频率的2倍,3400Hz × 2 = 6800Hz, 而实际生活中常常采用 ​8kHz ​(电话质量)或 ​16kHz​ 来获得更好质量。

批量格式转换

经常看我博客的朋友肯定知道,对于这种频繁使用命令行的常见,完全可以直接写出一个python代码来实现批量的格式转换。实现思路很简单,使用subprocess即可:

python 复制代码
import os
import subprocess
from concurrent.futures import ThreadPoolExecutor

def convert_mp3_to_wav(input_file,output_dir="",sample_rate=16000,channels=1):
    '''使用ffmpeg转换单个mp3或m4a到WAV'''
    os.makedirs(output_dir, exist_ok=True)
    output_file = os.path.join(
        output_dir,
        os.path.splitext(os.path.basename(input_file))[0]+".wav"
    )
    command=[
        "ffmpeg",
        "-i", input_file,         
        "-ar", str(sample_rate),   
        "-ac", str(channels),   
        output_file
    ]
    subprocess.run(command,check=True,capture_output=True)
    return input_file

def batch_convert(input_dir,output_dir="output_wav"):
    '''
    Args:
        input_dir:所有mp3或m4a类型文件存放文件夹路径
        output_dir:转换格式后的wav类型文件存放路径
    '''
    input_files=[
        os.path.join(input_dir, f) 
        for f in os.listdir(input_dir) 
        if f.lower().endswith(".mp3") or f.lower().endswith('.m4a')]
    if input_files:
        with ThreadPoolExecutor() as executor:
            executor.map(lambda f: convert_mp3_to_wav(f, output_dir),input_files)
batch_convert(input_dir='m4aFiles',output_dir='wavFiles')

转换结果:

语音识别

运行下方代码,即可调用sphinx的API实现语音识别

python 复制代码
import speech_recognition as sr
r=sr.Recognizer()
audio_file = 'wavFiles\普通话严重背景噪音.wav'
with sr.AudioFile(audio_file) as source:
    r.adjust_for_ambient_noise(source)
    audio_data = r.record(source)
    try:
        full_result = r.recognize_sphinx(audio_data, language='zh-CN')
        print("完整结果对象:", full_result)
    except sr.UnknownValueError:
        print("Sphinx API无法识别音频")
    except sr.RequestError as e:
        print(f"无法从Sphinx API获取结果; {e}")

运行结果:

总结:

以上便是本文所有内容,后边有空还会继续分享语音识别相关内容,如果本文对你有用,还请一键三连支持一下博主!

相关推荐
weiwei2284414 小时前
开源语音识别FunASR入门详解
语音识别·funasr
龙腾-虎跃9 天前
FreeSWITCH FunASR语音识别模块
人工智能·语音识别·xcode
东方佑10 天前
从音频到Token:构建原神角色语音识别模型的完整实践
人工智能·音视频·语音识别
一条数据库11 天前
南京方言数据集|300小时高质量自然对话音频|专业录音棚采集|方言语音识别模型训练|情感计算研究|方言保护文化遗产数字化|语音情感识别|方言对话系统开发
人工智能·音视频·语音识别
殷忆枫12 天前
基于STM32的智能语音识别饮水机系统设计
stm32·嵌入式硬件·语音识别
SmartJavaAI13 天前
Java调用Whisper和Vosk语音识别(ASR)模型,实现高效实时语音识别(附源码)
java·人工智能·whisper·语音识别
MYZR114 天前
现代农业自动化的技术演进与应用
自动化·语音识别
bst@微胖子16 天前
WGAI项目图像视频语音识别功能
人工智能·语音识别·xcode
东风西巷16 天前
Balabolka:免费高效的文字转语音软件
前端·人工智能·学习·语音识别·软件需求