Files
Fay/utils/stream_sentence.py
xszyou 10ad9d001c fay进化
1、修复面板机器人表情“思考中”不释放问题;
2、修复因声卡导致pygame出错而无法继续运行问题;
3、兼容mp3及wav音频格式的tts;
4、修复流式空字符tts出错问题;
5、修复因tts出错不解锁麦克风问题;
6、防止流式音频之间被插话;
7、修复"gpt_stream" api出错不回消息;
8、修复aliyun tts的嗒嗒声。
2025-03-12 22:41:01 +08:00

59 lines
1.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import threading
import functools
def synchronized(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
with self.lock:
return func(self, *args, **kwargs)
return wrapper
class SentenceCache:
def __init__(self, max_sentences):
self.lock = threading.Lock()
self.buffer = [None] * max_sentences
self.max_sentences = max_sentences
self.writeIndex = 0
self.readIndex = 0
self.idle = 0
@synchronized
def write(self, sentence):
# 如果缓冲区已满,则无法写入
if self.idle == self.max_sentences:
print("缓存区不够用")
return False
self.buffer[self.writeIndex] = sentence
self.writeIndex = (self.writeIndex + 1) % self.max_sentences
self.idle += 1
return True
@synchronized
def read(self):
# 如果缓冲区为空,没有可读的句子
if self.idle == 0:
return None
sentence = self.buffer[self.readIndex]
self.buffer[self.readIndex] = None
self.readIndex = (self.readIndex + 1) % self.max_sentences
self.idle -= 1
return sentence
@synchronized
def clear(self):
self.buffer = [None] * self.max_sentences
self.writeIndex = 0
self.readIndex = 0
self.idle = 0
if __name__ == '__main__':
cache = SentenceCache(3)
cache.write("这是第一句话。")
cache.write("这是第二句话。")
print(cache.read()) # 读出第一句话
cache.write("这是第三句话。")
print(cache.read()) # 读出第二句话
print(cache.read()) # 读出第三句话
print(cache.read()) # 无内容返回None