{
"cells": [
{
"cell_type": "code",
"execution_count": 16,
"id": "5920c653-448e-43b3-93eb-12d7073ad352",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import time\n",
"import soundfile\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from espnet2.bin.asr_inference import Speech2Text\n",
"from espnet2.bin.asr_align import CTCSegmentation"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "83058587-1a8a-4b01-92ff-e9125fbe55a3",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import torch\n",
"torch.set_num_threads(1)"
]
},
{
"cell_type": "markdown",
"id": "32eb58d1-5edd-4cc1-9585-daa7f16efd05",
"metadata": {},
"source": [
"## Load model"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "5e4670d6-0949-48cf-b6b1-d9cc4cf3ad65",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"#longer beam size take more time but is more accurate, default is 20\n",
"speech2text = Speech2Text(\"exp/config.yaml\", \"exp/valid.acc.ave_10best.pth\", quantize_asr_model=True, quantize_lm=True, beam_size=10)"
]
},
{
"cell_type": "markdown",
"id": "3192656d-6dce-4973-a649-f7ab0c72c386",
"metadata": {
"tags": []
},
"source": [
"## Load example audiofile to transcribe"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "e8120e8e-3718-4a1a-ab7a-46ef98a6bc11",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"speech, rate = soundfile.read(\"example_audio/emt16k.wav\")\n",
"assert rate == 16000"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "eec8d4b2-c27a-4780-aeed-8aa7538f70e5",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.71 s, sys: 9.89 ms, total: 1.72 s\n",
"Wall time: 1.75 s\n"
]
}
],
"source": [
"%time text, *_ = speech2text(speech)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "39f41a8b-94c3-42d6-a989-6c7183a6f94d",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"mina tahaksin homme täna ja homme kui saan kolm krampsumas ise müüki panna\n"
]
}
],
"source": [
"print(text[0])"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "812060a6-90de-4134-8d1f-9f3d98853bc2",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Input File : 'example_audio/emt16k.wav'\n",
"Channels : 1\n",
"Sample Rate : 16000\n",
"Precision : 16-bit\n",
"Duration : 00:00:12.74 = 203815 samples ~ 955.383 CDDA sectors\n",
"File Size : 408k\n",
"Bit Rate : 256k\n",
"Sample Encoding: 16-bit Signed Integer PCM\n",
"\n"
]
}
],
"source": [
"!soxi example_audio/emt16k.wav"
]
},
{
"cell_type": "markdown",
"id": "7d07e8a4-1dbf-4a79-bdf0-aeaeb160ba19",
"metadata": {},
"source": [
"## Example token level alignment"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "e6b7331c-52f1-4162-b564-2e6a08b325b0",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:root:No RNN model detected; memory consumption may be high.\n"
]
}
],
"source": [
"aligner = CTCSegmentation(\"exp/config.yaml\", \"exp/valid.acc.ave_10best.pth\" , kaldi_style_text=False, blank_transition_cost_zero=True)\n",
"segments = aligner(speech, text[0].split())"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "e6d18b5f-3d2a-4fcf-bf4e-00480e58094a",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"utt_0000 utt 0.36 0.78 -0.0001 mina\n",
"utt_0001 utt 0.78 1.19 -0.0003 tahaksin\n",
"utt_0002 utt 1.19 1.59 -0.0017 homme\n",
"utt_0003 utt 1.67 2.19 -0.0001 täna\n",
"utt_0004 utt 3.24 3.76 -0.0037 ja\n",
"utt_0005 utt 3.76 4.28 -0.0000 homme\n",
"utt_0006 utt 5.61 6.13 -0.0001 kui\n",
"utt_0007 utt 6.17 6.69 -0.0009 saan\n",
"utt_0008 utt 7.98 8.50 -0.2285 kolm\n",
"utt_0009 utt 8.50 9.34 -0.1062 krampsumas\n",
"utt_0010 utt 9.34 9.54 -0.1183 ise\n",
"utt_0011 utt 9.54 10.07 -0.2588 müüki\n",
"utt_0012 utt 10.07 10.31 -0.1041 panna\n",
"\n"
]
}
],
"source": [
"print(segments)"
]
},
{
"cell_type": "markdown",
"id": "77f82a7d-08dc-40cb-88e5-48ef8c36af7d",
"metadata": {
"tags": []
},
"source": [
"## Get timestamps with some correction"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "ae9f7e3f-b75d-4bcb-98d1-ae2f037fb4af",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"def get_timestamps(aligner, speech, text, time_correction=0.2):\n",
" tokens=text.split()\n",
" segments = aligner(speech, tokens)\n",
" df=pd.DataFrame(segments.segments)\n",
" df.columns=['start', 'end', 'confidence']\n",
" df['start']=df.start+time_correction\n",
" df['end']=df.end+time_correction\n",
" df['words']=tokens\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "0215d312-1896-43f1-9782-c92aced787b7",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.68 s, sys: 0 ns, total: 1.68 s\n",
"Wall time: 1.68 s\n"
]
}
],
"source": [
"speech, rate = soundfile.read(\"example_audio/oden_kypsis16k_subset2.wav\")\n",
"assert rate == 16000\n",
"\n",
"%time text, *_ = speech2text(speech)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "d31d6840-3a80-411a-969c-05f4a5e3e9a1",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Input File : 'example_audio/oden_kypsis16k_subset2.wav'\n",
"Channels : 1\n",
"Sample Rate : 16000\n",
"Precision : 16-bit\n",
"Duration : 00:00:09.19 = 146983 samples ~ 688.983 CDDA sectors\n",
"File Size : 294k\n",
"Bit Rate : 256k\n",
"Sample Encoding: 16-bit Signed Integer PCM\n",
"\n"
]
}
],
"source": [
"!soxi example_audio/oden_kypsis16k_subset2.wav"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "53f3b63f-9b40-432b-b58c-f5b7223252ed",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 309 ms, sys: 8.51 ms, total: 318 ms\n",
"Wall time: 312 ms\n"
]
}
],
"source": [
"%time df_times=get_timestamps(aligner, speech, text[0])"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "1b4dd747-4be2-4ace-a301-6207f7dd9a71",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" start | \n",
" end | \n",
" confidence | \n",
" words | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.260173 | \n",
" 0.661328 | \n",
" -0.049087 | \n",
" klikid | \n",
"
\n",
" \n",
" 1 | \n",
" 0.661328 | \n",
" 0.821789 | \n",
" -0.003573 | \n",
" neid | \n",
"
\n",
" \n",
" 2 | \n",
" 0.823233 | \n",
" 1.784560 | \n",
" -0.001952 | \n",
" allserva | \n",
"
\n",
" \n",
" 3 | \n",
" 1.784560 | \n",
" 1.985137 | \n",
" -0.034099 | \n",
" tekivad | \n",
"
\n",
" \n",
" 4 | \n",
" 2.548197 | \n",
" 3.068255 | \n",
" -0.000037 | \n",
" need | \n",
"
\n",
" \n",
" 5 | \n",
" 3.068255 | \n",
" 4.031025 | \n",
" -0.008919 | \n",
" lubaküpsiseid | \n",
"
\n",
" \n",
" 6 | \n",
" 4.754546 | \n",
" 5.274604 | \n",
" -0.000385 | \n",
" mis | \n",
"
\n",
" \n",
" 7 | \n",
" 5.274604 | \n",
" 5.415008 | \n",
" -0.078755 | \n",
" on | \n",
"
\n",
" \n",
" 8 | \n",
" 5.415008 | \n",
" 5.555412 | \n",
" -0.000224 | \n",
" nagu | \n",
"
\n",
" \n",
" 9 | \n",
" 5.555412 | \n",
" 5.836220 | \n",
" -0.000488 | \n",
" ilusti | \n",
"
\n",
" \n",
" 10 | \n",
" 5.836220 | \n",
" 6.117029 | \n",
" -0.002274 | \n",
" kohati | \n",
"
\n",
" \n",
" 11 | \n",
" 6.238818 | \n",
" 7.039684 | \n",
" -0.013956 | \n",
" tõlgitud | \n",
"
\n",
" \n",
" 12 | \n",
" 7.039684 | \n",
" 7.240261 | \n",
" -0.002010 | \n",
" eesti | \n",
"
\n",
" \n",
" 13 | \n",
" 7.240261 | \n",
" 7.681531 | \n",
" -0.002761 | \n",
" keelde | \n",
"
\n",
" \n",
" 14 | \n",
" 7.803320 | \n",
" 8.323378 | \n",
" -0.001533 | \n",
" see | \n",
"
\n",
" \n",
" 15 | \n",
" 8.323378 | \n",
" 8.644302 | \n",
" -0.044506 | \n",
" idee | \n",
"
\n",
" \n",
" 16 | \n",
" 8.644302 | \n",
" 9.326264 | \n",
" -0.215737 | \n",
" arusaadavamaks | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" start end confidence words\n",
"0 0.260173 0.661328 -0.049087 klikid\n",
"1 0.661328 0.821789 -0.003573 neid\n",
"2 0.823233 1.784560 -0.001952 allserva\n",
"3 1.784560 1.985137 -0.034099 tekivad\n",
"4 2.548197 3.068255 -0.000037 need\n",
"5 3.068255 4.031025 -0.008919 lubaküpsiseid\n",
"6 4.754546 5.274604 -0.000385 mis\n",
"7 5.274604 5.415008 -0.078755 on\n",
"8 5.415008 5.555412 -0.000224 nagu\n",
"9 5.555412 5.836220 -0.000488 ilusti\n",
"10 5.836220 6.117029 -0.002274 kohati\n",
"11 6.238818 7.039684 -0.013956 tõlgitud\n",
"12 7.039684 7.240261 -0.002010 eesti\n",
"13 7.240261 7.681531 -0.002761 keelde\n",
"14 7.803320 8.323378 -0.001533 see\n",
"15 8.323378 8.644302 -0.044506 idee\n",
"16 8.644302 9.326264 -0.215737 arusaadavamaks"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_times.head(20)"
]
},
{
"cell_type": "markdown",
"id": "6288dbee-b84b-4465-829e-978352a9f0e7",
"metadata": {},
"source": [
"## Chunk audio to see how long audio increases transcripton time significantly"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "6e7af387-d4bf-486e-a12a-9689242793fe",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from subprocess import Popen, PIPE"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0d51f384-4e1d-435f-993e-351af6bc42ff",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"def chunk_audio(src_file, to_file, start, end):\n",
" proc = Popen(['sox', src_file, to_file, 'trim', str(start), f'={end}'], stdout=PIPE, stderr=PIPE)\n",
" stdout, stderr = proc.communicate()\n",
" return stdout, stderr\n",
"\n",
"from_file='example_audio/oden_kypsis16k.wav'\n",
"to_files=[]\n",
"for i in range(5, 31):\n",
" to_file=f'example_audio/chunks/oden_kypsis16k_chunk_{i}.wav'\n",
" chunk_audio(from_file, to_file, 0, i)\n",
" to_files.append(to_file)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "9aad1658-bdbc-479c-b1f9-89e52c6c2487",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"chunk_times=[]\n",
"for file in to_files:\n",
" speech, rate = soundfile.read(file)\n",
" assert rate == 16000\n",
" start=time.time()\n",
" text, *_ = speech2text(speech)\n",
" end=time.time()\n",
" duration=end-start\n",
" chunk_times.append([file, text[0], duration, len(speech)/16000])\n",
"df_chunk_times=pd.DataFrame(chunk_times)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "9d3cd39b-9199-493c-a4d9-4084c92d844a",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" file | \n",
" hyp | \n",
" elapsed_time | \n",
" audio_dur_sec | \n",
" trans_time_audio_dur_share | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" example_audio/chunks/oden_kypsis16k_chunk_5.wav | \n",
" enamus ajast nagu klik | \n",
" 0.418611 | \n",
" 5.0 | \n",
" 0.083722 | \n",
"
\n",
" \n",
" 1 | \n",
" example_audio/chunks/oden_kypsis16k_chunk_6.wav | \n",
" enamus ajast nagu klikid neid all | \n",
" 0.481883 | \n",
" 6.0 | \n",
" 0.080314 | \n",
"
\n",
" \n",
" 2 | \n",
" example_audio/chunks/oden_kypsis16k_chunk_7.wav | \n",
" enamus ajast nagu klikid neid allserva tekivad | \n",
" 0.700862 | \n",
" 7.0 | \n",
" 0.100123 | \n",
"
\n",
" \n",
" 3 | \n",
" example_audio/chunks/oden_kypsis16k_chunk_8.wav | \n",
" enamus ajast nagu klikid neid allserva tekivad... | \n",
" 0.839978 | \n",
" 8.0 | \n",
" 0.104997 | \n",
"
\n",
" \n",
" 4 | \n",
" example_audio/chunks/oden_kypsis16k_chunk_9.wav | \n",
" enamus ajast nagu klikid neid allserva tekivad... | \n",
" 1.016149 | \n",
" 9.0 | \n",
" 0.112905 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" file \\\n",
"0 example_audio/chunks/oden_kypsis16k_chunk_5.wav \n",
"1 example_audio/chunks/oden_kypsis16k_chunk_6.wav \n",
"2 example_audio/chunks/oden_kypsis16k_chunk_7.wav \n",
"3 example_audio/chunks/oden_kypsis16k_chunk_8.wav \n",
"4 example_audio/chunks/oden_kypsis16k_chunk_9.wav \n",
"\n",
" hyp elapsed_time \\\n",
"0 enamus ajast nagu klik 0.418611 \n",
"1 enamus ajast nagu klikid neid all 0.481883 \n",
"2 enamus ajast nagu klikid neid allserva tekivad 0.700862 \n",
"3 enamus ajast nagu klikid neid allserva tekivad... 0.839978 \n",
"4 enamus ajast nagu klikid neid allserva tekivad... 1.016149 \n",
"\n",
" audio_dur_sec trans_time_audio_dur_share \n",
"0 5.0 0.083722 \n",
"1 6.0 0.080314 \n",
"2 7.0 0.100123 \n",
"3 8.0 0.104997 \n",
"4 9.0 0.112905 "
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_chunk_times.columns=['file', 'hyp','elapsed_time', 'audio_dur_sec']\n",
"df_chunk_times['trans_time_audio_dur_share']=df_chunk_times.elapsed_time/df_chunk_times.audio_dur_sec\n",
"df_chunk_times=df_chunk_times.sort_values('audio_dur_sec')\n",
"df_chunk_times=df_chunk_times.reset_index(drop=True)\n",
"df_chunk_times.head()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "1d8d9520-1bbd-43f5-ae7a-08643def9285",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"