From d6c5d9394a088062c834f4d35d94d46c980ea6e0 Mon Sep 17 00:00:00 2001
From: shixian.shi <shixian.shi@alibaba-inc.com>
Date: 星期五, 03 三月 2023 11:03:43 +0800
Subject: [PATCH] update timestamp and add ploter
---
funasr/runtime/python/onnxruntime/rapid_paraformer/utils/timestamp_utils.py | 11 ++++++-----
funasr/runtime/python/onnxruntime/demo.py | 2 +-
funasr/runtime/python/onnxruntime/rapid_paraformer/paraformer_onnx.py | 25 +++++++++++++++++++++++--
3 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/funasr/runtime/python/onnxruntime/demo.py b/funasr/runtime/python/onnxruntime/demo.py
index 5209f31..3135b4d 100644
--- a/funasr/runtime/python/onnxruntime/demo.py
+++ b/funasr/runtime/python/onnxruntime/demo.py
@@ -6,7 +6,7 @@
model = Paraformer(model_dir, batch_size=1)
-wav_path = ['/Users/shixian/code/funasr2/export/damo/speech_paraformer-tiny-commandword_asr_nat-zh-cn-16k-vocab544-pytorch/example/asr_example.wav']
+wav_path = ['/Users/shixian/code/funasr2/export/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/example/asr_example.wav']
result = model(wav_path)
print(result)
\ No newline at end of file
diff --git a/funasr/runtime/python/onnxruntime/rapid_paraformer/paraformer_onnx.py b/funasr/runtime/python/onnxruntime/rapid_paraformer/paraformer_onnx.py
index 9b8a67b..ec9b406 100644
--- a/funasr/runtime/python/onnxruntime/rapid_paraformer/paraformer_onnx.py
+++ b/funasr/runtime/python/onnxruntime/rapid_paraformer/paraformer_onnx.py
@@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*-
# @Author: SWHL
# @Contact: liekkaskono@163.com
+from cgitb import text
import os.path
from pathlib import Path
from typing import List, Union, Tuple
@@ -23,6 +24,7 @@
def __init__(self, model_dir: Union[str, Path] = None,
batch_size: int = 1,
device_id: Union[str, int] = "-1",
+ plot_timestamp: bool = True,
):
if not Path(model_dir).exists():
@@ -41,7 +43,7 @@
)
self.ort_infer = OrtInferSession(model_file, device_id)
self.batch_size = batch_size
- self.plot = True
+ self.plot = plot_timestamp
def __call__(self, wav_content: Union[str, np.ndarray, List[str]], **kwargs) -> List:
waveform_list = self.load_data(wav_content, self.frontend.opts.frame_opts.samp_freq)
@@ -76,7 +78,26 @@
def plot_wave_timestamp(self, wav, text_timestamp):
# TODO: Plot the wav and timestamp results with matplotlib
- import pdb; pdb.set_trace()
+ import matplotlib
+ matplotlib.use('Agg')
+ matplotlib.rc("font", family='Alibaba PuHuiTi') # set it to a font that your system supports
+ import matplotlib.pyplot as plt
+ fig, ax1 = plt.subplots(figsize=(11, 3.5), dpi=320)
+ ax2 = ax1.twinx()
+ ax2.set_ylim([0, 2.0])
+ # plot waveform
+ ax1.set_ylim([-0.3, 0.3])
+ time = np.arange(wav.shape[0]) / 16000
+ ax1.plot(time, wav/wav.max()*0.3, color='gray', alpha=0.4)
+ # plot lines and text
+ for (char, start, end) in text_timestamp:
+ ax1.vlines(start, -0.3, 0.3, ls='--')
+ ax1.vlines(end, -0.3, 0.3, ls='--')
+ x_adj = 0.045 if char != '<sil>' else 0.12
+ ax1.text((start + end) * 0.5 - x_adj, 0, char)
+ # plt.legend()
+ plotname = "debug.png"
+ plt.savefig(plotname, bbox_inches='tight')
def load_data(self,
wav_content: Union[str, np.ndarray, List[str]], fs: int = None) -> List:
diff --git a/funasr/runtime/python/onnxruntime/rapid_paraformer/utils/timestamp_utils.py b/funasr/runtime/python/onnxruntime/rapid_paraformer/utils/timestamp_utils.py
index 767e864..dd702f3 100644
--- a/funasr/runtime/python/onnxruntime/rapid_paraformer/utils/timestamp_utils.py
+++ b/funasr/runtime/python/onnxruntime/rapid_paraformer/utils/timestamp_utils.py
@@ -1,11 +1,11 @@
import numpy as np
-def time_stamp_lfr6_onnx(us_cif_peak, char_list, begin_time=0.0):
+def time_stamp_lfr6_onnx(us_cif_peak, char_list, begin_time=0.0, total_offset=-1.5):
if not len(char_list):
return []
START_END_THRESHOLD = 5
- MAX_TOKEN_DURATION = 14
+ MAX_TOKEN_DURATION = 30
TIME_RATE = 10.0 * 6 / 1000 / 3 # 3 times upsampled
cif_peak = us_cif_peak.reshape(-1)
num_frames = cif_peak.shape[-1]
@@ -16,7 +16,7 @@
new_char_list = []
# for bicif model trained with large data, cif2 actually fires when a character starts
# so treat the frames between two peaks as the duration of the former token
- fire_place = np.where(cif_peak>1.0-1e-4)[0] - 1.5 # np format
+ fire_place = np.where(cif_peak>1.0-1e-4)[0] + total_offset # np format
num_peak = len(fire_place)
assert num_peak == len(char_list) + 1 # number of peaks is supposed to be number of tokens + 1
# begin silence
@@ -27,7 +27,7 @@
# tokens timestamp
for i in range(len(fire_place)-1):
new_char_list.append(char_list[i])
- if MAX_TOKEN_DURATION < 0 or fire_place[i+1] - fire_place[i] < MAX_TOKEN_DURATION:
+ if i == len(fire_place)-2 or MAX_TOKEN_DURATION < 0 or fire_place[i+1] - fire_place[i] < MAX_TOKEN_DURATION:
timestamp_list.append([fire_place[i]*TIME_RATE, fire_place[i+1]*TIME_RATE])
else:
# cut the duration to token and sil of the 0-weight frames last long
@@ -55,4 +55,5 @@
for char, timestamp in zip(new_char_list, timestamp_list):
if char != '<sil>':
res.append([int(timestamp[0] * 1000), int(timestamp[1] * 1000)])
- return res, res_total
\ No newline at end of file
+ return res, res_total
+
\ No newline at end of file
--
Gitblit v1.9.1