Skip to content

Commit

Permalink
handle printing even if sys.stdout.buffer is not available (openai#887)
Browse files Browse the repository at this point in the history
  • Loading branch information
jongwook authored and zackees committed May 5, 2023
1 parent 905b484 commit 0b56a21
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
11 changes: 3 additions & 8 deletions whisper/transcribe.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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]
Expand Down
13 changes: 13 additions & 0 deletions whisper/utils.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit 0b56a21

Please sign in to comment.