You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于为Pepper机器人接入大词汇量在线语音识别API的技术问询

问题描述

我希望让Pepper机器人具备使用大词汇量列表进行语音识别并转文字的能力。能否通过Google speech-to-text API等外部API获取词汇列表,提供给setVocabulary方法,从而无需手动设置待识别的词语和短语?实现类似Python库speech_recognition中recognize_google方法的功能。
或者我的实现思路有误?欢迎提供替代方案。

当前配置

我目前使用Aldebaran软件的ALSpeechRecognition API,通过其setVocabulary方法设置待识别短语列表。我订阅了WordRecognized事件以存储识别到的词语或短语,并通过ALMemory API的getData方法获取识别结果。

当前Python脚本
#!/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的音频

这是实现通用大词汇量转写的最优路径,步骤如下:

  1. 使用Pepper的ALAudioDevice API获取麦克风音频流(或录制音频文件)
  2. 将音频格式转换为Google Speech-to-Text支持的格式(如WAV,16kHz单声道)
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:53:21