From 4ee147ca599856d68a493ef93c912313b34f4e4f Mon Sep 17 00:00:00 2001 From: Jong Wook Kim Date: Tue, 24 Jan 2023 10:07:23 -0800 Subject: [PATCH] handle printing even if sys.stdout.buffer is not available --- whisper/transcribe.py | 11 +++-------- whisper/utils.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/whisper/transcribe.py b/whisper/transcribe.py index c0404416e..c5bea7b26 100644 --- a/whisper/transcribe.py +++ b/whisper/transcribe.py @@ -1,8 +1,7 @@ import argparse import os -import sys import warnings -from typing import List, Optional, Tuple, Union, TYPE_CHECKING +from typing import Optional, Tuple, Union, TYPE_CHECKING import numpy as np import torch @@ -11,7 +10,7 @@ from .audio import SAMPLE_RATE, N_FRAMES, HOP_LENGTH, pad_or_trim, log_mel_spectrogram from .decoding import DecodingOptions, DecodingResult from .tokenizer import LANGUAGES, TO_LANGUAGE_CODE, get_tokenizer -from .utils import exact_div, format_timestamp, optional_int, optional_float, str2bool, get_writer +from .utils import exact_div, format_timestamp, make_safe, optional_int, optional_float, str2bool, get_writer if TYPE_CHECKING: from .model import Whisper @@ -166,11 +165,7 @@ def add_segment( } ) if verbose: - line = f"[{format_timestamp(start)} --> {format_timestamp(end)}] {text}\n" - # compared to just `print(line)`, this replaces any character not representable using - # the system default encoding with an '?', avoiding UnicodeEncodeError. - sys.stdout.buffer.write(line.encode(sys.getdefaultencoding(), errors="replace")) - sys.stdout.flush() + print(make_safe(f"[{format_timestamp(start)} --> {format_timestamp(end)}] {text}")) # show the progress bar when verbose is False (otherwise the transcribed text will be printed) num_frames = mel.shape[-1] diff --git a/whisper/utils.py b/whisper/utils.py index 8293641b2..5dacc173c 100644 --- a/whisper/utils.py +++ b/whisper/utils.py @@ -1,8 +1,21 @@ import json import os +import sys import zlib from typing import Callable, TextIO +system_encoding = sys.getdefaultencoding() + +if system_encoding != "utf-8": + def make_safe(string): + # replaces any character not representable using the system default encoding with an '?', + # avoiding UnicodeEncodeError (https://github.com/openai/whisper/discussions/729). + return string.encode(system_encoding, errors="replace").decode(system_encoding) +else: + def make_safe(string): + # utf-8 can encode any Unicode code point, so no need to do the round-trip encoding + return string + def exact_div(x, y): assert x % y == 0