Navatusein / Silero-TTS-Service

Silero TTS backend service. Can be used with Home Assistant and Rhasspy.
MIT License
28 stars 6 forks source link

Failed to parse SSML #7

Closed Omirax closed 1 year ago

Omirax commented 1 year ago

Приветствую!

Периодически(!) возникает проблема парсинга SSML. Причем возникает без какой-либо закономерности.

Exception in ASGI application
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/uvicorn/protocols/http/h11_impl.py", line 407, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__
    return await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 86, in __call__
    raise exc from None
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 82, in __call__
    await self.app(scope, inner_receive, inner_send)
  File "/usr/local/lib/python3.10/site-packages/fastapi/applications.py", line 270, in __call__
    await super().__call__(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/applications.py", line 124, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/errors.py", line 184, in __call__
    raise exc
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
    raise exc
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "/usr/local/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 21, in __call__
    raise e
  File "/usr/local/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 706, in __call__
    await route.handle(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 66, in app
    response = await func(request)
  File "/usr/local/lib/python3.10/site-packages/fastapi/routing.py", line 235, in app
    raw_response = await run_endpoint_function(
  File "/usr/local/lib/python3.10/site-packages/fastapi/routing.py", line 161, in run_endpoint_function
    return await dependant.call(**values)
  File "/usr/app/app/handlers.py", line 44, in process
    audio_file = get_tts_file(text, speaker, settings.sample_rate, sox_params=settings.sox_param)
  File "/usr/app/app/tts.py", line 41, in get_tts_file
    model.save_wav(ssml_text=text, speaker=speaker, audio_path=temp_file_path, sample_rate=sample_rate)
  File "<torch_package_0>.multi_acc_v3_package.py", line 366, in save_wav
    audio = self.apply_tts(text=text,
  File "<torch_package_0>.multi_acc_v3_package.py", line 316, in apply_tts
    sentences, clean_sentences, break_lens, prosody_rates, prosody_pitches, sp_ids = self.prepare_tts_model_input(input_text,
  File "<torch_package_0>.multi_acc_v3_package.py", line 61, in prepare_tts_model_input
    clean_text_list = self.process_ssml(text)
  File "<torch_package_0>.multi_acc_v3_package.py", line 113, in process_ssml
    raise ValueError(f"Failed to parse SSML: {e}")
ValueError: Failed to parse SSML: invalid literal for int() with base 10: 'двадцать0'

Start text processing: <speak>Текущее время двадцать часов <break time='100ms'/> двадцать одна минута <break time='двадцать0ms'/></speak>

Изначально - <break time='200ms'/>

Думал, что HA чудит, перепробовал многие варианты кавычек и экранирования. Но закономерности так и не уловил.

Navatusein commented 1 year ago

Приветствую!

Периодически(!) возникает проблема парсинга SSML. Причем возникает без какой-либо закономерности.

Exception in ASGI application
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/uvicorn/protocols/http/h11_impl.py", line 407, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py", line 78, in __call__
    return await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 86, in __call__
    raise exc from None
  File "/usr/local/lib/python3.10/site-packages/uvicorn/middleware/message_logger.py", line 82, in __call__
    await self.app(scope, inner_receive, inner_send)
  File "/usr/local/lib/python3.10/site-packages/fastapi/applications.py", line 270, in __call__
    await super().__call__(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/applications.py", line 124, in __call__
    await self.middleware_stack(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/errors.py", line 184, in __call__
    raise exc
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/errors.py", line 162, in __call__
    await self.app(scope, receive, _send)
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 79, in __call__
    raise exc
  File "/usr/local/lib/python3.10/site-packages/starlette/middleware/exceptions.py", line 68, in __call__
    await self.app(scope, receive, sender)
  File "/usr/local/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 21, in __call__
    raise e
  File "/usr/local/lib/python3.10/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 706, in __call__
    await route.handle(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 276, in handle
    await self.app(scope, receive, send)
  File "/usr/local/lib/python3.10/site-packages/starlette/routing.py", line 66, in app
    response = await func(request)
  File "/usr/local/lib/python3.10/site-packages/fastapi/routing.py", line 235, in app
    raw_response = await run_endpoint_function(
  File "/usr/local/lib/python3.10/site-packages/fastapi/routing.py", line 161, in run_endpoint_function
    return await dependant.call(**values)
  File "/usr/app/app/handlers.py", line 44, in process
    audio_file = get_tts_file(text, speaker, settings.sample_rate, sox_params=settings.sox_param)
  File "/usr/app/app/tts.py", line 41, in get_tts_file
    model.save_wav(ssml_text=text, speaker=speaker, audio_path=temp_file_path, sample_rate=sample_rate)
  File "<torch_package_0>.multi_acc_v3_package.py", line 366, in save_wav
    audio = self.apply_tts(text=text,
  File "<torch_package_0>.multi_acc_v3_package.py", line 316, in apply_tts
    sentences, clean_sentences, break_lens, prosody_rates, prosody_pitches, sp_ids = self.prepare_tts_model_input(input_text,
  File "<torch_package_0>.multi_acc_v3_package.py", line 61, in prepare_tts_model_input
    clean_text_list = self.process_ssml(text)
  File "<torch_package_0>.multi_acc_v3_package.py", line 113, in process_ssml
    raise ValueError(f"Failed to parse SSML: {e}")
ValueError: Failed to parse SSML: invalid literal for int() with base 10: 'двадцать0'

Start text processing: <speak>Текущее время двадцать часов <break time='100ms'/> двадцать одна минута <break time='двадцать0ms'/></speak>

Изначально - <break time='200ms'/>

Думал, что HA чудит, перепробовал многие варианты кавычек и экранирования. Но закономерности так и не уловил.

А что там на вход попадает ?

Omirax commented 1 year ago

<speak>Текущее время двадцать часов <break time='100ms'/> двадцать одна минута <break time='200ms'/></speak>

<break time='200ms'/> превращаются в <break time='двадцать0ms'/>

Navatusein commented 1 year ago

<speak>Текущее время двадцать часов <break time='100ms'/> двадцать одна минута <break time='200ms'/></speak>

<break time='200ms'/> превращаются в <break time='двадцать0ms'/>

Вы с HA передаёте текст в теге <speak></speak>?

Omirax commented 1 year ago

Нет, конечно. Простите. Ошибся Текущее время двадцать часов <break time='100ms'/> двадцать одна минута <break time='200ms'/>

Вот лог Rhysspy

rhasspytts_cli_hermes: ['bash', '-c', ' curl -sS -X GET -G --output - --data-urlencode INPUT_TYPE=TEXT --data-urlencode OUTPUT_TYPE=AUDIO --data-urlencode AUDIO=WAVE --data-urlencode LOCALE= --data-urlencode INPUT_TEXT="$0" http://192.168.1.210:9898/process --data-urlencode VOICE=baya', "Текущее время 20 <d>час</d> <break time='100ms'/> 21 <d>минута</d> <break time='200ms'/>"]

Navatusein commented 1 year ago

Нет, конечно. Простите. Ошибся Текущее время двадцать часов <break time='100ms'/> двадцать одна минута <break time='200ms'/>

Вот лог Rhysspy

rhasspytts_cli_hermes: ['bash', '-c', ' curl -sS -X GET -G --output - --data-urlencode INPUT_TYPE=TEXT --data-urlencode OUTPUT_TYPE=AUDIO --data-urlencode AUDIO=WAVE --data-urlencode LOCALE= --data-urlencode INPUT_TEXT="$0" http://192.168.1.210:9898/process --data-urlencode VOICE=baya', "Текущее время 20 <d>час</d> <break time='100ms'/> 21 <d>минута</d> <break time='200ms'/>"]

Я сейчас закончу работу над системой авто обновления и перейду к решению этой проблемы. Я догадываюсь от куда ноги растут у проблемы.

Omirax commented 1 year ago

Ok. Если найду закономерность, то сообщу.

Navatusein commented 1 year ago

Ok. Если найду закономерность, то сообщу.

Причину ошибки я уже нашел. Буду теперь её решать.

Navatusein commented 1 year ago

Текущее время 20 час 21 минута

Всё ошибка исправлена.