icefall/egs/voxpopuli/ASR/local/uppercase_begin_of_sentence.py
Karel Vesely 59c943878f
add the voxpopuli recipe (#1374)
* add the `voxpopuli` recipe

- this is the data preparation
- there is no ASR training and no results

* update the PR#1374 (feedback from @csukuangfj)

- fixing .py headers and docstrings
- removing BUT specific parts of `prepare.sh`
- adding assert `num_jobs >= num_workers` to `compute_fbank.py`
- narrowing list of languages
  (let's limit to ASR sets with transcripts for now)
- added links to `README.md`
- extending `text_from_manifest.py`
2023-11-16 14:38:31 +08:00

114 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
# Copyright 2023 Brno University of Technology (authors: Karel Veselý)
#
# See ../../../../LICENSE for clarification regarding multiple authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
This script introduces initial capital letter at the beginning of a sentence.
It can be used as a module, or as an executable script.
Usage example #1:
`from uppercase_begin_of_sentence import UpperCaseBeginOfSentence`
Usage example #2:
```
python3 ./local/uppercase_begin_of_sentence.py \
--ignore-columns 1 \
< ${kaldi_data}/text
```
"""
import re
import sys
from argparse import ArgumentParser
class UpperCaseBeginOfSentence:
"""
This class introduces initial capital letter at the beginning of a sentence.
Capital letter is used, if previous symbol was punctuation token from
`set([".", "!", "?"])`.
The punctuation as previous token is memorized also across
`process_line_text()` calls.
"""
def __init__(self):
# The 1st word will have Title-case
# This variable transfers context from previous line
self.prev_token_is_punct = True
def process_line_text(self, line_text: str) -> str:
"""
It is assumed that punctuation in `line_text` was already separated,
example: "This is fine . Yes , you are right ."
"""
words = line_text.split()
punct_set = set([".", "!", "?"])
for ii, w in enumerate(words):
# punctuation ?
if w in punct_set:
self.prev_token_is_punct = True
continue
# change case of word...
if self.prev_token_is_punct:
if re.match("<", w):
continue # skip <symbols>
# apply Title-case only on lowercase words.
if w.islower():
words[ii] = w.title()
# change state
self.prev_token_is_punct = False
line_text_uc = " ".join(words)
return line_text_uc
def get_args():
parser = ArgumentParser(
description="Put upper-case at the beginning of a sentence."
)
parser.add_argument(
"--ignore-columns", type=int, default=4, help="skip number of initial columns"
)
return parser.parse_args()
def main():
args = get_args()
uc_bos = UpperCaseBeginOfSentence()
max_split = args.ignore_columns
while True:
line = sys.stdin.readline()
if not line:
break
line = line.strip()
if len(line.split()) > 1:
*key, text = line.strip().split(maxsplit=max_split) # parse,
text_uc = uc_bos.process_line_text(text) # process,
print(" ".join(key), text_uc) # print,
else:
print(line)
if __name__ == "__main__":
main()