1. added option to strip silent chunks
2. computing caller quality based on task-id of corrections
parent
ac0e04c226
commit
000853b600
|
|
@ -121,6 +121,7 @@ def analyze(
|
||||||
),
|
),
|
||||||
start_delay: float = 1.5,
|
start_delay: float = 1.5,
|
||||||
download_only: bool = False,
|
download_only: bool = False,
|
||||||
|
strip_silent_chunks: bool = True,
|
||||||
call_logs_file: Path = typer.Option(Path("./call_logs.yaml"), show_default=True),
|
call_logs_file: Path = typer.Option(Path("./call_logs.yaml"), show_default=True),
|
||||||
output_dir: Path = Path("./data"),
|
output_dir: Path = Path("./data"),
|
||||||
data_name: str = None,
|
data_name: str = None,
|
||||||
|
|
@ -408,6 +409,16 @@ def analyze(
|
||||||
pprint(call_plots)
|
pprint(call_plots)
|
||||||
|
|
||||||
def extract_data_points():
|
def extract_data_points():
|
||||||
|
if strip_silent_chunks:
|
||||||
|
|
||||||
|
def audio_process(seg):
|
||||||
|
return strip_silence(seg)
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
def audio_process(seg):
|
||||||
|
return seg
|
||||||
|
|
||||||
def gen_data_values(saved_wav_path, data_points, caller_name):
|
def gen_data_values(saved_wav_path, data_points, caller_name):
|
||||||
call_seg = (
|
call_seg = (
|
||||||
AudioSegment.from_wav(saved_wav_path)
|
AudioSegment.from_wav(saved_wav_path)
|
||||||
|
|
@ -417,12 +428,15 @@ def analyze(
|
||||||
)
|
)
|
||||||
for dp_id, dp in enumerate(data_points):
|
for dp_id, dp in enumerate(data_points):
|
||||||
start, end, spoken = dp["start_time"], dp["end_time"], dp["code"]
|
start, end, spoken = dp["start_time"], dp["end_time"], dp["code"]
|
||||||
spoken_seg = strip_silence(call_seg[start * 1000 : end * 1000])
|
spoken_seg = audio_process(call_seg[start * 1000 : end * 1000])
|
||||||
spoken_fb = BytesIO()
|
spoken_fb = BytesIO()
|
||||||
spoken_seg.export(spoken_fb, format="wav")
|
spoken_seg.export(spoken_fb, format="wav")
|
||||||
spoken_wav = spoken_fb.getvalue()
|
spoken_wav = spoken_fb.getvalue()
|
||||||
# search for actual pnr code and handle plain codes as well
|
# search for actual pnr code and handle plain codes as well
|
||||||
extracted_code = text_extractor(spoken)
|
extracted_code = text_extractor(spoken)
|
||||||
|
if strip_silent_chunks and spoken_seg.duration_seconds < 0.5:
|
||||||
|
print(f'transcript chunk "{spoken}" contains no audio skipping.')
|
||||||
|
continue
|
||||||
yield extracted_code, spoken_seg.duration_seconds, spoken_wav, caller_name, spoken_seg
|
yield extracted_code, spoken_seg.duration_seconds, spoken_wav, caller_name, spoken_seg
|
||||||
|
|
||||||
call_lens = lens["users"].Each()["calls"].Each()
|
call_lens = lens["users"].Each()["calls"].Each()
|
||||||
|
|
|
||||||
|
|
@ -194,6 +194,7 @@ def dump_corrections(
|
||||||
|
|
||||||
@app.command()
|
@app.command()
|
||||||
def caller_quality(
|
def caller_quality(
|
||||||
|
task_uid: str,
|
||||||
data_name: str = typer.Option("call_upwork_train_cnd", show_default=True),
|
data_name: str = typer.Option("call_upwork_train_cnd", show_default=True),
|
||||||
dump_dir: Path = Path("./data/asr_data"),
|
dump_dir: Path = Path("./data/asr_data"),
|
||||||
dump_fname: Path = Path("ui_dump.json"),
|
dump_fname: Path = Path("ui_dump.json"),
|
||||||
|
|
@ -214,7 +215,11 @@ def caller_quality(
|
||||||
dp["valid"] = c["value"]["status"] == "Correct"
|
dp["valid"] = c["value"]["status"] == "Correct"
|
||||||
return dp
|
return dp
|
||||||
|
|
||||||
corrected_dump = [correction_dp(c) for c in correction_data]
|
corrected_dump = [
|
||||||
|
correction_dp(c)
|
||||||
|
for c in correction_data
|
||||||
|
if c["task_id"].rsplit("-", 1)[1] == task_uid
|
||||||
|
]
|
||||||
df = pd.DataFrame(corrected_dump)
|
df = pd.DataFrame(corrected_dump)
|
||||||
print(f"Total samples: {len(df)}")
|
print(f"Total samples: {len(df)}")
|
||||||
for (c, g) in df.groupby("caller"):
|
for (c, g) in df.groupby("caller"):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue