From e1f9addd777f52b59ca1d20e554522bc9aa521fa Mon Sep 17 00:00:00 2001 From: ZanSara Date: Fri, 12 May 2023 17:58:36 +0200 Subject: [PATCH 01/14] original component --- haystack/preview/components/audio/whisper.py | 209 +++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 haystack/preview/components/audio/whisper.py diff --git a/haystack/preview/components/audio/whisper.py b/haystack/preview/components/audio/whisper.py new file mode 100644 index 0000000000..9ab3769c1b --- /dev/null +++ b/haystack/preview/components/audio/whisper.py @@ -0,0 +1,209 @@ +from typing import List, Optional, Dict, Any, Union, BinaryIO, Literal, get_args, Sequence + +import os +import json +import logging +from pathlib import Path +from dataclasses import dataclass + +import requests +import torch +import whisper +from tenacity import retry, wait_exponential, retry_if_not_result + +from haystack.preview import component, Document +from haystack.errors import OpenAIError, OpenAIRateLimitError +from haystack import is_imported + + +logger = logging.getLogger(__name__) + + +OPENAI_TIMEOUT = float(os.environ.get("HAYSTACK_OPENAI_TIMEOUT_SEC", 30)) + + +WhisperLocalModel = Literal["tiny", "small", "medium", "large", "large-v2"] +WhisperRemoteModel = Literal["whisper-1"] +WhisperModel = Union[WhisperLocalModel, WhisperRemoteModel] + + +@component +class WhisperTranscriber: + """ + Transcribes audio files using OpenAI's Whisper. This class supports two underlying implementations: + + - API (default): Uses the OpenAI API and requires an API key. See the + [OpenAI blog post](https://beta.openai.com/docs/api-reference/whisper for more details. + + - Local (requires installing Whisper): Uses the local installation + of [Whisper](https://github.com/openai/whisper). + + To use Whisper locally, install it following the instructions on the Whisper + [GitHub repo](https://github.com/openai/whisper) and omit the `api_key` parameter. + + To use the API implementation, provide an API key. You can get one by signing up for an + [OpenAI account](https://beta.openai.com/). + + For the supported audio formats, languages, and other parameters, see the + [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper + [github repo](https://github.com/openai/whisper). + """ + + @dataclass + class Output: + documents: List[Document] + + def __init__( + self, + model_name_or_path: WhisperModel = "whisper-1", + api_key: Optional[str] = None, + device: Optional[str] = None, + ): + """ + Transcribes a list of audio files into a list of Documents. + + :param api_key: OpenAI API key. If None, a local installation of Whisper is used. + :param model_name_or_path: Name of the model to use. If using a local installation of Whisper, set this to one + of the following values: + - `tiny` + - `small` + - `medium` + - `large` + - `large-v2` + If using the API, set this value to: + - `whisper-1` (default) + :param device: Device to use for inference. Only used if you're using a local installation of Whisper. + If None, CPU is used. + """ + if model_name_or_path not in (get_args(WhisperRemoteModel) + get_args(WhisperLocalModel)): + raise ValueError( + f"Model name not recognized. Choose one among: " + f"{', '.join(get_args(WhisperRemoteModel) + get_args(WhisperLocalModel))}." + ) + + if model_name_or_path in get_args(WhisperRemoteModel) and not api_key: + raise ValueError( + "Provide a valid API key for OpenAI API. Alternatively, install OpenAI Whisper (see " + "[Whisper](https://github.com/openai/whisper) for more details) " + f"and select a model size among: {', '.join(get_args(WhisperLocalModel))}" + ) + + if model_name_or_path in get_args(WhisperLocalModel) and not is_imported("whisper"): + raise ValueError( + "To use a local Whisper model, install Haystack's audio extras as `pip install farm-haystack[audio]` " + "or install Whisper yourself with `pip install openai-whisper`. You will need ffmpeg on your system " + "in either case, see: https://github.com/openai/whisper." + ) + + if model_name_or_path in get_args(WhisperLocalModel) and api_key: + logger.warning( + "An API Key was provided, but a local model was selected. " + "WhisperTranscriber will try to use the local model." + ) + + self.api_key = api_key + self.model_name = model_name_or_path + self.use_local_whisper = model_name_or_path in get_args(WhisperLocalModel) + + if self.use_local_whisper: + self.device = torch.device(device) if device else torch.device("cpu") + + self._model = None + if not self.use_local_whisper and api_key is None: + raise ValueError( + "Provide a valid API key for OpenAI API. Alternatively, install OpenAI Whisper (see " + "[Whisper](https://github.com/openai/whisper) for more details)." + ) + + def warm_up(self): + """ + If we're using a local model, load it here. + """ + if self.use_local_whisper and not self._model: + self._model = whisper.load_model(self.model_name, device=self.device) + + def run(self, audios: List[Path], whisper_params: Dict[str, Any]) -> Output: + documents = self.transcribe_to_documents(audios, **whisper_params) + return WhisperTranscriber.Output(documents) + + def transcribe_to_documents(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Document]: + """ + Transcribe the given audio files. Returns a list of Documents. + + For the supported audio formats, languages, and other parameters, see the + [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper + [github repo](https://github.com/openai/whisper). + + :param audio_files: a list of paths or binary streams to transcribe + :returns: a list of transcriptions. + """ + transcriptions = self.transcribe(audio_files=audio_files, **kwargs) + return [ + Document(content=transcript.pop("text"), metadata={"audio_file": audio, **transcript}) + for audio, transcript in zip(audio_files, transcriptions) + ] + + def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Dict[str, Any]]: + """ + Transcribe the given audio files. Returns a list of strings. + + For the supported audio formats, languages, and other parameters, see the + [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper + [github repo](https://github.com/openai/whisper). + + :param audio_files: a list of paths or binary streams to transcribe + :returns: a list of transcriptions. + """ + transcriptions = [] + for audio_file in audio_files: + if isinstance(audio_file, (str, Path)): + audio_file = open(audio_file, "rb") + + if self.use_local_whisper: + transcription = self._transcribe_locally(audio_file, **kwargs) + else: + transcription = self._transcribe_with_api(audio_file, **kwargs) + + transcriptions.append(transcription) + return transcriptions + + @retry(retry=retry_if_not_result(bool), wait=wait_exponential(min=1, max=10)) + def _transcribe_with_api(self, audio_file: BinaryIO, **kwargs) -> Dict[str, Any]: + """ + Calls a remote Whisper model through OpenAI Whisper API. + """ + translate = kwargs.pop("translate", False) + + response = requests.post( + url=f"https://api.openai.com/v1/audio/{'translations' if translate else 'transcriptions'}", + data={"model": "whisper-1", **kwargs}, + headers={"Authorization": f"Bearer {self.api_key}"}, + files=[("file", (audio_file.name, audio_file, "application/octet-stream"))], + timeout=600, + ) + + if response.status_code != 200: + if response.status_code == 429: + raise OpenAIRateLimitError(f"API rate limit exceeded: {response.text}") + raise OpenAIError( + f"OpenAI returned an error.\n" + f"Status code: {response.status_code}\n" + f"Response body: {response.text}", + status_code=response.status_code, + ) + + return json.loads(response.content) + + def _transcribe_locally(self, audio_file: BinaryIO, **kwargs) -> Dict[str, Any]: + """ + Calls a local Whisper model. + """ + if not self._model: + self.warm_up() + if not self._model: + raise ValueError("WhisperTranscriber._transcribe_locally() can't work without a local model.") + return_segments = kwargs.pop("return_segments", None) + transcription = self._model.transcribe(audio_file.name, **kwargs) + if not return_segments: + transcription.pop("segments", None) + return transcription From ee9e5fc586ee829f19e8a1b415cd1e36bf8aca39 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Fri, 12 May 2023 18:06:46 +0200 Subject: [PATCH 02/14] remove remote parts --- haystack/preview/components/audio/whisper.py | 209 ------------------ .../preview/components/audio/whisper_local.py | 119 ++++++++++ 2 files changed, 119 insertions(+), 209 deletions(-) delete mode 100644 haystack/preview/components/audio/whisper.py create mode 100644 haystack/preview/components/audio/whisper_local.py diff --git a/haystack/preview/components/audio/whisper.py b/haystack/preview/components/audio/whisper.py deleted file mode 100644 index 9ab3769c1b..0000000000 --- a/haystack/preview/components/audio/whisper.py +++ /dev/null @@ -1,209 +0,0 @@ -from typing import List, Optional, Dict, Any, Union, BinaryIO, Literal, get_args, Sequence - -import os -import json -import logging -from pathlib import Path -from dataclasses import dataclass - -import requests -import torch -import whisper -from tenacity import retry, wait_exponential, retry_if_not_result - -from haystack.preview import component, Document -from haystack.errors import OpenAIError, OpenAIRateLimitError -from haystack import is_imported - - -logger = logging.getLogger(__name__) - - -OPENAI_TIMEOUT = float(os.environ.get("HAYSTACK_OPENAI_TIMEOUT_SEC", 30)) - - -WhisperLocalModel = Literal["tiny", "small", "medium", "large", "large-v2"] -WhisperRemoteModel = Literal["whisper-1"] -WhisperModel = Union[WhisperLocalModel, WhisperRemoteModel] - - -@component -class WhisperTranscriber: - """ - Transcribes audio files using OpenAI's Whisper. This class supports two underlying implementations: - - - API (default): Uses the OpenAI API and requires an API key. See the - [OpenAI blog post](https://beta.openai.com/docs/api-reference/whisper for more details. - - - Local (requires installing Whisper): Uses the local installation - of [Whisper](https://github.com/openai/whisper). - - To use Whisper locally, install it following the instructions on the Whisper - [GitHub repo](https://github.com/openai/whisper) and omit the `api_key` parameter. - - To use the API implementation, provide an API key. You can get one by signing up for an - [OpenAI account](https://beta.openai.com/). - - For the supported audio formats, languages, and other parameters, see the - [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper - [github repo](https://github.com/openai/whisper). - """ - - @dataclass - class Output: - documents: List[Document] - - def __init__( - self, - model_name_or_path: WhisperModel = "whisper-1", - api_key: Optional[str] = None, - device: Optional[str] = None, - ): - """ - Transcribes a list of audio files into a list of Documents. - - :param api_key: OpenAI API key. If None, a local installation of Whisper is used. - :param model_name_or_path: Name of the model to use. If using a local installation of Whisper, set this to one - of the following values: - - `tiny` - - `small` - - `medium` - - `large` - - `large-v2` - If using the API, set this value to: - - `whisper-1` (default) - :param device: Device to use for inference. Only used if you're using a local installation of Whisper. - If None, CPU is used. - """ - if model_name_or_path not in (get_args(WhisperRemoteModel) + get_args(WhisperLocalModel)): - raise ValueError( - f"Model name not recognized. Choose one among: " - f"{', '.join(get_args(WhisperRemoteModel) + get_args(WhisperLocalModel))}." - ) - - if model_name_or_path in get_args(WhisperRemoteModel) and not api_key: - raise ValueError( - "Provide a valid API key for OpenAI API. Alternatively, install OpenAI Whisper (see " - "[Whisper](https://github.com/openai/whisper) for more details) " - f"and select a model size among: {', '.join(get_args(WhisperLocalModel))}" - ) - - if model_name_or_path in get_args(WhisperLocalModel) and not is_imported("whisper"): - raise ValueError( - "To use a local Whisper model, install Haystack's audio extras as `pip install farm-haystack[audio]` " - "or install Whisper yourself with `pip install openai-whisper`. You will need ffmpeg on your system " - "in either case, see: https://github.com/openai/whisper." - ) - - if model_name_or_path in get_args(WhisperLocalModel) and api_key: - logger.warning( - "An API Key was provided, but a local model was selected. " - "WhisperTranscriber will try to use the local model." - ) - - self.api_key = api_key - self.model_name = model_name_or_path - self.use_local_whisper = model_name_or_path in get_args(WhisperLocalModel) - - if self.use_local_whisper: - self.device = torch.device(device) if device else torch.device("cpu") - - self._model = None - if not self.use_local_whisper and api_key is None: - raise ValueError( - "Provide a valid API key for OpenAI API. Alternatively, install OpenAI Whisper (see " - "[Whisper](https://github.com/openai/whisper) for more details)." - ) - - def warm_up(self): - """ - If we're using a local model, load it here. - """ - if self.use_local_whisper and not self._model: - self._model = whisper.load_model(self.model_name, device=self.device) - - def run(self, audios: List[Path], whisper_params: Dict[str, Any]) -> Output: - documents = self.transcribe_to_documents(audios, **whisper_params) - return WhisperTranscriber.Output(documents) - - def transcribe_to_documents(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Document]: - """ - Transcribe the given audio files. Returns a list of Documents. - - For the supported audio formats, languages, and other parameters, see the - [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper - [github repo](https://github.com/openai/whisper). - - :param audio_files: a list of paths or binary streams to transcribe - :returns: a list of transcriptions. - """ - transcriptions = self.transcribe(audio_files=audio_files, **kwargs) - return [ - Document(content=transcript.pop("text"), metadata={"audio_file": audio, **transcript}) - for audio, transcript in zip(audio_files, transcriptions) - ] - - def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Dict[str, Any]]: - """ - Transcribe the given audio files. Returns a list of strings. - - For the supported audio formats, languages, and other parameters, see the - [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper - [github repo](https://github.com/openai/whisper). - - :param audio_files: a list of paths or binary streams to transcribe - :returns: a list of transcriptions. - """ - transcriptions = [] - for audio_file in audio_files: - if isinstance(audio_file, (str, Path)): - audio_file = open(audio_file, "rb") - - if self.use_local_whisper: - transcription = self._transcribe_locally(audio_file, **kwargs) - else: - transcription = self._transcribe_with_api(audio_file, **kwargs) - - transcriptions.append(transcription) - return transcriptions - - @retry(retry=retry_if_not_result(bool), wait=wait_exponential(min=1, max=10)) - def _transcribe_with_api(self, audio_file: BinaryIO, **kwargs) -> Dict[str, Any]: - """ - Calls a remote Whisper model through OpenAI Whisper API. - """ - translate = kwargs.pop("translate", False) - - response = requests.post( - url=f"https://api.openai.com/v1/audio/{'translations' if translate else 'transcriptions'}", - data={"model": "whisper-1", **kwargs}, - headers={"Authorization": f"Bearer {self.api_key}"}, - files=[("file", (audio_file.name, audio_file, "application/octet-stream"))], - timeout=600, - ) - - if response.status_code != 200: - if response.status_code == 429: - raise OpenAIRateLimitError(f"API rate limit exceeded: {response.text}") - raise OpenAIError( - f"OpenAI returned an error.\n" - f"Status code: {response.status_code}\n" - f"Response body: {response.text}", - status_code=response.status_code, - ) - - return json.loads(response.content) - - def _transcribe_locally(self, audio_file: BinaryIO, **kwargs) -> Dict[str, Any]: - """ - Calls a local Whisper model. - """ - if not self._model: - self.warm_up() - if not self._model: - raise ValueError("WhisperTranscriber._transcribe_locally() can't work without a local model.") - return_segments = kwargs.pop("return_segments", None) - transcription = self._model.transcribe(audio_file.name, **kwargs) - if not return_segments: - transcription.pop("segments", None) - return transcription diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py new file mode 100644 index 0000000000..a39140ed10 --- /dev/null +++ b/haystack/preview/components/audio/whisper_local.py @@ -0,0 +1,119 @@ +from typing import List, Optional, Dict, Any, Union, BinaryIO, Literal, get_args, Sequence + +import logging +from pathlib import Path +from dataclasses import dataclass + +import torch +import haystack.preview.components.audio.whisper_local as whisper_local + +from haystack.preview import component, Document +from haystack import is_imported + + +logger = logging.getLogger(__name__) +WhisperLocalModel = Literal["tiny", "small", "medium", "large", "large-v2"] + + +@component +class LocalWhisperTranscriber: + """ + Transcribes audio files using OpenAI's Whisper's on your local machine. + + To use Whisper locally, install it following the instructions on the Whisper + [GitHub repo](https://github.com/openai/whisper) and omit the `api_key` parameter. + + For the supported audio formats, languages, and other parameters, see the + [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper + [github repo](https://github.com/openai/whisper). + """ + + @dataclass + class Output: + documents: List[Document] + + def __init__(self, model_name_or_path: WhisperLocalModel = "large", device: Optional[str] = None): + """ + Transcribes a list of audio files into a list of Documents. + + :param model_name_or_path: Name of the model to use. If using a local installation of Whisper, set this to one + of the following values: + - `tiny` + - `small` + - `medium` + - `large` + - `large-v2` + :param device: Device to use for inference. Only used if you're using a local installation of Whisper. + If None, CPU is used. + """ + if model_name_or_path not in get_args(WhisperLocalModel): + raise ValueError( + f"Model name not recognized. Choose one among: " f"{', '.join(get_args(WhisperLocalModel))}." + ) + + if not is_imported("whisper"): + raise ValueError( + "To use a local Whisper model, install Haystack's audio extras as `pip install farm-haystack[audio]` " + "or install Whisper yourself with `pip install openai-whisper`. You will need ffmpeg on your system " + "in either case, see: https://github.com/openai/whisper." + ) + + self.model_name = model_name_or_path + self.device = torch.device(device) if device else torch.device("cpu") + self._model = None + + def warm_up(self): + """ + If we're using a local model, load it here. + """ + if not self._model: + self._model = whisper_local.load_model(self.model_name, device=self.device) + + def run(self, audios: List[Path], whisper_params: Dict[str, Any]) -> Output: + documents = self.transcribe_to_documents(audios, **whisper_params) + return LocalWhisperTranscriber.Output(documents) + + def transcribe_to_documents(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Document]: + """ + Transcribe the given audio files. Returns a list of Documents. + + For the supported audio formats, languages, and other parameters, see the + [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper + [github repo](https://github.com/openai/whisper). + + :param audio_files: a list of paths or binary streams to transcribe + :returns: a list of transcriptions. + """ + transcriptions = self.transcribe(audio_files=audio_files, **kwargs) + return [ + Document(content=transcript.pop("text"), metadata={"audio_file": audio, **transcript}) + for audio, transcript in zip(audio_files, transcriptions) + ] + + def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Dict[str, Any]]: + """ + Transcribe the given audio files. Returns a list of strings. + + For the supported audio formats, languages, and other parameters, see the + [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper + [github repo](https://github.com/openai/whisper). + + :param audio_files: a list of paths or binary streams to transcribe + :returns: a list of transcriptions. + """ + self.warm_up() + if not self._model: + raise ValueError("WhisperTranscriber._transcribe_locally() can't work without a local model.") + + return_segments = kwargs.pop("return_segments", None) + transcriptions = [] + for audio_file in audio_files: + if isinstance(audio_file, (str, Path)): + audio_file = open(audio_file, "rb") + + transcription = self._model.transcribe(audio_file.name, **kwargs) + if not return_segments: + transcription.pop("segments", None) + + transcriptions.append(transcription) + return transcriptions From ffc301976e99e14fa36b28bf2924b93aeec95f8f Mon Sep 17 00:00:00 2001 From: ZanSara Date: Fri, 12 May 2023 18:18:18 +0200 Subject: [PATCH 03/14] unit tests --- .../this is the content of the document.wav | Bin 0 -> 89644 bytes e2e/preview/components/test_transcriber.py | 13 +++ haystack/preview/components/__init__.py | 1 + haystack/preview/components/audio/__init__.py | 1 + test/preview/components/test_whisper_local.py | 93 ++++++++++++++++++ 5 files changed, 108 insertions(+) create mode 100644 e2e/preview/components/test_files/this is the content of the document.wav create mode 100644 e2e/preview/components/test_transcriber.py create mode 100644 haystack/preview/components/__init__.py create mode 100644 haystack/preview/components/audio/__init__.py create mode 100644 test/preview/components/test_whisper_local.py diff --git a/e2e/preview/components/test_files/this is the content of the document.wav b/e2e/preview/components/test_files/this is the content of the document.wav new file mode 100644 index 0000000000000000000000000000000000000000..37d651fa9dd0755ab3aa9d6c71d19958c7d18719 GIT binary patch literal 89644 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

-&{zMv1^W?Xr?>wlI!cm-L192gLef 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 literal 0 HcmV?d00001 diff --git a/e2e/preview/components/test_transcriber.py b/e2e/preview/components/test_transcriber.py new file mode 100644 index 0000000000..b4e693d72c --- /dev/null +++ b/e2e/preview/components/test_transcriber.py @@ -0,0 +1,13 @@ +import os +from pathlib import Path + +from haystack.preview.components import LocalWhisperTranscriber + + +SAMPLES_PATH = Path(__file__).parent.parent / "test_files" + + +def test_raw_transcribe_local(): + comp = LocalWhisperTranscriber(model_name_or_path="tiny") + output = comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) + assert "this is the content of the document" in output[0]["text"].lower() diff --git a/haystack/preview/components/__init__.py b/haystack/preview/components/__init__.py new file mode 100644 index 0000000000..c21116967b --- /dev/null +++ b/haystack/preview/components/__init__.py @@ -0,0 +1 @@ +from haystack.preview.components.audio.whisper_local import LocalWhisperTranscriber diff --git a/haystack/preview/components/audio/__init__.py b/haystack/preview/components/audio/__init__.py new file mode 100644 index 0000000000..c21116967b --- /dev/null +++ b/haystack/preview/components/audio/__init__.py @@ -0,0 +1 @@ +from haystack.preview.components.audio.whisper_local import LocalWhisperTranscriber diff --git a/test/preview/components/test_whisper_local.py b/test/preview/components/test_whisper_local.py new file mode 100644 index 0000000000..1477ae7dee --- /dev/null +++ b/test/preview/components/test_whisper_local.py @@ -0,0 +1,93 @@ +import os +import sys +from pathlib import Path +from unittest.mock import MagicMock + +import pytest +import torch +import whisper +from generalimport import FakeModule + +from haystack.preview.dataclasses import Document +from haystack.preview.components import LocalWhisperTranscriber + +from test.preview.components.test_component_base import BaseTestComponent + + +SAMPLES_PATH = Path(__file__).parent.parent / "test_files" + + +class TestTranscriber(BaseTestComponent): + """ + Tests for WhisperTranscriber. + """ + + @pytest.fixture + def components(self): + return [LocalWhisperTranscriber(model_name_or_path="large-v2")] + + @pytest.fixture + def mock_models(self, monkeypatch): + def mock_transcribe(_, audio_file, **kwargs): + return { + "text": "test transcription", + "other_metadata": ["other", "meta", "data"], + "kwargs received": kwargs, + } + + monkeypatch.setattr(LocalWhisperTranscriber, "_transcribe_with_api", mock_transcribe) + monkeypatch.setattr(LocalWhisperTranscriber, "_transcribe_locally", mock_transcribe) + monkeypatch.setattr(LocalWhisperTranscriber, "warm_up", lambda self: None) + + @pytest.mark.unit + def test_init(self): + transcriber = LocalWhisperTranscriber(model_name_or_path="large-v2") + assert transcriber.model_name == "large-v2" # Doesn't matter if it's huge, the model is not loaded in init. + assert transcriber.use_local_whisper + assert hasattr(transcriber, "device") and transcriber.device == torch.device("cpu") + assert hasattr(transcriber, "_model") and transcriber._model is None + + @pytest.mark.unit + def test_init_missing_whisper_lib(self, monkeypatch): + monkeypatch.setitem(sys.modules, "whisper", FakeModule(spec=MagicMock(), message="test")) + with pytest.raises(ValueError, match="audio extra"): + LocalWhisperTranscriber(model_name_or_path="large-v2") + + @pytest.mark.unit + def test_warmup(self, monkeypatch): + load_model = MagicMock() + load_model.side_effect = ["FAKE MODEL"] + monkeypatch.setattr(whisper, "load_model", load_model) + + component = LocalWhisperTranscriber(model_name_or_path="large-v2") + component.warm_up() + + assert hasattr(component, "_model") + assert component._model == "FAKE MODEL" + load_model.assert_called_with("large-v2", device=torch.device(type="cpu")) + + @pytest.mark.unit + def test_warmup_doesnt_reload(self, monkeypatch): + load_model = MagicMock() + monkeypatch.setattr(whisper, "load_model", load_model) + component = LocalWhisperTranscriber(model_name_or_path="large-v2") + component.warm_up() + component.warm_up() + load_model.assert_called_once() + + @pytest.mark.unit + def test_transcribe_to_documents(self, mock_models): + comp = LocalWhisperTranscriber(model_name_or_path="large-v2") + output = comp.transcribe_to_documents( + audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"] + ) + assert output == [ + Document( + content="test transcription", + metadata={ + "audio_file": SAMPLES_PATH / "audio" / "this is the content of the document.wav", + "other_metadata": ["other", "meta", "data"], + "kwargs received": {}, + }, + ) + ] From ad92b78c451c7b242deddfef2db95cad9b2da11e Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 15 May 2023 10:52:24 +0200 Subject: [PATCH 04/14] polish docstrings --- e2e/preview/components/test_transcriber.py | 2 +- .../preview/components/audio/whisper_local.py | 68 +++++++++---------- test/preview/components/test_whisper_local.py | 4 +- 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/e2e/preview/components/test_transcriber.py b/e2e/preview/components/test_transcriber.py index b4e693d72c..289d24b786 100644 --- a/e2e/preview/components/test_transcriber.py +++ b/e2e/preview/components/test_transcriber.py @@ -9,5 +9,5 @@ def test_raw_transcribe_local(): comp = LocalWhisperTranscriber(model_name_or_path="tiny") - output = comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) + output = comp._raw_transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) assert "this is the content of the document" in output[0]["text"].lower() diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py index a39140ed10..dc5a5a2dcd 100644 --- a/haystack/preview/components/audio/whisper_local.py +++ b/haystack/preview/components/audio/whisper_local.py @@ -8,7 +8,6 @@ import haystack.preview.components.audio.whisper_local as whisper_local from haystack.preview import component, Document -from haystack import is_imported logger = logging.getLogger(__name__) @@ -18,10 +17,7 @@ @component class LocalWhisperTranscriber: """ - Transcribes audio files using OpenAI's Whisper's on your local machine. - - To use Whisper locally, install it following the instructions on the Whisper - [GitHub repo](https://github.com/openai/whisper) and omit the `api_key` parameter. + Transcribes audio files using OpenAI's Whisper's model on your local machine. For the supported audio formats, languages, and other parameters, see the [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper @@ -34,65 +30,69 @@ class Output: def __init__(self, model_name_or_path: WhisperLocalModel = "large", device: Optional[str] = None): """ - Transcribes a list of audio files into a list of Documents. - - :param model_name_or_path: Name of the model to use. If using a local installation of Whisper, set this to one - of the following values: - - `tiny` - - `small` - - `medium` - - `large` - - `large-v2` - :param device: Device to use for inference. Only used if you're using a local installation of Whisper. - If None, CPU is used. + :param model_name_or_path: Name of the model to use. Set it to one of the following values: + - `tiny` + - `small` + - `medium` + - `large` + - `large-v2` + :param device: Name of the torch device to use for inference. If None, CPU is used. """ if model_name_or_path not in get_args(WhisperLocalModel): raise ValueError( f"Model name not recognized. Choose one among: " f"{', '.join(get_args(WhisperLocalModel))}." ) - - if not is_imported("whisper"): - raise ValueError( - "To use a local Whisper model, install Haystack's audio extras as `pip install farm-haystack[audio]` " - "or install Whisper yourself with `pip install openai-whisper`. You will need ffmpeg on your system " - "in either case, see: https://github.com/openai/whisper." - ) - self.model_name = model_name_or_path self.device = torch.device(device) if device else torch.device("cpu") self._model = None - def warm_up(self): + def warm_up(self) -> None: """ - If we're using a local model, load it here. + Loads the model. """ if not self._model: self._model = whisper_local.load_model(self.model_name, device=self.device) - def run(self, audios: List[Path], whisper_params: Dict[str, Any]) -> Output: - documents = self.transcribe_to_documents(audios, **whisper_params) + def run(self, audio_files: List[Path], whisper_params: Dict[str, Any]) -> Output: + """ + Transcribe the audio files into a list of Documents, one for each input file. + + For the supported audio formats, languages, and other parameters, see the + [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper + [github repo](https://github.com/openai/whisper). + + :param audio_files: a list of paths or binary streams to transcribe + :returns: a list of Documents, one for each file. The content of the document is the transcription text, + while the document's metadata contains all the other values returned by the Whisper model, such as the + alignment data. Another key called `audio_file` contains the path to the audio file used for the + transcription. + """ + documents = self.transcribe(audio_files, **whisper_params) return LocalWhisperTranscriber.Output(documents) - def transcribe_to_documents(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Document]: + def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Document]: """ - Transcribe the given audio files. Returns a list of Documents. + Transcribe the audio files into a list of Documents, one for each input file. For the supported audio formats, languages, and other parameters, see the [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper [github repo](https://github.com/openai/whisper). :param audio_files: a list of paths or binary streams to transcribe - :returns: a list of transcriptions. + :returns: a list of Documents, one for each file. The content of the document is the transcription text, + while the document's metadata contains all the other values returned by the Whisper model, such as the + alignment data. Another key called `audio_file` contains the path to the audio file used for the + transcription. """ - transcriptions = self.transcribe(audio_files=audio_files, **kwargs) + transcriptions = self._raw_transcribe(audio_files=audio_files, **kwargs) return [ Document(content=transcript.pop("text"), metadata={"audio_file": audio, **transcript}) for audio, transcript in zip(audio_files, transcriptions) ] - def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Dict[str, Any]]: + def _raw_transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Dict[str, Any]]: """ - Transcribe the given audio files. Returns a list of strings. + Transcribe the given audio files. Returns the output of the model, a dictionary, for each input file. For the supported audio formats, languages, and other parameters, see the [Whisper API documentation](https://platform.openai.com/docs/guides/speech-to-text) and the official Whisper diff --git a/test/preview/components/test_whisper_local.py b/test/preview/components/test_whisper_local.py index 1477ae7dee..de576e2f83 100644 --- a/test/preview/components/test_whisper_local.py +++ b/test/preview/components/test_whisper_local.py @@ -78,9 +78,7 @@ def test_warmup_doesnt_reload(self, monkeypatch): @pytest.mark.unit def test_transcribe_to_documents(self, mock_models): comp = LocalWhisperTranscriber(model_name_or_path="large-v2") - output = comp.transcribe_to_documents( - audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"] - ) + output = comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) assert output == [ Document( content="test transcription", From 4374ba34ee1ebee8b62451f4a15cbe218fc90c47 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 15 May 2023 11:32:28 +0200 Subject: [PATCH 05/14] fix unit tests --- .../preview/components/audio/whisper_local.py | 14 ++-- test/preview/components/test_whisper_local.py | 72 ++++++++---------- .../this is the content of the document.wav | Bin 0 -> 89644 bytes 3 files changed, 39 insertions(+), 47 deletions(-) create mode 100644 test/preview/test_files/audio/this is the content of the document.wav diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py index dc5a5a2dcd..905883f02d 100644 --- a/haystack/preview/components/audio/whisper_local.py +++ b/haystack/preview/components/audio/whisper_local.py @@ -5,7 +5,7 @@ from dataclasses import dataclass import torch -import haystack.preview.components.audio.whisper_local as whisper_local +import whisper from haystack.preview import component, Document @@ -51,7 +51,7 @@ def warm_up(self) -> None: Loads the model. """ if not self._model: - self._model = whisper_local.load_model(self.model_name, device=self.device) + self._model = whisper.load_model(self.model_name, device=self.device) def run(self, audio_files: List[Path], whisper_params: Dict[str, Any]) -> Output: """ @@ -85,10 +85,12 @@ def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs transcription. """ transcriptions = self._raw_transcribe(audio_files=audio_files, **kwargs) - return [ - Document(content=transcript.pop("text"), metadata={"audio_file": audio, **transcript}) - for audio, transcript in zip(audio_files, transcriptions) - ] + documents = [] + for audio, transcript in zip(audio_files, transcriptions): + content = transcript.pop("text") + doc = Document(content=content, metadata={"audio_file": audio, **transcript}) + documents.append(doc) + return documents def _raw_transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Dict[str, Any]]: """ diff --git a/test/preview/components/test_whisper_local.py b/test/preview/components/test_whisper_local.py index de576e2f83..f31b56274d 100644 --- a/test/preview/components/test_whisper_local.py +++ b/test/preview/components/test_whisper_local.py @@ -1,4 +1,3 @@ -import os import sys from pathlib import Path from unittest.mock import MagicMock @@ -6,77 +5,68 @@ import pytest import torch import whisper -from generalimport import FakeModule +from generalimport import FakeModule, MissingOptionalDependency +from haystack import is_imported from haystack.preview.dataclasses import Document from haystack.preview.components import LocalWhisperTranscriber -from test.preview.components.test_component_base import BaseTestComponent +from test.preview.components.base import BaseTestComponent SAMPLES_PATH = Path(__file__).parent.parent / "test_files" -class TestTranscriber(BaseTestComponent): - """ - Tests for WhisperTranscriber. - """ +class FakeWhisperModel(MagicMock): + def __init__(self, *a, **k): + super().__init__(*a, **k) + def transcribe(_, audio_file, **kwargs): + return {"text": "test transcription", "other_metadata": ["other", "meta", "data"], "kwargs received": kwargs} + + +class Test_LocalWhisperTranscriber(BaseTestComponent): @pytest.fixture def components(self): return [LocalWhisperTranscriber(model_name_or_path="large-v2")] - @pytest.fixture - def mock_models(self, monkeypatch): - def mock_transcribe(_, audio_file, **kwargs): - return { - "text": "test transcription", - "other_metadata": ["other", "meta", "data"], - "kwargs received": kwargs, - } - - monkeypatch.setattr(LocalWhisperTranscriber, "_transcribe_with_api", mock_transcribe) - monkeypatch.setattr(LocalWhisperTranscriber, "_transcribe_locally", mock_transcribe) - monkeypatch.setattr(LocalWhisperTranscriber, "warm_up", lambda self: None) + @pytest.fixture(autouse=True) + def mock_model(self, monkeypatch): + load_model = MagicMock() + load_model.side_effect = [FakeWhisperModel()] + monkeypatch.setattr(whisper, "load_model", load_model) + return load_model @pytest.mark.unit def test_init(self): - transcriber = LocalWhisperTranscriber(model_name_or_path="large-v2") - assert transcriber.model_name == "large-v2" # Doesn't matter if it's huge, the model is not loaded in init. - assert transcriber.use_local_whisper + transcriber = LocalWhisperTranscriber( + model_name_or_path="large-v2" + ) # Doesn't matter if it's huge, the model is not loaded in init. + assert transcriber.model_name == "large-v2" assert hasattr(transcriber, "device") and transcriber.device == torch.device("cpu") assert hasattr(transcriber, "_model") and transcriber._model is None @pytest.mark.unit - def test_init_missing_whisper_lib(self, monkeypatch): - monkeypatch.setitem(sys.modules, "whisper", FakeModule(spec=MagicMock(), message="test")) - with pytest.raises(ValueError, match="audio extra"): - LocalWhisperTranscriber(model_name_or_path="large-v2") - - @pytest.mark.unit - def test_warmup(self, monkeypatch): - load_model = MagicMock() - load_model.side_effect = ["FAKE MODEL"] - monkeypatch.setattr(whisper, "load_model", load_model) - + def test_warmup(self, mock_model): component = LocalWhisperTranscriber(model_name_or_path="large-v2") - component.warm_up() + assert hasattr(component, "_model") + assert not isinstance(component._model, FakeWhisperModel) + mock_model.assert_not_called() + component.warm_up() assert hasattr(component, "_model") - assert component._model == "FAKE MODEL" - load_model.assert_called_with("large-v2", device=torch.device(type="cpu")) + assert isinstance(component._model, FakeWhisperModel) + mock_model.assert_called_with("large-v2", device=torch.device(type="cpu")) @pytest.mark.unit - def test_warmup_doesnt_reload(self, monkeypatch): - load_model = MagicMock() - monkeypatch.setattr(whisper, "load_model", load_model) + def test_warmup_doesnt_reload(self, mock_model): component = LocalWhisperTranscriber(model_name_or_path="large-v2") component.warm_up() component.warm_up() - load_model.assert_called_once() + mock_model.assert_called_once() @pytest.mark.unit - def test_transcribe_to_documents(self, mock_models): + def test_transcribe_to_documents(self): comp = LocalWhisperTranscriber(model_name_or_path="large-v2") output = comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) assert output == [ diff --git a/test/preview/test_files/audio/this is the content of the document.wav b/test/preview/test_files/audio/this is the content of the document.wav new file mode 100644 index 0000000000000000000000000000000000000000..37d651fa9dd0755ab3aa9d6c71d19958c7d18719 GIT binary patch literal 89644 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

-&{zMv1^W?Xr?>wlI!cm-L192gLef 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 literal 0 HcmV?d00001 From 12e044a8ca3d2ec46cc4b05db1afe3c6da2349f1 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 15 May 2023 11:38:47 +0200 Subject: [PATCH 06/14] fix e2e tests --- e2e/preview/components/test_transcriber.py | 15 ++++++++++++--- .../the context for this answer is here.wav | Bin 0 -> 99884 bytes .../this is the content of the document.wav | Bin test/preview/components/test_whisper_local.py | 2 -- 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 e2e/preview/test_files/audio/the context for this answer is here.wav rename e2e/preview/{components/test_files => test_files/audio}/this is the content of the document.wav (100%) diff --git a/e2e/preview/components/test_transcriber.py b/e2e/preview/components/test_transcriber.py index 289d24b786..5418036dd2 100644 --- a/e2e/preview/components/test_transcriber.py +++ b/e2e/preview/components/test_transcriber.py @@ -7,7 +7,16 @@ SAMPLES_PATH = Path(__file__).parent.parent / "test_files" -def test_raw_transcribe_local(): +def test_whisperlocaltranscriber(): comp = LocalWhisperTranscriber(model_name_or_path="tiny") - output = comp._raw_transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) - assert "this is the content of the document" in output[0]["text"].lower() + docs = comp.transcribe( + audio_files=[ + SAMPLES_PATH / "audio" / "this is the content of the document.wav", + SAMPLES_PATH / "audio" / "the context for this answer is here.wav", + ] + ) + assert len(docs) == 2 + assert "this is the content of the document." == docs[0].content.strip().lower() + assert SAMPLES_PATH / "audio" / "this is the content of the document.wav" == docs[0].metadata["audio_file"] + assert "the context for this answer is here." == docs[1].content.strip().lower() + assert SAMPLES_PATH / "audio" / "the context for this answer is here.wav" == docs[1].metadata["audio_file"] diff --git a/e2e/preview/test_files/audio/the context for this answer is here.wav b/e2e/preview/test_files/audio/the context for this answer is here.wav new file mode 100644 index 0000000000000000000000000000000000000000..b6515a85dbda357af854a4df5f7e390702333963 GIT binary patch literal 99884 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 KjOa?vll?zJxZF_y literal 0 HcmV?d00001 diff --git a/e2e/preview/components/test_files/this is the content of the document.wav b/e2e/preview/test_files/audio/this is the content of the document.wav similarity index 100% rename from e2e/preview/components/test_files/this is the content of the document.wav rename to e2e/preview/test_files/audio/this is the content of the document.wav diff --git a/test/preview/components/test_whisper_local.py b/test/preview/components/test_whisper_local.py index f31b56274d..79f910f046 100644 --- a/test/preview/components/test_whisper_local.py +++ b/test/preview/components/test_whisper_local.py @@ -5,9 +5,7 @@ import pytest import torch import whisper -from generalimport import FakeModule, MissingOptionalDependency -from haystack import is_imported from haystack.preview.dataclasses import Document from haystack.preview.components import LocalWhisperTranscriber From 1466a21a08df875db38efaf77bf2110d5ad2059d Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 15 May 2023 12:06:39 +0200 Subject: [PATCH 07/14] pylint --- e2e/preview/components/test_transcriber.py | 1 - 1 file changed, 1 deletion(-) diff --git a/e2e/preview/components/test_transcriber.py b/e2e/preview/components/test_transcriber.py index 5418036dd2..8fb81546f3 100644 --- a/e2e/preview/components/test_transcriber.py +++ b/e2e/preview/components/test_transcriber.py @@ -1,4 +1,3 @@ -import os from pathlib import Path from haystack.preview.components import LocalWhisperTranscriber From f7a59fde572d527a3cf32a6c92b81a6f1ec54ec8 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 15 May 2023 14:32:09 +0200 Subject: [PATCH 08/14] remove check --- haystack/preview/components/audio/__init__.py | 1 - haystack/preview/components/audio/whisper_local.py | 3 --- 2 files changed, 4 deletions(-) diff --git a/haystack/preview/components/audio/__init__.py b/haystack/preview/components/audio/__init__.py index c21116967b..e69de29bb2 100644 --- a/haystack/preview/components/audio/__init__.py +++ b/haystack/preview/components/audio/__init__.py @@ -1 +0,0 @@ -from haystack.preview.components.audio.whisper_local import LocalWhisperTranscriber diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py index 905883f02d..1fba894b61 100644 --- a/haystack/preview/components/audio/whisper_local.py +++ b/haystack/preview/components/audio/whisper_local.py @@ -104,9 +104,6 @@ def _raw_transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **k :returns: a list of transcriptions. """ self.warm_up() - if not self._model: - raise ValueError("WhisperTranscriber._transcribe_locally() can't work without a local model.") - return_segments = kwargs.pop("return_segments", None) transcriptions = [] for audio_file in audio_files: From 2f32076d8472d3a4684688e94144dc42acbf9813 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 15 May 2023 14:42:01 +0200 Subject: [PATCH 09/14] review feedback --- .../preview/components/audio/whisper_local.py | 5 +- test/preview/components/test_whisper_local.py | 59 +++++++------------ 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py index 1fba894b61..3896ab0920 100644 --- a/haystack/preview/components/audio/whisper_local.py +++ b/haystack/preview/components/audio/whisper_local.py @@ -104,7 +104,10 @@ def _raw_transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **k :returns: a list of transcriptions. """ self.warm_up() - return_segments = kwargs.pop("return_segments", None) + if not self._model: + raise ValueError("WhisperTranscriber._transcribe_locally() can't work without a local model.") + + return_segments = kwargs.pop("return_segments", False) transcriptions = [] for audio_file in audio_files: if isinstance(audio_file, (str, Path)): diff --git a/test/preview/components/test_whisper_local.py b/test/preview/components/test_whisper_local.py index 79f910f046..6da0838468 100644 --- a/test/preview/components/test_whisper_local.py +++ b/test/preview/components/test_whisper_local.py @@ -1,10 +1,8 @@ -import sys from pathlib import Path -from unittest.mock import MagicMock +from unittest.mock import patch, MagicMock import pytest import torch -import whisper from haystack.preview.dataclasses import Document from haystack.preview.components import LocalWhisperTranscriber @@ -15,65 +13,50 @@ SAMPLES_PATH = Path(__file__).parent.parent / "test_files" -class FakeWhisperModel(MagicMock): - def __init__(self, *a, **k): - super().__init__(*a, **k) - - def transcribe(_, audio_file, **kwargs): - return {"text": "test transcription", "other_metadata": ["other", "meta", "data"], "kwargs received": kwargs} - - class Test_LocalWhisperTranscriber(BaseTestComponent): @pytest.fixture def components(self): return [LocalWhisperTranscriber(model_name_or_path="large-v2")] - @pytest.fixture(autouse=True) - def mock_model(self, monkeypatch): - load_model = MagicMock() - load_model.side_effect = [FakeWhisperModel()] - monkeypatch.setattr(whisper, "load_model", load_model) - return load_model - @pytest.mark.unit def test_init(self): transcriber = LocalWhisperTranscriber( model_name_or_path="large-v2" ) # Doesn't matter if it's huge, the model is not loaded in init. assert transcriber.model_name == "large-v2" - assert hasattr(transcriber, "device") and transcriber.device == torch.device("cpu") - assert hasattr(transcriber, "_model") and transcriber._model is None + assert transcriber.device == torch.device("cpu") + assert transcriber._model is None @pytest.mark.unit - def test_warmup(self, mock_model): - component = LocalWhisperTranscriber(model_name_or_path="large-v2") - assert hasattr(component, "_model") - assert not isinstance(component._model, FakeWhisperModel) - mock_model.assert_not_called() - - component.warm_up() - assert hasattr(component, "_model") - assert isinstance(component._model, FakeWhisperModel) - mock_model.assert_called_with("large-v2", device=torch.device(type="cpu")) + def test_warmup(self): + with patch("haystack.preview.components.audio.whisper_local.whisper") as mocked_whisper: + transcriber = LocalWhisperTranscriber(model_name_or_path="large-v2") + mocked_whisper.load_model.assert_not_called() + transcriber.warm_up() + mocked_whisper.load_model.assert_called_once_with("large-v2", device=torch.device(type="cpu")) @pytest.mark.unit - def test_warmup_doesnt_reload(self, mock_model): - component = LocalWhisperTranscriber(model_name_or_path="large-v2") - component.warm_up() - component.warm_up() - mock_model.assert_called_once() + def test_warmup_doesnt_reload(self): + with patch("haystack.preview.components.audio.whisper_local.whisper") as mocked_whisper: + transcriber = LocalWhisperTranscriber(model_name_or_path="large-v2") + transcriber.warm_up() + transcriber.warm_up() + mocked_whisper.load_model.assert_called_once() @pytest.mark.unit def test_transcribe_to_documents(self): comp = LocalWhisperTranscriber(model_name_or_path="large-v2") - output = comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) - assert output == [ + comp._model = MagicMock() + comp._model.transcribe.return_value = { + "text": "test transcription", + "other_metadata": ["other", "meta", "data"], + } + assert comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) == [ Document( content="test transcription", metadata={ "audio_file": SAMPLES_PATH / "audio" / "this is the content of the document.wav", "other_metadata": ["other", "meta", "data"], - "kwargs received": {}, }, ) ] From 6d5812cf5ee2b16a6ef6e067506aae6dfa650b94 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 15 May 2023 20:04:01 +0200 Subject: [PATCH 10/14] add type: ignore --- haystack/preview/components/audio/whisper_local.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py index 3896ab0920..82898a6a8e 100644 --- a/haystack/preview/components/audio/whisper_local.py +++ b/haystack/preview/components/audio/whisper_local.py @@ -104,18 +104,16 @@ def _raw_transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **k :returns: a list of transcriptions. """ self.warm_up() - if not self._model: - raise ValueError("WhisperTranscriber._transcribe_locally() can't work without a local model.") - return_segments = kwargs.pop("return_segments", False) transcriptions = [] for audio_file in audio_files: if isinstance(audio_file, (str, Path)): audio_file = open(audio_file, "rb") - transcription = self._model.transcribe(audio_file.name, **kwargs) + # mypy compains that _model is not guaranteed to be not None. It is: check self.warm_up() + transcription = self._model.transcribe(audio_file.name, **kwargs) # type: ignore if not return_segments: transcription.pop("segments", None) - transcriptions.append(transcription) + return transcriptions From 393ca3daeeecca34afa837b10275b82d830e3593 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Wed, 17 May 2023 14:50:55 +0200 Subject: [PATCH 11/14] improve tests --- e2e/preview/components/test_transcriber.py | 15 ++++-- e2e/preview/test_files/audio/answer.wav | Bin 0 -> 29228 bytes .../preview/components/audio/whisper_local.py | 9 +++- .../{ => audio}/test_whisper_local.py | 44 ++++++++++++++---- 4 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 e2e/preview/test_files/audio/answer.wav rename test/preview/components/{ => audio}/test_whisper_local.py (56%) diff --git a/e2e/preview/components/test_transcriber.py b/e2e/preview/components/test_transcriber.py index 8fb81546f3..6cabc03c84 100644 --- a/e2e/preview/components/test_transcriber.py +++ b/e2e/preview/components/test_transcriber.py @@ -11,11 +11,20 @@ def test_whisperlocaltranscriber(): docs = comp.transcribe( audio_files=[ SAMPLES_PATH / "audio" / "this is the content of the document.wav", - SAMPLES_PATH / "audio" / "the context for this answer is here.wav", + str((SAMPLES_PATH / "audio" / "the context for this answer is here.wav").absolute()), + open(SAMPLES_PATH / "audio" / "answer.wav", "rb"), ] ) - assert len(docs) == 2 + assert len(docs) == 3 + assert "this is the content of the document." == docs[0].content.strip().lower() assert SAMPLES_PATH / "audio" / "this is the content of the document.wav" == docs[0].metadata["audio_file"] + assert "the context for this answer is here." == docs[1].content.strip().lower() - assert SAMPLES_PATH / "audio" / "the context for this answer is here.wav" == docs[1].metadata["audio_file"] + assert ( + str((SAMPLES_PATH / "audio" / "the context for this answer is here.wav").absolute()) + == docs[1].metadata["audio_file"] + ) + + assert "answer." == docs[2].content.strip().lower() + assert "<>" == docs[2].metadata["audio_file"] diff --git a/e2e/preview/test_files/audio/answer.wav b/e2e/preview/test_files/audio/answer.wav new file mode 100644 index 0000000000000000000000000000000000000000..874eab01fede4e6b7fe24270d70ff85a87f5caa3 GIT binary patch literal 29228 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 literal 0 HcmV?d00001 diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py index 82898a6a8e..b462aa0fe6 100644 --- a/haystack/preview/components/audio/whisper_local.py +++ b/haystack/preview/components/audio/whisper_local.py @@ -40,7 +40,8 @@ def __init__(self, model_name_or_path: WhisperLocalModel = "large", device: Opti """ if model_name_or_path not in get_args(WhisperLocalModel): raise ValueError( - f"Model name not recognized. Choose one among: " f"{', '.join(get_args(WhisperLocalModel))}." + f"Model name '{model_name_or_path}' not recognized. Choose one among: " + f"{', '.join(get_args(WhisperLocalModel))}." ) self.model_name = model_name_or_path self.device = torch.device(device) if device else torch.device("cpu") @@ -53,7 +54,7 @@ def warm_up(self) -> None: if not self._model: self._model = whisper.load_model(self.model_name, device=self.device) - def run(self, audio_files: List[Path], whisper_params: Dict[str, Any]) -> Output: + def run(self, audio_files: List[Path], whisper_params: Optional[Dict[str, Any]] = None) -> Output: """ Transcribe the audio files into a list of Documents, one for each input file. @@ -67,6 +68,8 @@ def run(self, audio_files: List[Path], whisper_params: Dict[str, Any]) -> Output alignment data. Another key called `audio_file` contains the path to the audio file used for the transcription. """ + if not whisper_params: + whisper_params = {} documents = self.transcribe(audio_files, **whisper_params) return LocalWhisperTranscriber.Output(documents) @@ -88,6 +91,8 @@ def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs documents = [] for audio, transcript in zip(audio_files, transcriptions): content = transcript.pop("text") + if not isinstance(audio, (str, Path)): + audio = "<>" doc = Document(content=content, metadata={"audio_file": audio, **transcript}) documents.append(doc) return documents diff --git a/test/preview/components/test_whisper_local.py b/test/preview/components/audio/test_whisper_local.py similarity index 56% rename from test/preview/components/test_whisper_local.py rename to test/preview/components/audio/test_whisper_local.py index 6da0838468..4039653da8 100644 --- a/test/preview/components/test_whisper_local.py +++ b/test/preview/components/audio/test_whisper_local.py @@ -10,7 +10,7 @@ from test.preview.components.base import BaseTestComponent -SAMPLES_PATH = Path(__file__).parent.parent / "test_files" +SAMPLES_PATH = Path(__file__).parent.parent.parent / "test_files" class Test_LocalWhisperTranscriber(BaseTestComponent): @@ -27,6 +27,11 @@ def test_init(self): assert transcriber.device == torch.device("cpu") assert transcriber._model is None + @pytest.mark.unit + def test_init_wrong_model(self): + with pytest.raises(ValueError, match="Model name 'whisper-1' not recognized"): + LocalWhisperTranscriber(model_name_or_path="whisper-1") + @pytest.mark.unit def test_warmup(self): with patch("haystack.preview.components.audio.whisper_local.whisper") as mocked_whisper: @@ -43,6 +48,25 @@ def test_warmup_doesnt_reload(self): transcriber.warm_up() mocked_whisper.load_model.assert_called_once() + @pytest.mark.unit + def test_run(self): + comp = LocalWhisperTranscriber(model_name_or_path="large-v2") + comp._model = MagicMock() + comp._model.transcribe.return_value = { + "text": "test transcription", + "other_metadata": ["other", "meta", "data"], + } + results = comp.run(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) + expected = Document( + content="test transcription", + metadata={ + "audio_file": SAMPLES_PATH / "audio" / "this is the content of the document.wav", + "other_metadata": ["other", "meta", "data"], + }, + ) + assert isinstance(results, LocalWhisperTranscriber.Output) + assert results.documents == [expected] + @pytest.mark.unit def test_transcribe_to_documents(self): comp = LocalWhisperTranscriber(model_name_or_path="large-v2") @@ -51,12 +75,12 @@ def test_transcribe_to_documents(self): "text": "test transcription", "other_metadata": ["other", "meta", "data"], } - assert comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) == [ - Document( - content="test transcription", - metadata={ - "audio_file": SAMPLES_PATH / "audio" / "this is the content of the document.wav", - "other_metadata": ["other", "meta", "data"], - }, - ) - ] + results = comp.transcribe(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) + expected = Document( + content="test transcription", + metadata={ + "audio_file": SAMPLES_PATH / "audio" / "this is the content of the document.wav", + "other_metadata": ["other", "meta", "data"], + }, + ) + assert results == [expected] From 3625105d0ec950cda9cf1f23c2d3e2e16cc0d931 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Wed, 17 May 2023 15:44:05 +0200 Subject: [PATCH 12/14] test stream handling --- .../components/audio/test_whisper_local.py | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/test/preview/components/audio/test_whisper_local.py b/test/preview/components/audio/test_whisper_local.py index 4039653da8..1da9681837 100644 --- a/test/preview/components/audio/test_whisper_local.py +++ b/test/preview/components/audio/test_whisper_local.py @@ -49,7 +49,7 @@ def test_warmup_doesnt_reload(self): mocked_whisper.load_model.assert_called_once() @pytest.mark.unit - def test_run(self): + def test_run_with_path(self): comp = LocalWhisperTranscriber(model_name_or_path="large-v2") comp._model = MagicMock() comp._model.transcribe.return_value = { @@ -68,7 +68,28 @@ def test_run(self): assert results.documents == [expected] @pytest.mark.unit - def test_transcribe_to_documents(self): + def test_run_with_str(self): + comp = LocalWhisperTranscriber(model_name_or_path="large-v2") + comp._model = MagicMock() + comp._model.transcribe.return_value = { + "text": "test transcription", + "other_metadata": ["other", "meta", "data"], + } + results = comp.run( + audio_files=[str((SAMPLES_PATH / "audio" / "this is the content of the document.wav").absolute())] + ) + expected = Document( + content="test transcription", + metadata={ + "audio_file": str((SAMPLES_PATH / "audio" / "this is the content of the document.wav").absolute()), + "other_metadata": ["other", "meta", "data"], + }, + ) + assert isinstance(results, LocalWhisperTranscriber.Output) + assert results.documents == [expected] + + @pytest.mark.unit + def test_transcribe(self): comp = LocalWhisperTranscriber(model_name_or_path="large-v2") comp._model = MagicMock() comp._model.transcribe.return_value = { @@ -84,3 +105,20 @@ def test_transcribe_to_documents(self): }, ) assert results == [expected] + + @pytest.mark.unit + def test_transcribe_stream(self): + comp = LocalWhisperTranscriber(model_name_or_path="large-v2") + comp._model = MagicMock() + comp._model.transcribe.return_value = { + "text": "test transcription", + "other_metadata": ["other", "meta", "data"], + } + results = comp.transcribe( + audio_files=[open(SAMPLES_PATH / "audio" / "this is the content of the document.wav", "rb")] + ) + expected = Document( + content="test transcription", + metadata={"audio_file": "<>", "other_metadata": ["other", "meta", "data"]}, + ) + assert results == [expected] From 2efc9dfdad2ed99bd098d80bf4a57a2d8c5ef474 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Thu, 18 May 2023 18:18:22 +0200 Subject: [PATCH 13/14] upgrade canals and improve tests --- haystack/preview/__init__.py | 2 +- .../preview/components/audio/whisper_local.py | 17 +++++++++++------ haystack/preview/pipeline.py | 2 +- pyproject.toml | 2 +- .../components/audio/test_whisper_local.py | 18 +++++++++++++----- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/haystack/preview/__init__.py b/haystack/preview/__init__.py index ef36ce9462..1cdcb4bd5e 100644 --- a/haystack/preview/__init__.py +++ b/haystack/preview/__init__.py @@ -1,3 +1,3 @@ -from canals import component +from canals.component import component, ComponentInput, ComponentOutput from haystack.preview.dataclasses import Document from haystack.preview.pipeline import Pipeline, PipelineError, NoSuchStoreError, load_pipelines, save_pipelines diff --git a/haystack/preview/components/audio/whisper_local.py b/haystack/preview/components/audio/whisper_local.py index b462aa0fe6..5f7ab6a82a 100644 --- a/haystack/preview/components/audio/whisper_local.py +++ b/haystack/preview/components/audio/whisper_local.py @@ -7,7 +7,7 @@ import torch import whisper -from haystack.preview import component, Document +from haystack.preview import component, ComponentInput, ComponentOutput, Document logger = logging.getLogger(__name__) @@ -25,7 +25,12 @@ class LocalWhisperTranscriber: """ @dataclass - class Output: + class Input(ComponentInput): + audio_files: List[Path] + whisper_params: Optional[Dict[str, Any]] = None + + @dataclass + class Output(ComponentOutput): documents: List[Document] def __init__(self, model_name_or_path: WhisperLocalModel = "large", device: Optional[str] = None): @@ -54,7 +59,7 @@ def warm_up(self) -> None: if not self._model: self._model = whisper.load_model(self.model_name, device=self.device) - def run(self, audio_files: List[Path], whisper_params: Optional[Dict[str, Any]] = None) -> Output: + def run(self, data: Input) -> Output: """ Transcribe the audio files into a list of Documents, one for each input file. @@ -68,9 +73,9 @@ def run(self, audio_files: List[Path], whisper_params: Optional[Dict[str, Any]] alignment data. Another key called `audio_file` contains the path to the audio file used for the transcription. """ - if not whisper_params: - whisper_params = {} - documents = self.transcribe(audio_files, **whisper_params) + if not data.whisper_params: + data.whisper_params = {} + documents = self.transcribe(data.audio_files, **data.whisper_params) return LocalWhisperTranscriber.Output(documents) def transcribe(self, audio_files: Sequence[Union[str, Path, BinaryIO]], **kwargs) -> List[Document]: diff --git a/haystack/preview/pipeline.py b/haystack/preview/pipeline.py index 37f96bb347..71b08cc0ea 100644 --- a/haystack/preview/pipeline.py +++ b/haystack/preview/pipeline.py @@ -3,7 +3,7 @@ from pathlib import Path -from canals import ( +from canals.pipeline import ( Pipeline as CanalsPipeline, PipelineError, load_pipelines as load_canals_pipelines, diff --git a/pyproject.toml b/pyproject.toml index 61e8969162..fa515aba28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,7 +82,7 @@ dependencies = [ "jsonschema", # Preview - "canals==0.1.2", + "canals==0.2.1", # Agent events "events", diff --git a/test/preview/components/audio/test_whisper_local.py b/test/preview/components/audio/test_whisper_local.py index 1da9681837..27df8502e7 100644 --- a/test/preview/components/audio/test_whisper_local.py +++ b/test/preview/components/audio/test_whisper_local.py @@ -14,9 +14,11 @@ class Test_LocalWhisperTranscriber(BaseTestComponent): - @pytest.fixture - def components(self): - return [LocalWhisperTranscriber(model_name_or_path="large-v2")] + @pytest.mark.unit + def test_save_load(self, tmp_path): + self.assert_can_be_saved_and_loaded_in_pipeline( + LocalWhisperTranscriber(model_name_or_path="large-v2"), tmp_path + ) @pytest.mark.unit def test_init(self): @@ -56,7 +58,11 @@ def test_run_with_path(self): "text": "test transcription", "other_metadata": ["other", "meta", "data"], } - results = comp.run(audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"]) + results = comp.run( + LocalWhisperTranscriber.Input( + audio_files=[SAMPLES_PATH / "audio" / "this is the content of the document.wav"] + ) + ) expected = Document( content="test transcription", metadata={ @@ -76,7 +82,9 @@ def test_run_with_str(self): "other_metadata": ["other", "meta", "data"], } results = comp.run( - audio_files=[str((SAMPLES_PATH / "audio" / "this is the content of the document.wav").absolute())] + LocalWhisperTranscriber.Input( + audio_files=[str((SAMPLES_PATH / "audio" / "this is the content of the document.wav").absolute())] + ) ) expected = Document( content="test transcription", From e5153aa68e799defca9f66a2993085a8e9196316 Mon Sep 17 00:00:00 2001 From: ZanSara Date: Mon, 22 May 2023 16:47:54 +0200 Subject: [PATCH 14/14] pylint --- e2e/preview/components/test_whisper_local.py | 2 -- e2e/preview/components/test_whisper_remote.py | 1 - 2 files changed, 3 deletions(-) diff --git a/e2e/preview/components/test_whisper_local.py b/e2e/preview/components/test_whisper_local.py index 92313782a8..0db3908afe 100644 --- a/e2e/preview/components/test_whisper_local.py +++ b/e2e/preview/components/test_whisper_local.py @@ -1,5 +1,3 @@ -from pathlib import Path - from haystack.preview.components.audio.whisper_local import LocalWhisperTranscriber diff --git a/e2e/preview/components/test_whisper_remote.py b/e2e/preview/components/test_whisper_remote.py index fef64ccde8..c95de478bf 100644 --- a/e2e/preview/components/test_whisper_remote.py +++ b/e2e/preview/components/test_whisper_remote.py @@ -1,5 +1,4 @@ import os -from pathlib import Path import pytest