Deepgram API调用遇SSL协议错误求助(Python3.11.6+Ubuntu23.10)
问题:Deepgram语音转写接口出现SSL协议错误
环境信息
- 64位Ubuntu 23.10系统
- Python 3.11.6
- Deepgram API v2.12.0
- 已配置venv虚拟环境,所有依赖包已更新至最新版本
代码示例
from deepgram import Deepgram import json DEEPGRAM_API_KEY = 'XXXXX' PATH_TO_FILE = '/home/dave/Downloads/harvard.wav' MIMETYPE = 'audio/wav' def main(): dg_client = Deepgram(DEEPGRAM_API_KEY) with open(PATH_TO_FILE, 'rb') as audio: source = {'buffer': audio, 'mimetype': MIMETYPE} options = {"smart_format": False, "model": "nova", "language": "en-GB"} print('Requesting transcript... for ', PATH_TO_FILE) response = dg_client.transcription.sync_prerecorded(source, options) print(json.dumps(response, indent=4)) main()
错误堆栈
Traceback (most recent call last): File "/usr/lib/python3.11/urllib/request.py", line 1348, in do_open h.request(req.get_method(), req.selector, req.data, headers, File "/usr/lib/python3.11/http/client.py", line 1286, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1332, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1281, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/lib/python3.11/http/client.py", line 1080, in _send_output self.send(chunk) File "/usr/lib/python3.11/http/client.py", line 1002, in send self.sock.sendall(data) File "/usr/lib/python3.11/ssl.py", line 1274, in sendall v = self.send(byte_view[count:]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/ssl.py", line 1243, in send return self._sslobj.write(data) ^^^^^^^^^^^^^^^^^^^^^^^^ ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:2427) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/dave/Dropbox/Code/LLM/venv/lib/python3.11/site-packages/deepgram/_utils.py", line 203, in _sync_request return attempt() ^^^^^^^^^ File "/home/dave/Dropbox/Code/LLM/venv/lib/python3.11/site-packages/deepgram/_utils.py", line 177, in attempt with urllib.request.urlopen(req, timeout=timeout) as resp: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/urllib/request.py", line 216, in urlopen return opener.open(url, data, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/urllib/request.py", line 519, in open response = self._open(req, data) ^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/urllib/request.py", line 536, in _open result = self._call_chain(self.handle_open, protocol, protocol + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/urllib/request.py", line 496, in _call_chain result = func(*args) ^^^^^^^^^^^ File "/usr/lib/python3.11/urllib/request.py", line 1391, in https_open return self.do_open(http.client.HTTPSConnection, req, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.11/urllib/request.py", line 1351, in do_open raise URLError(err) urllib.error.URLError: <urlopen error EOF occurred in violation of protocol (_ssl.c:2427)> The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/dave/Dropbox/Code/LLM/Media-Ingest/test.py", line 26, in <module> main() File "/home/dave/Dropbox/Code/LLM/Media-Ingest/test.py", line 22, in main response = dg_client.transcription.sync_prerecorded(source, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/dave/Dropbox/Code/LLM/venv/lib/python3.11/site-packages/deepgram/transcription.py", line 378, in sync_prerecorded return SyncPrerecordedTranscription( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/dave/Dropbox/Code/LLM/venv/lib/python3.11/site-packages/deepgram/transcription.py", line 121, in __call__ return _sync_request( ^^^^^^^^^^^^^^ File "/home/dave/Dropbox/Code/LLM/venv/lib/python3.11/site-packages/deepgram/_utils.py", line 209, in _sync_request raise DeepgramApiError(exc, http_library_error=exc) from exc deepgram.errors.DeepgramApiError: <urlopen error EOF occurred in violation of protocol (_ssl.c:2427)> Process finished with exit code 1
解决方案
1. 更新系统SSL库
Ubuntu 23.10自带的OpenSSL可能存在兼容性问题,先查看当前版本:
openssl version
如果版本低于3.0.7,执行以下命令更新:
sudo apt update && sudo apt install --only-upgrade openssl libssl-dev
2. 强制指定SSL协议版本
修改代码,自定义SSL上下文,禁用旧版TLS协议:
from deepgram import Deepgram import json import ssl import urllib.request DEEPGRAM_API_KEY = 'XXXXX' PATH_TO_FILE = '/home/dave/Downloads/harvard.wav' MIMETYPE = 'audio/wav' # 创建兼容的SSL上下文 ctx = ssl.create_default_context() ctx.set_ciphers('DEFAULT@SECLEVEL=1') ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 def main(): dg_client = Deepgram(DEEPGRAM_API_KEY) # 替换默认urlopen方法,注入自定义SSL上下文 original_urlopen = urllib.request.urlopen def custom_urlopen(req, timeout=None): return original_urlopen(req, context=ctx, timeout=timeout) urllib.request.urlopen = custom_urlopen with open(PATH_TO_FILE, 'rb') as audio: source = {'buffer': audio, 'mimetype': MIMETYPE} options = {"smart_format": False, "model": "nova", "language": "en-GB"} print('Requesting transcript... for ', PATH_TO_FILE) response = dg_client.transcription.sync_prerecorded(source, options) print(json.dumps(response, indent=4)) main()
3. 切换到requests库处理请求
Deepgram SDK默认使用urllib,部分环境下urllib的SSL处理存在问题,改用requests库:
首先安装requests:
pip install requests
然后修改代码,替换SDK的同步请求方法:
from deepgram import Deepgram import requests import json DEEPGRAM_API_KEY = 'XXXXX' PATH_TO_FILE = '/home/dave/Downloads/harvard.wav' MIMETYPE = 'audio/wav' # 自定义同步请求逻辑,使用requests def custom_sync_request(method, url, headers=None, data=None, timeout=10): response = requests.request(method, url, headers=headers, data=data, timeout=timeout) response.raise_for_status() return response.json() def main(): dg_client = Deepgram(DEEPGRAM_API_KEY) # 替换SDK内部的同步请求方法 dg_client.transcription._sync_request = custom_sync_request with open(PATH_TO_FILE, 'rb') as audio: source = {'buffer': audio, 'mimetype': MIMETYPE} options = {"smart_format": False, "model": "nova", "language": "en-GB"} print('Requesting transcript... for ', PATH_TO_FILE) response = dg_client.transcription.sync_prerecorded(source, options) print(json.dumps(response, indent=4)) main()
4. 检查网络代理/防火墙
如果系统使用代理或防火墙,可能拦截了SSL连接,尝试关闭代理,或者将api.deepgram.com添加到防火墙白名单。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

