【原创】基于websocket的实时文本转语音功能

 功能实现,将长文本分段实时转成音频流,达到边转换边播放的效果,减少等待效果,像豆包通义千问chatgpt差不多也是这样实现的,

下面的效果展示

20240930_084035_哔哩哔哩_bilibili【原创】基于websocket的实时文本转语音功能功能实现,将长文本分段实时转成音频流,达到边转换边播放的效果,减少等待效果,像豆包通义千问chatgpt的app差不多也是这样实现的,, 视频播放量 0、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 三哥的锅, 作者简介 三块钱,三哥,三哥的锅,qq364345866,相关视频:ESP-AI 官方固件烧录(零代码/不搞环境配置/不下载包),带有情绪控制的TTS文字转语音软件EmotiVoice整合包下载,免费文本转语音工具,用 llama3 和 whisper 大模型搭建语音助手, 使用whisper.cpp项目及C++调用Windows原生tts_科技杂谈,ESP-AI 内测版抢先体验(ESP32 最强AI对话助手),免费配音工具:不限制字数,稳定自用,文字转语音,配音新选择!,ESP-AI开发者平台服务配置教程(小白一样玩转智能助手 硬件+软件),天问 asrpro 唤醒 ESP-AI教程,【AI主播-TTS篇】对接 CosyVoice API Win 0819,整体很简单,懂得不看也没啥问题,【开源项目】Mini-Omni 一个开源的多模态大型语言模型,可以边听边说边思考。具有实时端到端语音输入和流式音频输出会话功能。,【AI主播-TTS篇】对接 GPT-SOVITS V2 API,使用整合包版本为0821,版本不同导致的接口不一致问题可以自行修改适配,也可以下单定制icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1gCxmegE5x/

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完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三块钱0794

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值