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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:27:34