提问人:usermajuser 提问时间:11/15/2023 最后编辑:usermajuser 更新时间:11/18/2023 访问量:131
在 RPi3B+ 上使用 Google Cloud SpeechRecognition 和 python 3.9 时延迟 80 秒
80 second delay using Google Cloud SpeechRecognition with python 3.9 on RPi3B+
问:
我正在使用 PyPi 代码 ( https://pypi.org/project/SpeechRecognition/)
- 已清理为仅使用 Google Cloud SpeechRecognition。
- Google Json Credentials在shell的环境中,并且正在工作。
我已启用 Cloud Speech-to-Text API,获取了 Json 凭据,并且服务调用正在命中 API。麦克风很好,录音位发生得很快。
但是,执行 API 调用需要整整 80 秒!
我已经监控了网络流量,我可以看到 API 连接有点空闲了 78 秒,然后在最后 2 秒内 TX/RX 非常快。我怎样才能加快速度?
我可以修复慢速身份验证握手吗?
详细信息:我的应用程序执行 3 次 API 调用:Google Speech-to-text |Google 翻译文本转文本 |谷歌文字转语音。这些 API 调用总是分别需要 80 秒、20 秒和 80 秒。
谢谢!
延迟发生在倒数第二行:
print("0 seconds")
try:
print("Google Cloud Speech thinks you said " + r.recognize_google_cloud(audio)
print("80th second")
答:
它是SSL证书;我的光纤路由器 (Sagemcom) 阻止了 Pi 的 SSL 证书,或强制它进入不同的端口,造成了巨大的延迟
从下面的故障排除步骤中,您会发现一些与网络配置、SSL/TLS 握手和详细的网络分析相关的步骤,这些步骤应该会有所帮助:
openssl
测试与 Google API 的 SSL 连接时间- Wireshark,用于网络相关问题
- 更改网络环境(有助于隔离问题)
疑难解答步骤
我假设 Raspberry Pi 具有稳定的网络连接。不过,请检查DNS设置是否是快速解决问题的最佳选择。
# Check current DNS configuration
cat /etc/resolv.conf
# Change DNS server if necessary (e.g., to Google's 8.8.8.8)
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
您还可以测量与 Google API 的 SSL 连接时间(openssl s_client
)。
# Check SSL handshake time
openssl s_client -connect speech.googleapis.com:443
如果音频文件很大,请尝试压缩音频文件,这可能会减少上传时间。
# Example: Compressing audio file before upload (pseudo-code)
import audio_compression_library
compressed_audio = audio_compression_library.compress(audio)
如果尚未使用异步识别方法,请切换到异步识别方法。
# Example: Asynchronous call to Google Speech-to-Text API (pseudo-code)
recognize_future = r.recognize_google_cloud_async(audio)
result = recognize_future.result()
确认身份验证方法有效且不会导致延迟。
分析 Python 脚本以识别任何瓶颈。
# Install profiling tool
pip install line_profiler
# Run the profiler
kernprof -l -v your_script.py
我使用 PyPi SpeechRecognition 代码直接从麦克风获取音频 - 通常为 2 或 3 秒长。我还尝试使用 Google Library 示例传递 ~16,000KB 大小的 Google API 16hz WAV 文件(Linear16)。两者都有效。两者都需要 80 秒。使用 WiFi 在 ~max 距离 + 使用有线以太网到光纤路由器进行测试:每次 80 秒!
这意味着问题与音频文件格式或网络速度无关,而是与 Raspberry Pi 设置和 Google Cloud Speech-to-Text API 之间的交互更内在的问题有关。
确保音频参数始终设置为 Google API 的最佳值(例如,16kHz 采样率、Linear16 格式)。
您可以在 Python 脚本中添加一个步骤,以便在将音频发送到 API 之前始终将音频转换为此格式。
# Example: Converting audio to 16kHz Linear16 format (pseudo-code)
import audio_format_converter
formatted_audio = audio_format_converter.convert_to_linear16(audio, sample_rate=16000)
由于问题在不同的网络中仍然存在,因此问题可能出在 API 请求的构造或处理方式上。尝试降低请求的复杂性或将其分解为更小的部分。
Raspberry Pi 中可能存在特定配置或限制,导致延迟。检查是否有任何可能影响性能的后台进程或资源限制。
我的应用程序执行 3 个 API 调用: Google Speech-to-text |Google 翻译文本转文本 |谷歌文字转语音。这些 API 调用总是分别需要 80 秒、20 秒和 80 秒。
应用对 Google 服务的 API 调用中延迟的持续时间一致且具体(语音转文本为 80 秒,翻译为 20 秒,文本转语音为 80 秒)表明,这种模式可能植根于 Raspberry Pi 或网络基础架构中处理这些调用的方式。
在 API 调用期间,使用监控工具观察 Raspberry Pi 上的 CPU 使用率、内存和网络活动。这可能会揭示资源瓶颈。
关于 Google Speech-to-Text(80 秒延迟),如前所述,实现异步调用以查看它是否减少了等待时间。在将音频数据发送到 API 之前,请考虑将音频数据分解为较小的段,因为更快地处理较小的块可能更容易。
仔细检查音频格式和采样率是否针对 Google 的 API 进行了优化。
对于谷歌翻译(延迟 20 秒),请检查正在翻译的文本的大小是否会影响响应时间。尝试使用较短和较长的文本,看看是否有模式。由于此服务的延迟似乎较短,因此可能与网络延迟有关。详细的网络分析可能会揭示更多见解。
对于 Google 文本转语音(延迟 80 秒),使用不同复杂程度的文本进行测试,看看它是否会影响处理时间。与语音转文本类似,请确保请求的格式最佳,并且不包含不必要的数据或标头。
对于这三种服务,语音转文本和文本转语音都恰好需要 80 秒这一事实可能表明存在共同的瓶颈,可能是音频数据的处理方式。确定在 Raspberry Pi 上本地处理数据所花费的时间与云处理和网络传输所花费的时间。这可以通过对应用程序工作流的不同阶段进行计时来完成。
并验证您的 API 密钥是否配置正确,并且您没有达到任何可能限制请求速度的使用配额或限制。
如果可能,请在不同的平台或设备上运行相同的应用程序。如果延迟明显不同,则可能表明特定于 Raspberry Pi 的硬件或配置的问题。
评论
问题解决了!它是SSL证书;花束@Dean Van Greune & @VonC 我的光纤路由器 (Sagemcom) 阻止了 Pi 的 SSL 证书,或强制将其连接到不同的端口,从而造成了大量延迟。我记得不久前为JavaMail TLS解决了同样的问题,并希望将球棒带到路由器(“Office Space”风格)。 切换到手机上的热点,现在所有这一切都比最轻的闪电工作得更快。 谢谢你们的帮助和建议!!
评论