๋๋ ์ด๊ฒ์ด ์ผ๋ง๋ ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ ์ผ์ง ๋๋ ์ด๊ฒ์ ์ผ๋ง๋ ๋ง์ ๊ด์ฌ์ด ์์์ง ๋ชจ๋ฅธ๋ค.
์ผ๋ฐ์ ์ธ ๋ก์ปฌ (์คํ๋ผ์ธ) STT ์์คํ ์ด ํ์ฌ ์ฌ์ฉ๋๋ ์์คํ ๋งํผ ์ธ์์ด ์ข์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์จ๋ผ์ธ ์๋น์ค๊ฐ ์๋ตํ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ๋์ฒด ์ต์ ๊ณผ ํจ๊ป ์ฌ์ฉํ ์์๋ ์ต์ ์ด ์ฌ์ ํ ๋ง์์ ๋ญ๋๋ค. . (๋ํ ์ด๋ค ์ด์ ๋ก ๋ ์๋น์ค๊ฐ ์ค๋จ๋๋ ๊ฒฝ์ฐ)
๊ฐ์ธ์ ๋ฐฐ๊ฒฝ:
ํ ์ธํฐ๋ท์ ํํธ์๊ณ , ๋๋ก๋ ๊ธฐ๋ณธ ์์ฒญ์ด ํฌ๊ฒ ์ง์ฐ๋๊ณ , ๋๋ก๋ ์ฐ๊ฒฐ์ด ๋์ด์ง๋๋ค (๋ด๊ฐ ์ฌ์ฉํ๋ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ์จ๋ผ์ธ ๊ธฐ๋ฐ์ด์ง๋ง ๊ฒฐ๊ตญ์๋ ํ ์คํ ๋ฉ์ด์ ๊ณผ ๊ฐ์ ์คํ๋ผ์ธ ์ ์ฉ ๊ธฐ๋ฅ์ด์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค).
์์:
์ด๊ฒ์ผ๋ก ํด๊ฒฐ ๋ ๋ฌธ์ :
์ ์ ์ผ๋ก ๋์ํ์ต๋๋ค! ์ฌ์ค, ๋ด๊ฐ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ / ๋ด์ค ๋ ํฐ ์ค ํ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฝ์๋ค๋ฉด์ด ๋ฒ์๊ฐ ํ์คํด์ผํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค.
์๋ ํ์ธ์,
ํ ์์ฒญ # 656 ๋ฐ ๊ด๋ จ ๋ฌธ์ # 655๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๋ก์ปฌ pocketsphinx๋ฅผ STT ์ฅ์น๋ก ์ฌ์ฉํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ / ์์ฑ์ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌํํฉ๋๋ค.
์คํ์ธ์ด ๋ด์ฌํ๋ก ๊ฐ๋ฐ๋๊ณ ํ ์คํธ๋์์ง๋ง PocketSphinx์์ ์ง์ํ๋ ๋ค๋ฅธ ์ธ์ด์๋ ์ ํจํด์ผํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ ์ํค ํ์ด์ง๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ํนํ "์คํ์ธ์ด๋ฅผ ์ง์ํ๋ STT ์ ํ ๋ฐ ๊ตฌ์ฑ"์ด๋ผ๋ ์ฅ์ ์ฐธ์กฐํ์ญ์์ค.
kaldi๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด pull request # 438๋ ์์ต๋๋ค.
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ์๋ํ ์ง ํ์ ํ ์ ์์ง๋ง ๋ด ๋ฐ์คํฌํฑ์์๋ ์ ์๋ํฉ๋๋ค.
๋ช ๋ ํ, ์ธํฐ๋ท ์ฐ๊ฒฐ์ ๋ฐ๋ผ ์จ๋ผ์ธ ๋ฐ ์คํ๋ผ์ธ STT๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ์ต์ ํ๋์ง ์์ ๋ฐฉ๋ฒ์ ๊ณต์ ํฉ๋๋ค. ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์๋ค๋ฉด. ๊ฐ์ธ์ ์ผ๋ก PocketSphinx๋ฅผ ์คํ๋ผ์ธ STT๋ก ์ฌ์ฉ
mycroft.stt.__init__.py์์ _from mycroft.util import connected_๋ฅผ ์ถ๊ฐํ์ญ์์ค.
๊ทธ๋ฐ ๋ค์ create () ๋ฉ์๋์์ ๋ค์์ ์ถ๊ฐํฉ๋๋ค.
if connected() is True:
return PocketSphinxSTT()
else:
try :
...
๊ทธ๋ฐ ๋ค์ mainskill.__init__.py์์ ๋ค์ ํธ์ถ์ handle_boot_finished ๋ฉ์๋์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
self.schedule_repeating_event(self.check_connection_switchSTT, None, 30)
์ด๊ฒ์ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํ๋ check_connection_switchSTT๋ฅผ ํธ์ถํ๊ณ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ 30 ์ด๋ง๋ค ์ค๋์ค ์๋น์ค๋ฅผ ๋ค์ ์์ํฉ๋๋ค.
๋ด ๊ธฐ๋ฅ์ ๊ฐ์ธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
def check_connection_switchSTT(self):
if connected() is True:
self.newstate = "yes"
else:
self.newstate = 'no'
if self.prevstate != self.newstate:
self.prevstate = self.newstate
LOG.info("Internet connectivity changed")
subprocess.call(['/path/to/stop-mycroft.sh', 'voice'])
subprocess.call(['/path/to/start-mycroft.sh', 'voice'])
`
์คํฌ ์ด๊ธฐํ ์ค ์ฐ๊ฒฐ์ ๋ฐ๋ผ ์ด์ ์ self.prevstate๋ฅผ ์ ์ํ ๊ฒฝ์ฐ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ ์๋์ง๋ง ์ฃผ์ ์ ๋ํด ๋ค๋ฅธ ๊ฒ์ ์ฐพ์ ์ ์์๊ณ ์ธํฐ๋ท์ด ๋ค์ด๋์์ ๋ ํด ๋ฐฑ์ด ํ์ํ์ต๋๋ค. ์ง๋ 3 ๋ ๋์์ด ๋ฌธ์ ์ ๋ํด ๋๊ตฌ๋ ์ง ๊ณต์ ํด์ฃผ์ธ์.
pocketsphinx๋ ๋ง ๋ค๋ฅธ ๊ณจ๋ชฉ, ํด๋ฐฑ์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ ์ ๋๋ก ์ง์ฆ๋ฉ๋๋ค.
์คํ๋ผ์ธ pocketsphinx STT๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด https://github.com/MycroftAI/mycroft-core/pull/1184 ๋ฅผ ๋ง๋ค์์ง ๋ง ๋ผ์ด๋ธ ํ ์คํธ๋ ์ ๊ฐ ํฌ๊ธฐํ๊ณ CLI๋ฅผ ์ฌ์ฉํ๋ฉด์ 99,9 %์ ์๊ฐ์ ๊ธฐ๋กํ์ต๋๋ค.
kaldi ๋ผ์ด๋ธ ์คํธ๋ฆฌ๋ฐ์ ์ต์ ์ด๋ฉฐ ์ฝ๊ฐ ๋ ์ ์๋ํ๋ฉฐ 75 % ๋ง ํฌ๊ธฐํฉ๋๋ค!
์ต์ ์ ์ ํ์ deepspeech / kaldi๋ฅผ ์์ฒด ํธ์คํธํ๋ ๊ฒ์ด์ง๋ง, ๊ทธ๊ฒ์กฐ์ฐจ๋ ํฉ๊ธ ์๊ฐ๋์ ์ค๋น๋์ง ์์์ต๋๋ค
๋ด pocketsphinx ๋ก์ปฌ ๋ฆฌ์ค๋ (์ ํ๋ ์ดํ๋ ๊ด์ฐฎ์)์
๊ทธ๊ฒ๋ค์ ๊ฐ๋ ์ฆ๋ช ์ด์ง๋ง ์ค์ ๋ก ์ ์ง๋๋ ํ๋ก์ ํธ๋ ์๋๋๋ค. Pull Requests๋ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ ํ์ํฉ๋๋ค.
๋์ฒด STT๊ฐ ๋ง์ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ผ๋จ ์ฌ์ฉํ ์์๋ ๊ฒ์ด ์์ผ๋ฉด ํ์ฌ๋ ๋ฆฌ์์ค ๋ญ๋น์ ๋๋ค.
๋ ๋ฒ์งธ๋ก pocketsphinx์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค. ๋๋ถ๋ถ ์ ํ๋๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ์ ์ผ๋ก https://github.com/jcsilva/docker-kaldi-gstreamer-server ์ ํจ๊ป kaldi๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
๋ด๊ฐ ๋ง์ง๋ง์ผ๋ก ์๋ํ ๊ฒ์ 2017 ๋ ์ด์๊ธฐ ๋๋ฌธ์ ymmv, ๋ฐ๋ผ๊ฑด๋ ๋ค์ ๋ณผ ์๊ฐ์ด ์๊ธฐ๋ฉด mycroft๊ฐ ๊ทธ๋ฆฌ์์ :)
๊ฐ์ฌํฉ๋๋ค. ํ์ง ์ฒญ์ทจ์๋ ์ฐธ์ผ๋ก ๋งค์ฐ ํฅ๋ฏธ ๋กญ์ต๋๋ค. ์ ๋ฐ์ดํธ๋ก PRํ๊ฒ ์ต๋๋ค.
Vosk ๋ RPI์์ ์คํํ ์ ์์ผ๋ฉฐ ํ์ฌ 16 ๊ฐ ์ธ์ด์ ๋ํ ์์ (50MB) STT ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ง๊ธ ์๋ํด ๋ณผ๊ฒ์ ...
@domcross ๋ ์ฌ๊ธฐ์์ https://github.com/HelloChatterbox/speech2text/blob/dev/speech2text/engines/kaldi.py
# 2594๊ฐ ๋ณํฉ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ผ๋ฏ๋ก ์ถ๊ฐ ํ ์ ์์ต๋๋ค. :)