fix: No more falsely detect a sentence end on "U.S.A", "3:00 a.m." and more
This commit is contained in:
@@ -28,6 +28,15 @@ from pipecat.processors.async_frame_processor import AsyncFrameProcessor
|
|||||||
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
|
from pipecat.processors.frame_processor import FrameDirection, FrameProcessor
|
||||||
from pipecat.utils.audio import calculate_audio_volume
|
from pipecat.utils.audio import calculate_audio_volume
|
||||||
from pipecat.utils.utils import exp_smoothing
|
from pipecat.utils.utils import exp_smoothing
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
endofsentence_pattern = r"(?<![A-Z])(?<!\d)(?<!\d\s[ap])(?<!Mr|Ms|Dr)(?<!Mrs)(?<!Prof)[\.\?\!:]$"
|
||||||
|
endofsentence_re = re.compile(endofsentence_pattern)
|
||||||
|
|
||||||
|
|
||||||
|
def match_endofsentence(text: str) -> bool:
|
||||||
|
return endofsentence_re.search(text.rstrip()) is not None
|
||||||
|
|
||||||
|
|
||||||
class AIService(FrameProcessor):
|
class AIService(FrameProcessor):
|
||||||
@@ -137,9 +146,7 @@ class TTSService(AIService):
|
|||||||
text = frame.text
|
text = frame.text
|
||||||
else:
|
else:
|
||||||
self._current_sentence += frame.text
|
self._current_sentence += frame.text
|
||||||
if self._current_sentence.strip().endswith(
|
if match_endofsentence(self._current_sentence):
|
||||||
(".", "?", "!")) and not self._current_sentence.strip().endswith(
|
|
||||||
("Mr,", "Mrs.", "Ms.", "Dr.")):
|
|
||||||
text = self._current_sentence
|
text = self._current_sentence
|
||||||
self._current_sentence = ""
|
self._current_sentence = ""
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import unittest
|
|||||||
|
|
||||||
from typing import AsyncGenerator
|
from typing import AsyncGenerator
|
||||||
|
|
||||||
from pipecat.services.ai_services import AIService
|
from pipecat.services.ai_services import AIService, match_endofsentence
|
||||||
from pipecat.pipeline.frames import EndFrame, Frame, TextFrame
|
from pipecat.frames.frames import EndFrame, Frame, TextFrame
|
||||||
|
|
||||||
|
|
||||||
class SimpleAIService(AIService):
|
class SimpleAIService(AIService):
|
||||||
@@ -27,6 +27,22 @@ class TestBaseAIService(unittest.IsolatedAsyncioTestCase):
|
|||||||
|
|
||||||
self.assertEqual(input_frames, output_frames)
|
self.assertEqual(input_frames, output_frames)
|
||||||
|
|
||||||
|
async def test_endofsentence(self):
|
||||||
|
assert match_endofsentence("This is a sentence.")
|
||||||
|
assert match_endofsentence("This is a sentence! ")
|
||||||
|
assert match_endofsentence("This is a sentence?")
|
||||||
|
assert match_endofsentence("This is a sentence:")
|
||||||
|
assert not match_endofsentence("This is not a sentence")
|
||||||
|
assert not match_endofsentence("This is not a sentence,")
|
||||||
|
assert not match_endofsentence("This is not a sentence, ")
|
||||||
|
assert not match_endofsentence("Ok, Mr. Smith let's ")
|
||||||
|
assert not match_endofsentence("Dr. Walker, I presume ")
|
||||||
|
assert not match_endofsentence("Prof. Walker, I presume ")
|
||||||
|
assert not match_endofsentence("zweitens, und 3.")
|
||||||
|
assert not match_endofsentence("Heute ist Dienstag, der 3.") # 3. Juli 2024
|
||||||
|
assert not match_endofsentence("America, or the U.") # U.S.A.
|
||||||
|
assert not match_endofsentence("It still early, it's 3:00 a.") # 3:00 a.m.
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user