功能实现,将长文本分段实时转成音频流,达到边转换边播放的效果,减少等待效果,像豆包通义千问chatgpt差不多也是这样实现的,
下面的效果展示
Z:\026-实时语音转文字>python ss实时播放.py
{'event': 'sentence_start', 'sentence_start_result': {'readable_text': '财联社9月28日电,2024清华五道口首席经济学家论坛于9月28日在北京举行。'}, 'code': 0, 'message': ''}
{'event': 'sentence_end', 'code': 0, 'message': ''}
{'event': 'sentence_start', 'sentence_start_result': {'readable_text': '中国人民银行调查统计司原司长盛松成建议,降低中低收入群体个税。'}, 'code': 0, 'message': ''}
{'event': 'sentence_end', 'code': 0, 'message': ''}
{'event': 'sentence_start', 'sentence_start_result': {'readable_text': '提高个税起征点和调降中低收入税率。'}, 'code': 0, 'message': ''}
{'event': 'sentence_end', 'code': 0, 'message': ''}
{'event': 'sentence_start', 'sentence_start_result': {'readable_text': '“短期内虽然会减少税收,但从长期看,随着经济增长和居民收入提高,税收收入也 将增加”,他说。'}, 'code': 0, 'message': ''}
{'event': 'sentence_end', 'code': 0, 'message': ''}
{'event': 'sentence_start', 'sentence_start_result': {'readable_text': '第一,盛松成提出,提高个税起征点至8000元/月,据其测算,税收每年减少约300亿 元,这仅为2023年税收总额的0.17%。'}, 'code': 0, 'message': ''}
{'event': 'sentence_end', 'code': 0, 'message': ''}
{'event': 'sentence_start', 'sentence_start_result': {'readable_text': '“对财政没有多大影响的,但是这个钱是实实在在的低收入人群的收入,对促进消费 是特别有益的”。'}, 'code': 0, 'message': ''}
{'event': 'sentence_end', 'code': 0, 'message': ''}
{'event': 'sentence_start', 'sentence_start_result': {'readable_text': '第二,调降中低收入税率方面,盛松成建议,年收入10万-35万元个税税率降低5个百 分点,目前年收入10万-20万、20万-35万分别按10%和20%的税率累进征收个税,建议分别下降至5%和15%。'}, 'code': 0, 'message': ''}
{'event': 'sentence_end', 'code': 0, 'message': ''}
{'event': '', 'code': 710010701, 'message': 'connection timeout'}
An error occurred: received 1000 (OK); then sent 1000 (OK)
import asyncio
import websockets
import json
from pydub import AudioSegment
from pydub.playback import play
from io import BytesIO
import re
# 自定义请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 SamanthaDoubao/1.25.3",
"Origin": "chrome-extension://obk*****",
"Sec-WebSocket-Key": "*****==",
"Sec-WebSocket-Extensions": "permessage-deflate; client_max_window_bits",
"Cookie": "******"
}
# 使用 pydub 从内存流中播放音频
async def play_audio_stream(audio_data):
try:
audio = AudioSegment.from_file(BytesIO(audio_data), format="aac")
play(audio)
except Exception as e:
print(f"Error playing audio: {e}")
async def tts_by(text):
buffer = bytearray() # 缓冲区
playing = False # 播放状态
finish_received = False # 标记是否收到了 finish
connection_closed = False # 标记 WebSocket 是否关闭
async def play_buffer():
nonlocal playing
while True:
if len(buffer) > 0:
await play_audio_stream(buffer)
buffer.clear() # 清空缓冲区
playing = False # 标记播放完成
await asyncio.sleep(0.1) # 控制播放的检查频率
def split_text(text):
# 基于标点符号的分段逻辑
return re.split(r'(?<=[。!?;])', text)
text_parts = split_text(text) # 将文本按标点符号分段
part_index = 0 # 当前发送的段落索引
try:
async with websockets.connect('wss://wss.******.com/', extra_headers=headers) as websocket:
# 启动播放任务
asyncio.create_task(play_buffer())
# 循环发送每段文字
while part_index < len(text_parts) and not connection_closed:
payload = {
"event": "text", "text": text_parts[part_index]
}
await websocket.send(json.dumps(payload))
part_index += 1
while True:
response = await websocket.recv()
if isinstance(response, str):
json_data = json.loads(response)
print(json_data)
if json_data.get('event') == 'sentence_start': # 收到句子开始信号
continue
elif json_data.get('event') == 'sentence_end': # 收到句子结束信号
playing = True # 准备播放音频
break # 发送下一段文字
elif json_data.get('event') == 'finish': # 所有文本发送和处理完成
finish_received = True
break
else:
buffer.extend(response) # 收到音频数据,添加到缓冲区
# 所有文本发送完毕,等待 'finish' 信号
while not finish_received and not connection_closed:
response = await websocket.recv()
if isinstance(response, str):
json_data = json.loads(response)
if json_data.get('event') == 'finish':
finish_received = True
elif json_data.get('code') == 1000: # WebSocket 正常关闭
connection_closed = True
else:
buffer.extend(response)
# 等待播放缓冲区中的剩余音频数据
while len(buffer) > 0:
await asyncio.sleep(0.1)
except Exception as e:
print(f"An error occurred: {e}")
# 运行 WebSocket 请求
asyncio.run(tts_by("财联社9月28日电,2024清华五道口首席经济学家论坛于9月28日在北京举行。中国人民银行调查统计司原司长盛松成建议,降低中低收入群体个税。提高个税起征点和调降中低收入税率。“短期内虽然会减少税收,但从长期看,随着经济增长和居民收入提高,税收收入也将增加”,他说。第一,盛松成提出,提高个税起征点至8000元/月,据其测算,税收每年减少约300亿元,这仅为2023年税收总额的0.17%。“对财政没有多大影响的,但是这个钱是实实在在的低收入人群的收入,对促进消费是特别有益的”。第二,调降中低收入税率方面,盛松成建议,年收入10万-35万元个税税率降低5个百分点,目前年收入10万-20万、20万-35万分别按10%和20%的税率累进征收个税,建议分别下降至5%和15%。"))
全部代码由chatgpt完成