关于为Pepper机器人接入大词汇量在线语音识别API的技术问询
我希望让Pepper机器人具备使用大词汇量列表进行语音识别并转文字的能力。能否通过Google speech-to-text API等外部API获取词汇列表,提供给setVocabulary方法,从而无需手动设置待识别的词语和短语?实现类似Python库speech_recognition中recognize_google方法的功能。
或者我的实现思路有误?欢迎提供替代方案。
我目前使用Aldebaran软件的ALSpeechRecognition API,通过其setVocabulary方法设置待识别短语列表。我订阅了WordRecognized事件以存储识别到的词语或短语,并通过ALMemory API的getData方法获取识别结果。
#!/usr/bin/env python2.7 from naoqi import ALProxy import time ROBOT_IP = "130.191.48.26" # Creates a proxy on the speech-recognition module asr = ALProxy("ALSpeechRecognition", ROBOT_IP, 9559) mem = ALProxy("ALMemory", ROBOT_IP, 9559) asr.setLanguage("English") # Example: Adds "yes", "no" and "please" to the vocabulary (without wordspotting) vocabulary = ["yes", "no", "please listen to me","okay"] asr.setVocabulary(vocabulary, False) # Start the speech recognition engine with user Test_ASR asr.subscribe("WordRecognized") print('Speech recognition engine started') time.sleep(5) word = mem.getData("WordRecognized") print(word) asr.unsubscribe("WordRecognized")
核心问题分析
你的思路存在误区:Google Speech-to-Text这类API本身是端到端的语音转文字服务,并不提供"词汇列表"供ALSpeechRecognition调用——它的作用是直接处理音频流返回识别文本,和Pepper自带的ALSpeechRecognition是平行的两个语音识别方案,而非互补关系。
ALSpeechRecognition的setVocabulary设计初衷是小范围关键词识别,强行传入大词汇量会导致识别准确率暴跌,甚至完全无法工作,因为它的模型是针对有限短语优化的,不支持通用语音转写。
可行解决方案
方案1:绕过ALSpeechRecognition,直接用Google Speech-to-Text处理Pepper的音频
这是实现通用大词汇量转写的最优路径,步骤如下:
- 使用Pepper的
ALAudioDeviceAPI获取麦克风音频流(或录制音频文件) - 将音频格式转换为Google Speech-to-Text支持的格式(如WAV,16kHz单声道)
- 调用Google Speech-to-Text API的
recognize接口处理音频,直接获取完整转写文本
示例代码片段(需安装google-cloud-speech和pyaudio):
from naoqi import ALProxy from google.cloud import speech_v1p1beta1 as speech import pyaudio import io ROBOT_IP = "130.191.48.26" audio_proxy = ALProxy("ALAudioDevice", ROBOT_IP, 9559) # 配置音频录制参数 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 CHUNK = 1024 RECORD_SECONDS = 5 audio = pyaudio.PyAudio() stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("Recording...") frames = [] for _ in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("Finished recording.") stream.stop_stream() stream.close() audio.terminate() # 转换为Google API支持的音频对象 audio_content = b''.join(frames) client = speech.SpeechClient() audio = speech.RecognitionAudio(content=audio_content) config = speech.RecognitionConfig( encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16, sample_rate_hertz=16000, language_code="en-US" ) # 调用API获取转写结果 response = client.recognize(config=config, audio=audio) for result in response.results: print(f"Transcript: {result.alternatives[0].transcript}")
方案2:使用Pepper的ALAutomaticSpeechRecognition(仅部分固件支持)
部分新版本的Pepper固件提供了ALAutomaticSpeechRecognition模块,支持通用大词汇量语音转写,无需手动设置词汇表。使用方式如下:
from naoqi import ALProxy import time ROBOT_IP = "130.191.48.26" asr = ALProxy("ALAutomaticSpeechRecognition", ROBOT_IP, 9559) mem = ALProxy("ALMemory", ROBOT_IP, 9559) asr.setLanguage("English") asr.subscribe("ASR_User") print("通用语音识别已启动") time.sleep(5) # 获取完整转写文本 result = mem.getData("AutomaticSpeechRecognition/Status") print(f"识别结果: {result}") asr.unsubscribe("ASR_User")
注意:需要确认你的Pepper固件版本是否支持该模块,旧版本可能没有此功能。
方案3:自定义大词汇量关键词识别(仅适用于特定场景)
如果必须使用ALSpeechRecognition,可以通过加载预定义的行业词汇表(如从本地文件读取)来扩展词汇,但需注意:
- 词汇量不宜超过500个短语,否则准确率会急剧下降
- 优先使用短短语,避免长句
- 启用词点检测(
setVocabulary第二个参数设为True)可以提升长词汇的识别率
示例:从文本文件加载词汇表
# 读取本地词汇文件,每行一个短语 with open("vocabulary.txt", "r") as f: vocabulary = [line.strip() for line in f if line.strip()] asr.setVocabulary(vocabulary, True)
内容的提问来源于stack exchange,提问作者distro

