使用websocket-client库连接ElevenLabs WebSocket时recv()阻塞无响应的问题求助
使用websocket-client库连接ElevenLabs WebSocket时recv()阻塞无响应的问题求助
我发现ElevenLabs现在支持输入流配合流式输出功能了,但这个功能需要建立WebSocket连接。无奈项目必须用websocket-client库,而ElevenLabs官方Python客户端用的是另一个WebSocket库,所以只能自己实现WebSocket连接逻辑。
结果现在遇到了麻烦:代码里的data = json.loads(ws.recv())会一直阻塞,完全收不到任何数据。我对照官方客户端的逻辑改了好几遍,BOS、EOS和其余代码几乎都和官方一致,但就是卡在这一步,实在摸不着头脑,麻烦各位大佬帮忙看看问题出在哪!
下面是我的代码:
from websocket import create_connection, closing import json import base64 # 自定义文本分块函数(示例逻辑,实际已实现) def text_chunker(text): chunk_size = 100 for i in range(0, len(text), chunk_size): yield text[i:i+chunk_size] # BOS和EOS与ElevenLabs官方客户端代码完全一致 BOS = json.dumps({ "text": " ", "voice_settings": {"stability": 0.5, "similarity_boost": 0.5}, "generation_config": {"chunk_length_schedule": [50, 100, 150, 200]} }) EOS = json.dumps({"text": ""}) # 替换为实际的ElevenLabs WebSocket URL(需包含语音ID) ws_url = "wss://api.elevenlabs.io/v1/text-to-speech/YOUR_VOICE_ID/stream-input" with closing(create_connection(ws_url, header={"xi-api-key": "YOUR_API_KEY"})) as ws: # 发送流开始信号 ws.send(BOS) # 待转换的目标文本 text = "需要转换为语音的长文本内容" # 流式发送文本块并接收音频 for text_chunk in text_chunker(text): data = dict(text=text_chunk, try_trigger_generation=True) ws.send(json.dumps(data)) try: data = json.loads(ws.recv()) # 此处一直阻塞,无法继续执行 if data["audio"]: yield base64.b64decode(data["audio"]) # type: ignore except TimeoutError: pass # 发送流结束信号 ws.send(EOS) # 接收剩余音频数据 while True: try: data = json.loads(ws.recv()) if data["audio"]: yield base64.b64decode(data["audio"]) # type: ignore except ws.exceptions.ConnectionClosed: break
用ElevenLabs官方客户端(基于websockets.sync.client库)的话,这个流式功能完全正常,但换成websocket-client就出现了recv阻塞的问题,有没有人遇到过类似情况,或者能帮我排查下哪里的问题?
备注:内容来源于stack exchange,提问作者themweo
相关产品推荐
相关产品推荐

