liumaolin
Integrate FunASR.
3a0633a
import unicodedata
from .base import MetaItem, BasePipe, Segment
from ..helpers.funasr import FunASR
class FunASRPipe(BasePipe):
funasr = None
@classmethod
def init(cls):
if cls.funasr is None:
cls.funasr = FunASR()
def process(self, in_data: MetaItem) -> MetaItem:
audio_data = in_data.audio
source_language = in_data.source_language
result = self.funasr.transcribe(audio_data, source_language)
# 处理 FunASR 的输出结果
if result and isinstance(result, list) and 'text' in result[0]:
# FunASR 输出格式为包含文本和时间戳的字典列表
segments = []
texts = []
for item in result:
text = item.get('text', '')
start = item.get('start', 0)
end = item.get('end', 0)
segments.append(Segment(t0=start, t1=end, text=self.filter_chinese_printable(text)))
texts.append(text)
in_data.segments = segments
in_data.transcribe_content = "".join(texts)
else:
# 如果 FunASR 返回的是单个文本字符串或其他格式
if isinstance(result, str):
in_data.transcribe_content = result
in_data.segments = [Segment(t0=0, t1=0, text=self.filter_chinese_printable(result))]
elif result and hasattr(result[0], 'text'):
# 如果是对象列表
segments = []
texts = []
for item in result:
text = item.text
start = getattr(item, 'start', 0) or getattr(item, 't0', 0)
end = getattr(item, 'end', 0) or getattr(item, 't1', 0)
segments.append(Segment(t0=start, t1=end, text=self.filter_chinese_printable(text)))
texts.append(text)
in_data.segments = segments
in_data.transcribe_content = "".join(texts)
else:
in_data.transcribe_content = ""
in_data.segments = []
in_data.audio = b""
return in_data
def filter_chinese_printable(self, s):
printable = []
bytearray_chars = s.encode('utf-8')
for char in bytearray_chars.decode('utf-8', errors='replace'):
if unicodedata.category(char) != 'Cc': # 不可打印字符的分类为 'Cc'
printable.append(char)
return ''.join(printable).strip()
class FunASRChinese(FunASRPipe):
@classmethod
def init(cls):
if cls.funasr is None:
cls.funasr = FunASR(source_lange='zh')