diff --git a/speech_recognition/recognizers/google.py b/speech_recognition/recognizers/google.py index 9b552be1..01afde38 100644 --- a/speech_recognition/recognizers/google.py +++ b/speech_recognition/recognizers/google.py @@ -30,13 +30,19 @@ class GoogleResponse(TypedDict): ProfanityFilterLevel = Literal[0, 1] RequestHeaders = Dict[str, str] +ENDPOINT = "http://www.google.com/speech-api/v2/recognize" -class RequestBuilder: - endpoint = "http://www.google.com/speech-api/v2/recognize" +class RequestBuilder: def __init__( - self, *, key: str, language: str, filter_level: ProfanityFilterLevel + self, + *, + endpoint: str, + key: str, + language: str, + filter_level: ProfanityFilterLevel, ) -> None: + self.endpoint = endpoint self.key = key self.language = language self.filter_level = filter_level @@ -53,7 +59,7 @@ def build(self, audio_data: AudioData) -> Request: def build_url(self) -> str: """ - >>> builder = RequestBuilder(key="awesome-key", language="en-US", filter_level=0) + >>> builder = RequestBuilder(endpoint="http://www.google.com/speech-api/v2/recognize", key="awesome-key", language="en-US", filter_level=0) >>> builder.build_url() 'http://www.google.com/speech-api/v2/recognize?client=chromium&lang=en-US&key=awesome-key&pFilter=0' """ @@ -69,7 +75,7 @@ def build_url(self) -> str: def build_headers(self, audio_data: AudioData) -> RequestHeaders: """ - >>> builder = RequestBuilder(key="", language="", filter_level=1) + >>> builder = RequestBuilder(endpoint="", key="", language="", filter_level=1) >>> audio_data = AudioData(b"", 16_000, 1) >>> builder.build_headers(audio_data) {'Content-Type': 'audio/x-flac; rate=16000'} @@ -99,6 +105,7 @@ def to_convert_rate(sample_rate: int) -> int: def create_request_builder( *, + endpoint: str, key: str | None = None, language: str = "en-US", filter_level: ProfanityFilterLevel = 0, @@ -111,7 +118,10 @@ def create_request_builder( if key is None: key = "AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw" return RequestBuilder( - key=key, language=language, filter_level=filter_level + endpoint=endpoint, + key=key, + language=language, + filter_level=filter_level, ) @@ -220,6 +230,8 @@ def recognize_legacy( pfilter: ProfanityFilterLevel = 0, show_all: bool = False, with_confidence: bool = False, + *, + endpoint: str = ENDPOINT, ): """ Performs speech recognition on ``audio_data`` (an ``AudioData`` instance), using the Google Speech Recognition API. @@ -237,7 +249,7 @@ def recognize_legacy( Raises a ``speech_recognition.UnknownValueError`` exception if the speech is unintelligible. Raises a ``speech_recognition.RequestError`` exception if the speech recognition operation failed, if the key isn't valid, or if there is no internet connection. """ request_builder = create_request_builder( - key=key, language=language, filter_level=pfilter + endpoint=endpoint, key=key, language=language, filter_level=pfilter ) request = request_builder.build(audio_data) diff --git a/tests/recognizers/test_google.py b/tests/recognizers/test_google.py index 79c58770..4ee0ad1a 100644 --- a/tests/recognizers/test_google.py +++ b/tests/recognizers/test_google.py @@ -18,7 +18,9 @@ class RequestBuilderTestCase(TestCase): @patch(f"{CLASS_UNDER_TEST}.build_url") def test_build(self, build_url, build_headers, build_data, Request): audio_data = MagicMock(spec=AudioData) - sut = google.RequestBuilder(key="", language="", filter_level=0) + sut = google.RequestBuilder( + endpoint="", key="", language="", filter_level=0 + ) actual = sut.build(audio_data) @@ -36,7 +38,9 @@ def test_build(self, build_url, build_headers, build_data, Request): def test_build_data(self, to_convert_rate): # mock has AudioData's attributes (e.g. sample_rate) audio_data = MagicMock(spec=AudioData(None, 1, 1)) - sut = google.RequestBuilder(key="", language="", filter_level=0) + sut = google.RequestBuilder( + endpoint="", key="", language="", filter_level=0 + ) actual = sut.build_data(audio_data) @@ -131,7 +135,10 @@ def test_default_values( self.assertEqual(actual, output_parser.parse.return_value) create_request_builder.assert_called_once_with( - key=None, language="en-US", filter_level=0 + endpoint="http://www.google.com/speech-api/v2/recognize", + key=None, + language="en-US", + filter_level=0, ) request_builder.build.assert_called_once_with(audio_data) obtain_transcription.assert_called_once_with( @@ -160,11 +167,15 @@ def test_specified_values( pfilter=1, show_all=True, with_confidence=False, + endpoint="https://www.google.com/speech-api/v2/recognize", ) self.assertEqual(actual, output_parser.parse.return_value) create_request_builder.assert_called_once_with( - key="awesome-key", language="zh-CN", filter_level=1 + endpoint="https://www.google.com/speech-api/v2/recognize", + key="awesome-key", + language="zh-CN", + filter_level=1, ) request_builder.build.assert_called_once_with(audio_data) obtain_transcription.assert_called_once_with(