Skip to content

Commit c09f15f

Browse files
committed
[feat] Users can pass Google endpoint (ref Uberi#751)
1 parent 765e2cf commit c09f15f

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

speech_recognition/recognizers/google.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,19 @@ class GoogleResponse(TypedDict):
3030
ProfanityFilterLevel = Literal[0, 1]
3131
RequestHeaders = Dict[str, str]
3232

33+
ENDPOINT = "http://www.google.com/speech-api/v2/recognize"
3334

34-
class RequestBuilder:
35-
endpoint = "http://www.google.com/speech-api/v2/recognize"
3635

36+
class RequestBuilder:
3737
def __init__(
38-
self, *, key: str, language: str, filter_level: ProfanityFilterLevel
38+
self,
39+
*,
40+
endpoint: str,
41+
key: str,
42+
language: str,
43+
filter_level: ProfanityFilterLevel,
3944
) -> None:
45+
self.endpoint = endpoint
4046
self.key = key
4147
self.language = language
4248
self.filter_level = filter_level
@@ -53,7 +59,7 @@ def build(self, audio_data: AudioData) -> Request:
5359

5460
def build_url(self) -> str:
5561
"""
56-
>>> builder = RequestBuilder(key="awesome-key", language="en-US", filter_level=0)
62+
>>> builder = RequestBuilder(endpoint="http://www.google.com/speech-api/v2/recognize", key="awesome-key", language="en-US", filter_level=0)
5763
>>> builder.build_url()
5864
'http://www.google.com/speech-api/v2/recognize?client=chromium&lang=en-US&key=awesome-key&pFilter=0'
5965
"""
@@ -69,7 +75,7 @@ def build_url(self) -> str:
6975

7076
def build_headers(self, audio_data: AudioData) -> RequestHeaders:
7177
"""
72-
>>> builder = RequestBuilder(key="", language="", filter_level=1)
78+
>>> builder = RequestBuilder(endpoint="", key="", language="", filter_level=1)
7379
>>> audio_data = AudioData(b"", 16_000, 1)
7480
>>> builder.build_headers(audio_data)
7581
{'Content-Type': 'audio/x-flac; rate=16000'}
@@ -99,6 +105,7 @@ def to_convert_rate(sample_rate: int) -> int:
99105

100106
def create_request_builder(
101107
*,
108+
endpoint: str,
102109
key: str | None = None,
103110
language: str = "en-US",
104111
filter_level: ProfanityFilterLevel = 0,
@@ -111,7 +118,10 @@ def create_request_builder(
111118
if key is None:
112119
key = "AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw"
113120
return RequestBuilder(
114-
key=key, language=language, filter_level=filter_level
121+
endpoint=endpoint,
122+
key=key,
123+
language=language,
124+
filter_level=filter_level,
115125
)
116126

117127

@@ -220,6 +230,8 @@ def recognize_legacy(
220230
pfilter: ProfanityFilterLevel = 0,
221231
show_all: bool = False,
222232
with_confidence: bool = False,
233+
*,
234+
endpoint: str = ENDPOINT,
223235
):
224236
"""
225237
Performs speech recognition on ``audio_data`` (an ``AudioData`` instance), using the Google Speech Recognition API.
@@ -237,7 +249,7 @@ def recognize_legacy(
237249
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.
238250
"""
239251
request_builder = create_request_builder(
240-
key=key, language=language, filter_level=pfilter
252+
endpoint=endpoint, key=key, language=language, filter_level=pfilter
241253
)
242254
request = request_builder.build(audio_data)
243255

tests/recognizers/test_google.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ class RequestBuilderTestCase(TestCase):
1818
@patch(f"{CLASS_UNDER_TEST}.build_url")
1919
def test_build(self, build_url, build_headers, build_data, Request):
2020
audio_data = MagicMock(spec=AudioData)
21-
sut = google.RequestBuilder(key="", language="", filter_level=0)
21+
sut = google.RequestBuilder(
22+
endpoint="", key="", language="", filter_level=0
23+
)
2224

2325
actual = sut.build(audio_data)
2426

@@ -36,7 +38,9 @@ def test_build(self, build_url, build_headers, build_data, Request):
3638
def test_build_data(self, to_convert_rate):
3739
# mock has AudioData's attributes (e.g. sample_rate)
3840
audio_data = MagicMock(spec=AudioData(None, 1, 1))
39-
sut = google.RequestBuilder(key="", language="", filter_level=0)
41+
sut = google.RequestBuilder(
42+
endpoint="", key="", language="", filter_level=0
43+
)
4044

4145
actual = sut.build_data(audio_data)
4246

@@ -131,7 +135,10 @@ def test_default_values(
131135

132136
self.assertEqual(actual, output_parser.parse.return_value)
133137
create_request_builder.assert_called_once_with(
134-
key=None, language="en-US", filter_level=0
138+
endpoint="http://www.google.com/speech-api/v2/recognize",
139+
key=None,
140+
language="en-US",
141+
filter_level=0,
135142
)
136143
request_builder.build.assert_called_once_with(audio_data)
137144
obtain_transcription.assert_called_once_with(
@@ -160,11 +167,15 @@ def test_specified_values(
160167
pfilter=1,
161168
show_all=True,
162169
with_confidence=False,
170+
endpoint="https://www.google.com/speech-api/v2/recognize",
163171
)
164172

165173
self.assertEqual(actual, output_parser.parse.return_value)
166174
create_request_builder.assert_called_once_with(
167-
key="awesome-key", language="zh-CN", filter_level=1
175+
endpoint="https://www.google.com/speech-api/v2/recognize",
176+
key="awesome-key",
177+
language="zh-CN",
178+
filter_level=1,
168179
)
169180
request_builder.build.assert_called_once_with(audio_data)
170181
obtain_transcription.assert_called_once_with(

0 commit comments

Comments
 (0)