From 1ef3a35425427a079153ecd2e415ca58a0095240 Mon Sep 17 00:00:00 2001 From: Amjad Natouf Date: Sun, 3 Nov 2024 06:47:31 +0100 Subject: [PATCH 1/4] fix_add_special_feature_tests --- tests/english.mp3 | Bin 0 -> 51453 bytes tests/test_special_features.py | 29 ++++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/english.mp3 diff --git a/tests/english.mp3 b/tests/english.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..56c0df7ec29793697dc1efff98676875c7c7267e GIT binary patch literal 51453 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 literal 0 HcmV?d00001 diff --git a/tests/test_special_features.py b/tests/test_special_features.py index 9dd2574e..6e8c0b7f 100644 --- a/tests/test_special_features.py +++ b/tests/test_special_features.py @@ -10,16 +10,39 @@ class TestSpecialFeatures(unittest.TestCase): def setUp(self): + # Define paths to audio files self.AUDIO_FILE_EN = os.path.join(os.path.dirname(os.path.realpath(__file__)), "english.wav") + self.AUDIO_FILE_EN_MP3 = os.path.join(os.path.dirname(os.path.realpath(__file__)), "english.mp3") self.addTypeEqualityFunc(str, self.assertSameWords) @unittest.skipIf(sys.platform.startswith("win"), "skip on Windows") def test_sphinx_keywords(self): r = sr.Recognizer() with sr.AudioFile(self.AUDIO_FILE_EN) as source: audio = r.record(source) - self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("one", 1.0), ("two", 1.0), ("three", 1.0)]), "three two one") - self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0.95), ("too", 1.0), ("tree", 1.0)]), "tree too wan") - self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("un", 0.95), ("to", 1.0), ("tee", 1.0)]), "tee to un") + self.assertNotEqual(r.recognize_sphinx(audio, keyword_entries=[("one", 1.0), ("two", 1.0), ("three", 1.0)]), "three two one") + # self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("one", 0.01), ("two", 0.02), ("three", 0.03)]), "three two one") + self.assertNotEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0.95), ("too", 1.0), ("tree", 1.0)]), "tree too wan") + # self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0.01), ("too", 0.02), ("tree", 0.03)]), "tree too wan") + self.assertNotEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0), ("un", 0.95), ("to", 1.0), ("tee", 1.0)]), "tee to un") + # self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("un", 0.01), ("to", 0.02), ("tee", 0.03)]), "tee to un") + + # Added test for MP3 + # Test that attempting to recognize speech from an incompatible audio file raises a ValueError. + def test_incompatible_audio_file_error(self): + + # Create a Recognizer instance + r = sr.Recognizer() + # Verify that a ValueError is raised when an incompatible audio file is used + with self.assertRaises(ValueError) as context: + # Load the audio file for recognition + # Attempt to record audio from the MP3 file + with sr.AudioFile(self.AUDIO_FILE_EN_MP3) as source:r.record(source) + + # Check that the raised ValueError contains the expected message + self.assertEqual( + str(context.exception), + "Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format" + ) def assertSameWords(self, tested, reference, msg=None): set_tested = set(tested.split()) From b039f77431e92b788661d0a783cadbc7521a0164 Mon Sep 17 00:00:00 2001 From: Amjad Natouf Date: Tue, 5 Nov 2024 11:57:22 +0100 Subject: [PATCH 2/4] revert changes latest pocketsphinx --- tests/test_special_features.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/test_special_features.py b/tests/test_special_features.py index 6e8c0b7f..f95506f0 100644 --- a/tests/test_special_features.py +++ b/tests/test_special_features.py @@ -19,12 +19,9 @@ def setUp(self): def test_sphinx_keywords(self): r = sr.Recognizer() with sr.AudioFile(self.AUDIO_FILE_EN) as source: audio = r.record(source) - self.assertNotEqual(r.recognize_sphinx(audio, keyword_entries=[("one", 1.0), ("two", 1.0), ("three", 1.0)]), "three two one") - # self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("one", 0.01), ("two", 0.02), ("three", 0.03)]), "three two one") - self.assertNotEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0.95), ("too", 1.0), ("tree", 1.0)]), "tree too wan") - # self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0.01), ("too", 0.02), ("tree", 0.03)]), "tree too wan") - self.assertNotEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0), ("un", 0.95), ("to", 1.0), ("tee", 1.0)]), "tee to un") - # self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("un", 0.01), ("to", 0.02), ("tee", 0.03)]), "tee to un") + self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("one", 1.0), ("two", 1.0), ("three", 1.0)]), "three two one") + self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0.95), ("too", 1.0), ("tree", 1.0)]), "tree too wan") + self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("un", 0.95), ("to", 1.0), ("tee", 1.0)]), "tee to un") # Added test for MP3 # Test that attempting to recognize speech from an incompatible audio file raises a ValueError. From 999cd4c17b4ea444e3daea1a9c737ce063f2ad6a Mon Sep 17 00:00:00 2001 From: Amjad Natouf Date: Tue, 5 Nov 2024 20:46:57 +0100 Subject: [PATCH 3/4] move test case to test_audio.py --- tests/test_audio.py | 19 ++++++++++++++++++- tests/test_special_features.py | 20 -------------------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/tests/test_audio.py b/tests/test_audio.py index 0e195157..f20aa31a 100644 --- a/tests/test_audio.py +++ b/tests/test_audio.py @@ -140,7 +140,24 @@ def test_flac_stereo_24_bit(self): self.assertSimilar(audio.get_raw_data()[:32], b"\x00\x00\x00\x00\xfe\xff\x00\x02\x00\x00\xfe\xff\x00\x00\x00\xff\x01\x00\x02\xfc\xff\xfe\x01\x00\x02\xfc\xff\xfe\x07\x00\x01\xf6") else: self.assertSimilar(audio.get_raw_data()[:32], b"\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x02\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\xff\x01\x00\x00\x02\xfc\xff\x00\xfe\x01\x00") - + # Added test for MP3 + # Test that attempting to recognize speech from an incompatible audio file raises a ValueError. + def test_incompatible_audio_file_error(self): + # Define paths to audio files + self.AUDIO_FILE_EN_MP3 = path.join(path.dirname(path.realpath(__file__)), "english.mp3") + # Create a Recognizer instance + r = sr.Recognizer() + # Verify that a ValueError is raised when an incompatible audio file is used + with self.assertRaises(ValueError) as context: + # Load the audio file for recognition + # Attempt to record audio from the MP3 file + with sr.AudioFile(self.AUDIO_FILE_EN_MP3) as source:r.record(source) + + # Check that the raised ValueError contains the expected message + self.assertEqual( + str(context.exception), + "Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format" + ) if __name__ == "__main__": unittest.main() diff --git a/tests/test_special_features.py b/tests/test_special_features.py index f95506f0..9dd2574e 100644 --- a/tests/test_special_features.py +++ b/tests/test_special_features.py @@ -10,9 +10,7 @@ class TestSpecialFeatures(unittest.TestCase): def setUp(self): - # Define paths to audio files self.AUDIO_FILE_EN = os.path.join(os.path.dirname(os.path.realpath(__file__)), "english.wav") - self.AUDIO_FILE_EN_MP3 = os.path.join(os.path.dirname(os.path.realpath(__file__)), "english.mp3") self.addTypeEqualityFunc(str, self.assertSameWords) @unittest.skipIf(sys.platform.startswith("win"), "skip on Windows") @@ -23,24 +21,6 @@ def test_sphinx_keywords(self): self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("wan", 0.95), ("too", 1.0), ("tree", 1.0)]), "tree too wan") self.assertEqual(r.recognize_sphinx(audio, keyword_entries=[("un", 0.95), ("to", 1.0), ("tee", 1.0)]), "tee to un") - # Added test for MP3 - # Test that attempting to recognize speech from an incompatible audio file raises a ValueError. - def test_incompatible_audio_file_error(self): - - # Create a Recognizer instance - r = sr.Recognizer() - # Verify that a ValueError is raised when an incompatible audio file is used - with self.assertRaises(ValueError) as context: - # Load the audio file for recognition - # Attempt to record audio from the MP3 file - with sr.AudioFile(self.AUDIO_FILE_EN_MP3) as source:r.record(source) - - # Check that the raised ValueError contains the expected message - self.assertEqual( - str(context.exception), - "Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format" - ) - def assertSameWords(self, tested, reference, msg=None): set_tested = set(tested.split()) set_reference = set(reference.split()) From 3d4b6236bac26d90defbe390574b6cca5c08d948 Mon Sep 17 00:00:00 2001 From: Amjad Natouf Date: Sat, 16 Nov 2024 23:41:23 +0100 Subject: [PATCH 4/4] remove unnecessary comments --- tests/test_audio.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/tests/test_audio.py b/tests/test_audio.py index f20aa31a..32a939f1 100644 --- a/tests/test_audio.py +++ b/tests/test_audio.py @@ -140,20 +140,13 @@ def test_flac_stereo_24_bit(self): self.assertSimilar(audio.get_raw_data()[:32], b"\x00\x00\x00\x00\xfe\xff\x00\x02\x00\x00\xfe\xff\x00\x00\x00\xff\x01\x00\x02\xfc\xff\xfe\x01\x00\x02\xfc\xff\xfe\x07\x00\x01\xf6") else: self.assertSimilar(audio.get_raw_data()[:32], b"\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x02\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\xff\x01\x00\x00\x02\xfc\xff\x00\xfe\x01\x00") - # Added test for MP3 - # Test that attempting to recognize speech from an incompatible audio file raises a ValueError. + def test_incompatible_audio_file_error(self): - # Define paths to audio files self.AUDIO_FILE_EN_MP3 = path.join(path.dirname(path.realpath(__file__)), "english.mp3") - # Create a Recognizer instance r = sr.Recognizer() - # Verify that a ValueError is raised when an incompatible audio file is used with self.assertRaises(ValueError) as context: - # Load the audio file for recognition - # Attempt to record audio from the MP3 file with sr.AudioFile(self.AUDIO_FILE_EN_MP3) as source:r.record(source) - # Check that the raised ValueError contains the expected message self.assertEqual( str(context.exception), "Audio file could not be read as PCM WAV, AIFF/AIFF-C, or Native FLAC; check if file is corrupted or in another format"