使用OpenVINO™执行语音转文本识别

语音转文本正迅速成为日常生活的重要组成部分。无论您是想帮助司机安全地发送消息,而不必将手从方向盘上移开,还是希望让客户更容易获得东西的企业,这都是人工智能开发人员必须具备的一项关键能力。

当今语音转文本的最常见用例包括电话和会议的自动转录。但是,将其作为大型服务的一部分实施也是一种持续的趋势。例如,语音转文本技术可以与机器翻译服务配对,以自动创建其他语言的视频字幕。

在本指南中,我将向您展示如何使用OpenVINO™轻松地对语音转文本识别模型运行推理,以便您可以开始在自己的应用程序中应用此功能。

在本演示中,我们将使用Quartznet 15x15模型来执行自动语音识别。此特定模型基于Jasper,这是一种使用连接主义时间分类(CTC)损失训练的神经声学端到端架构。

演示的第一步导入各种函数并声明程序的变量。它还指定模型精度(在本例中为FP16)并为模型命名。

代码的下一部分检查是否需要下载模型,并为此创建子目录结构。在这种情况下,正在下载的quartznet-15x5-en模型来自开放模型群,必须转换为中间表示(IR)。

# Check if model is already downloaded in download directory
path_to_model_weights = Path(f'{download_folder}/public/{model_name}/models')
downloaded_model_file = list(path_to_model_weights.glob('*.pth'))

if not path_to_model_weights.is_dir() or len(downloaded_model_file) == 0:
    download_command = f"omz_downloader --name {model_name} --output_dir {download_folder} --precision {precision}"
    ! $download_command
    
# Check if model is already converted in model directory
path_to_converted_weights = Path(f'{model_folder}/public/{model_name}/{precision}/{model_name}.bin')

if not path_to_converted_weights.is_file():
    convert_command = f"omz_converter --name {model_name} --precisions {precision} --download_dir {download_folder} --output_dir {model_folder}"
    ! $convert_command

转换过程由Model Converter omz_converter(一个openvino-dev包命令行工具)处理。它将预先训练的PyTorch模型转换为ONNX格式,然后将其转换为英特尔的OpenVINO格式(中间表示或IR文件)。这两个步骤在同一函数中处理。

完成此操作后,演示将加载音频文件并定义用于语音识别的字母表。支持多种音频格式,包括WAVFLACOGG

一旦转换为OpenVINO格式,预处理的音频就会转换为Mel Spectrum,它使用刻度来教计算机如何像人类一样聆听。这样可以更轻松地处理数据并产生更好的性能。要全面深入了解梅尔频谱图及其在深度学习中的各种用途,请阅读本文

注意:音频必须为16KHz格式才能转换。

def audio_to_mel(audio, sampling_rate):
    assert sampling_rate == 16000, "Only 16 KHz audio supported"
    preemph = 0.97
    preemphased = np.concatenate([audio[:1], audio[1:] - preemph * audio[:-1].astype(np.float32)])
    
    # Calculate window length
    win_length = round(sampling_rate * 0.02)
    
    # Based on previously calculated window length run short-time Fourier transform
    spec = np.abs(librosa.core.spectrum.stft(preemphased, n_fft=512, hop_length=round(sampling_rate * 0.01), win_length=win_length, center=True, window=scipy.signal.windows.hann(win_length), pad_mode='reflect'))
    
    # Create mel filter-bank, produce transformation matrix to project current values onto Mel-frequency bins
    mel_basis = librosa.filters.mel(sampling_rate, 512, n_mels=64, fmin=0.0, fmax=8000.0, htk=False)
    return mel_basis, spec
    
    def mel_to_input(mel_basis, spec, padding=16):
        # Convert to logarithmic scale
        log_melspectrum = np.log(np.dot(mel_basis, np.power(spec, 2)) + 2 ** -24)
        
        # Normalize output
        normalized = (log_melspectrum - log_melspectrum.mean(1)[:, None]) / (log_melspectrum.std(1)[:, None] + 1e-5)
        
        # Calculate padding
        remainder = normalized.shape[1] % padding
        if remainder != 0:
            return np.pad(normalized, ((0, 0), (0, padding - remainder)))
    [None]
        return normalized[None]

此代码块在加载模型之前运行必要的转换。最终用户可以选择以CPUGPUMYRIAD(神经计算棒2)为目标。如果设置为AUTO,系统将选择自己的目标设备以获得最佳性能。

要初始化和加载网络,请参阅下面的代码示例。默认情况下,模型将在CPU上执行,但您可以选择在CPUGPUMYRIAD上手动运行工作负载。下面的打印(即available_devices)命令将列出可以执行工作负载的所有位置。要更改目标设备,请更改下面的device_name(当前设置为CPU)。

ie = Core()

print(ie.available_devices)

model = ie.read_model(model=f"{model_folder}/public/{model_name}/{precision}/{model_name}.xml")
model_input_layer = model.input(0)
shape = model_input_layer.partial_shape
shape[2] = -1
model.reshape({model_input_layer: shape})
compiled_model = ie.compile_model(model=model, device_name="CPU")

output_layer_ir = compiled_model.output(0)

character_probabilities = compiled_model([audio])[output_layer_ir]

output_layer_ir是网络输出节点的句柄。推理完成后,必须读取数据并将其转换为更人性化的格式。

默认输出为字母表中每个符号提供每帧概率。这些概率必须通过联结主义时间分类(CTC)函数进行解码。编码的字母表是0 =空格,126 = “a”“z”27=撇号,28 = CTC空白符号。

下面的代码符号处理字母解码:

def ctc_greedy_decode(predictions):
    previous_letter_id = blank_id = len(alphabet) - 1
    transcription = list()
    for letter_index in predictions:
        if previous_letter_id != letter_index != blank_id:
            transcription.append(alphabet[letter_index])
        previous_letter_id = letter_index
    return ''.join(transcription)

至此,识别过程就完成了!

语音转文本和文本转语音功能预计将在未来几年变得更加普遍,因为越来越多的企业将人工智能用于各种面向客户的功能。我们希望这篇博文和随附的代码示例对您自己对该主题的探索有所帮助。

资源

本文最初发表于https://medium.com/openvino-toolkit/performing-speech-to-text-recognition-with-openvino-897dd501f86a

https://www.codeproject.com/Articles/5337279/Performing-Speech-to-Text-Recognition-with-OpenVIN

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值