Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 89 additions & 2 deletions .github/workflows/unittests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,27 @@ on:
- master

jobs:
build:
base:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Python 3.11
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.11"
- name: Create virtual environment
run: python -m venv .venv
- name: Install base test dependencies
run: |
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install .[dev]
- name: Test base installation
run: |
. .venv/bin/activate
pytest -s -v tests/

all-extras:
strategy:
fail-fast: true
matrix:
Expand Down Expand Up @@ -59,6 +79,73 @@ jobs:
python -m pip install .[dev,whisper-local,faster-whisper,google-cloud,openai,groq,vosk,cohere-api]
- name: Set up vosk model
run: python -m speech_recognition.cli download vosk
- name: Test with unittest
- name: Test with pytest
run: |
pytest --doctest-modules -s -v speech_recognition/recognizers/ tests/

extra-contracts:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- extra: audio
install-spec: .[dev,audio]
verify-command: python -c "from speech_recognition import Microphone; Microphone.get_pyaudio()"
- extra: pocketsphinx
install-spec: .[dev,pocketsphinx]
verify-command: pytest -s -v tests/test_recognition.py tests/test_special_features.py
- extra: google-cloud
install-spec: .[dev,google-cloud]
verify-command: pytest -s -v tests/recognizers/test_google_cloud.py
- extra: whisper-local
install-spec: .[dev,whisper-local]
verify-command: pytest -s -v tests/recognizers/whisper_local/test_whisper.py
- extra: faster-whisper
install-spec: .[dev,faster-whisper]
verify-command: pytest -s -v tests/recognizers/whisper_local/test_faster_whisper.py
- extra: openai
install-spec: .[dev,openai]
verify-command: pytest -s -v tests/recognizers/whisper_api/test_openai.py tests/recognizers/whisper_api/test_openai_compatible.py
- extra: groq
install-spec: .[dev,groq]
verify-command: pytest -s -v tests/recognizers/whisper_api/test_groq.py
- extra: cohere-api
install-spec: .[dev,cohere-api]
verify-command: pytest -s -v tests/recognizers/test_cohere_api.py
- extra: assemblyai
install-spec: .[dev,assemblyai]
verify-command: python -c "from speech_recognition import Recognizer; assert hasattr(Recognizer(), 'recognize_assemblyai')"
- extra: vosk
install-spec: .[dev,vosk]
setup-vosk-model: true
verify-command: pytest -s -v tests/recognizers/test_vosk.py
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Python 3.11
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.11"
- name: Install build dependencies
run: |
sudo apt-get update
# For pocketsphinx (already installed: swig)
sudo apt-get install --no-install-recommends -y libpulse-dev libasound2-dev
# For PyAudio
sudo apt-get install --no-install-recommends -y portaudio19-dev
- name: Create virtual environment
run: python -m venv .venv
- name: Install extra dependencies
run: |
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install ${{ matrix.install-spec }}
- name: Set up vosk model
if: matrix.setup-vosk-model == true
run: |
. .venv/bin/activate
python -m speech_recognition.cli download vosk
- name: Verify ${{ matrix.extra }} extra
run: |
. .venv/bin/activate
${{ matrix.verify-command }}
4 changes: 4 additions & 0 deletions tests/recognizers/test_cohere_api.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
from unittest.mock import MagicMock, patch

import pytest

from speech_recognition import AudioData, Recognizer
from speech_recognition.recognizers import cohere_api

pytest.importorskip("cohere")


@patch("cohere.ClientV2")
def test_transcribe_default_model(mock_client_cls):
Expand Down
20 changes: 11 additions & 9 deletions tests/recognizers/test_google_cloud.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
from unittest.mock import MagicMock, patch

from google.cloud.speech import (
RecognitionAudio,
RecognitionConfig,
RecognizeResponse,
SpeechContext,
SpeechRecognitionAlternative,
SpeechRecognitionResult,
WordInfo,
)
import pytest

from speech_recognition import Recognizer
from speech_recognition.audio import AudioData
from speech_recognition.recognizers.google_cloud import recognize

speech = pytest.importorskip("google.cloud.speech")

RecognitionAudio = speech.RecognitionAudio
RecognitionConfig = speech.RecognitionConfig
RecognizeResponse = speech.RecognizeResponse
SpeechContext = speech.SpeechContext
SpeechRecognitionAlternative = speech.SpeechRecognitionAlternative
SpeechRecognitionResult = speech.SpeechRecognitionResult
WordInfo = speech.WordInfo


@patch("google.cloud.speech.SpeechClient")
def test_transcribe_with_google_cloud_speech(SpeechClient):
Expand Down
2 changes: 2 additions & 0 deletions tests/recognizers/test_vosk.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

from speech_recognition import AudioData, Recognizer

pytest.importorskip("vosk")


@pytest.fixture
def audio_data() -> AudioData:
Expand Down
3 changes: 3 additions & 0 deletions tests/recognizers/whisper_api/test_groq.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
from unittest.mock import MagicMock

import httpx
import pytest
import respx

from speech_recognition import AudioData, Recognizer
from speech_recognition.recognizers.whisper_api import groq

pytest.importorskip("groq")


@respx.mock(assert_all_called=True, assert_all_mocked=True)
def test_transcribe_with_groq_whisper(respx_mock, monkeypatch):
Expand Down
2 changes: 2 additions & 0 deletions tests/recognizers/whisper_api/test_openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from speech_recognition import AudioData, Recognizer
from speech_recognition.recognizers.whisper_api import openai

pytest.importorskip("openai")


@pytest.fixture
def setenv_openai_api_key(monkeypatch):
Expand Down
4 changes: 4 additions & 0 deletions tests/recognizers/whisper_api/test_openai_compatible.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from unittest.mock import MagicMock

import pytest

from speech_recognition import AudioData, Recognizer

pytest.importorskip("openai")


def test_transcribe_with_openai_compatible_api(httpserver, monkeypatch):
# https://github.com/Uberi/speech_recognition/issues/850
Expand Down
3 changes: 3 additions & 0 deletions tests/recognizers/whisper_local/test_faster_whisper.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
recognize,
)

pytest.importorskip("faster_whisper")
pytest.importorskip("soundfile")

if TYPE_CHECKING:
from faster_whisper.transcribe import Segment, TranscriptionInfo

Expand Down
4 changes: 4 additions & 0 deletions tests/recognizers/whisper_local/test_whisper.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
from unittest.mock import ANY, MagicMock, patch

import numpy as np
import pytest

from speech_recognition import AudioData, Recognizer
from speech_recognition.recognizers.whisper_local.whisper import recognize

pytest.importorskip("soundfile")
pytest.importorskip("whisper")


@skipIf(sys.version_info >= (3, 14), "skip on Python 3.14")
@patch("soundfile.read")
Expand Down
4 changes: 4 additions & 0 deletions tests/test_recognition.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import importlib.util
import os
import sys
import unittest

import speech_recognition as sr

HAS_POCKETSPHINX = importlib.util.find_spec("pocketsphinx") is not None


class TestRecognition(unittest.TestCase):
def setUp(self):
Expand All @@ -29,6 +32,7 @@ def test_recognizer_attributes(self):
# https://github.com/Uberi/speech_recognition/issues/743
self.assertTrue("recognize_google" in attributes)

@unittest.skipUnless(HAS_POCKETSPHINX, "requires pocketsphinx extra")
@unittest.skipIf(sys.platform.startswith("win"), "skip on Windows")
def test_sphinx_english(self):
audio = sr.AudioData.from_file(self.AUDIO_FILE_EN)
Expand Down
3 changes: 3 additions & 0 deletions tests/test_special_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
import sys
import unittest

import pytest
import speech_recognition as sr

pytest.importorskip("pocketsphinx")


class TestSpecialFeatures(unittest.TestCase):
def setUp(self):
Expand Down
Loading