Aquesta és una guia completa, pas per pas, per a configurar Mycroft en català.
Nota: aquest document és una traducció de l'original en anglès que podeu consultar aquí.
- Traducció del nucli (core)
- Traducció de les habilitats (skills)
- Instal·lació d'extensions (plugins)
- Lingua franca
- mycroft.conf
- Configuració final
- Ajustaments addicionals
Cal traduir alguns fitxers de mycroft-core. Aquests fitxers s'utilitzen principalment en els diàlegs predeterminats.
Podeu trobar aquests fitxers a mycroft-core/mycroft/res/text
- Copieu la carpeta
en-us
aca-es
. - Traduïu qualsevol fitxer que encara no estigui traduït.
NOTA: Els fitxers de recursos de mycroft-core ja es van traduir al català, però amb el temps és possible que s'hagin creat fitxers nous o hagin canviat els anteriors i ara calgui fer o actualitzar-ne la traducció.
El primer que hauríeu de fer és traduir les habilitats. Altrament, encara que Mycroft us entengui, només us respondrà missatge d'error perquè no sabrà què ha de fer.
La traducció d'habilitats de vegades no és senzilla, hi ha molts casos especials.
NOTES ESPECILAS:
- Qualsevol habilitat que tingui un fitxer sense traduir no es carregarà. Cal que tots els fitxers estiguin traduïts.
- El codi de llengua ha de coincidir de forma exacta amb el valor global configurat! Vaig enviar una PR per a millorar-ho l'any 2017, però fou ignorada completament, i la vaig tancar (sense fusionar) després de 3 anys.
La millor manera de traduir habilitats és usant la plataforma de traducció de Mycroft, aneu a translate.mycroft.ai i ajudeu a traduir l'habilitat de la botiga.
Després cal que espereu que Mycroft (l'empresa) enviï les traduccions als repositoris de les habilitats.
Per a les habilitats que es tradueixen a translate.mycroft.ai, cal que l'equip de Mycroft sincronitzi manualment les traduccions amb els repositoris de codi font. Però podeu usar un script personalitzat per a exportar les cadenes del Pootle si no voleu esperar!
Cloneu el repositori mycroft-update-translations en una carpeta de treball i executeu l'script:
git clone https://github.com/jmontane/mycroft-update-translations
cd mycroft-update-translations
./mycroft-update-translations
Nota: actualment aquest script no accepta paràmetres en la línia d'ordres. Està preconfigurat per al català. Si cal, editeu el fitxer mycroft-update-translations.py i canvieu-ne els paràmetres. Per defecte, tradueix les habilitats de la carpeta /opt/mycroft/skills/
. Si voleu traduir una altra llengua o heu canviat el data_dir
del fitxer mycroft.conf
, cal que editeu aquest fitxer.
Si la vostra habilitat no és a la botiga, cal que la traduïu manualmennt, perquè no hi serà en la plataforma de traducció.
És molt més fàcil començar traduccions si ja teniu fitxer per traduir, en comptes d'haver-los de crear un per un.
Podeu usar un script de @jmontane per a copiar els recursos de llengua d'una altra llengua, habitualment en-us
(la llengua predeterminada per a la majoria d'habilitats) i després traduir els fitxers copiats. Altres vegades potser tindrà sentit copiar d'una altre llengua, per exemple de pt-br
a pt-pt
o es-es
a gl-es
.
Cloneu el repositori mycroft-copy-translations i executeu l'script
git clone https://github.com/jmontane/mycroft-copy-translations
cd mycroft-copy-translations
./mycroft-copy-translations
NOTA: actualment aquest script no accepta paràmetres en la línia d'ordres. Si cal, editeu el fitxer mycroft-copy-translations.py i canvieu-ne els paràmetres. Està preconfigurat per al català i de forma predeterminada s'aplica a les habilitats de la carpeta /opt/mycroft/skills/
. Si voleu copiar una llengua diferent o heu canviat el paràmetre data_dir
del mycroft.conf
, cal que editeu aquest fitxer.
TODO
Algunes habilitats necessiten usar valors diferents en el codi depenent de la llengua. Una aproximació habitual és usar el mètode translate_namedvalues
des de les habilitats per a trobar recursos. Això és, essencialment, un fitxer .csv amb parells de valors que s'usen per a alimentar de dades un diccionari de Python.
Aquesta és una bona aproximació per a la localització d'habilitats, però no és tan senzill com traduir els fitxers de diàleg, perquè el contingut d'aquests fitxer no és obvi i depèn del codi de l'habilitat en particular.
Si usem l'habilitat de la Viquipèdia oficial com a exemple, cal traduir aquest fitxer que diu al paquet wikipedia quin codi de llengua ha d'usar:
- dialog
- en-us
- wikipedia_lang.value
- ca-es
- wikipedia_lang.value
El contingut del fitxer wikipedia_lang.value
del directori en-us
és:
# Wikipedia language code used to service queries in the active language
code,en
El contingut del fitxer wikipedia_lang.value
del directori ca-es
és:
# Codi de llengua de Viquipèdia usat per a fer consultes en la llengua activa
code,ca
Això es pot usar en el codi d'aquesta manera:
data = self.translate_namedvalues("wikipedia_lang")
wiki.set_lang(data["code"])
Si el fitxer anterior es tradueix com a code,ca-es
l'habilitat no funcionarà. Com a traductor no teniu cap manera de saber-ho sense revisar el codi. Per tant, recomano deixar un comentar amb un enllaç a documentació rellevant. Com podeu veure en els exemples anteriors, les línies que comencen amb # s'ignoren.
TODO
Algunes habilitats no es poden traduir fàcilment i necessiten canvis en el codi per a gestionar-ho:
- usen una biblioteca o API web que espera contingut en anglès
- usen una biblioteca o API web que retora resultats en anglès
- necessiten algun recurs lingüístic específic que no s'ha tingut present per l'autor original
Una aproximació possible per a solucionar-ho és usar traducció en temps d'execució, l'habilitat wolfram alpha skill oficial ho fa. Faig el mateix en l'habilitat icanhazdadjoke
Si desenvolupeu habilitats aquí teniu una plantila que podeu usar com a punt de partida
from mycroft.skills.core import MycroftSkill, intent_handler
from google_trans_new import google_translator
class MySkill(MycroftSkill):
def __init__(self):
super().__init__(name="MySkill")
self.translator = google_translator()
self.tx_cache = {} # avoid translating twice
@intent_handler("my_intent.intent")
def handle_intent(self, message):
# fa alguna cosa qeu retorna una frase en anglès
(...)
# tradueix la resposta a la llengua de l'usuari
translated_utt = self.translate(value)
self.speak(translated_utt)
@intent_handler("my_other_intent.intent")
def handle_english_input_intent(self, message):
# obté el valor que necessita ser en anglès però és la llengua de l'usuari
value = message.data["value"]
# tradueix-lo a l'anglès
tx_value = self.translate(value, "en", self.lang)
# fa alguna cosa amb tx_value
eng_utt = "this is in english, but will be spoken in catalan"
# tradueix la resposta a la llengua de l'usuari
translated_utt = self.translate(eng_utt)
self.speak(translated_utt)
def translate(self, utterance, lang_tgt=None, lang_src="en"):
lang_tgt = lang_tgt or self.lang
# si les llengües són les mateixes, no facis res
if not lang_tgt.startswith(lang_src):
if lang_tgt not in self.tx_cache:
self.tx_cache[lang_tgt] = {}
# si ja s'ha traduït, no ho tornis a traduir
if utterance in self.tx_cache[lang_tgt]:
# get previous translated value
translated_utt = self.tx_cache[lang_tgt][utterance]
else:
# tradueix aquesta frase
translated_utt = self.translator.translate(utterance, lang_tgt=lang_tgt, lang_src=lang_src).strip()
# desa la traducció per si la necessitem una altra vegada
self.tx_cache[lang_tgt][utterance] = translated_utt
self.log.debug("translated {src} -- {tgt}".format(src=utterance, tgt=translated_utt))
else:
translated_utt = utterance.strip()
return translated_utt
NOTE: afegiu google_trans_new
al fitxer requirements.txt de la vostra habilitat.
Mycroft fa difícil de desactivar les habilitats oficials, encara que les esborreu es tornen a instal·lar automàticament.
Si voleu substituir una habilitat oficial, cal que la poseu en la llista negra, que la bloqueu, així Mycroft no la carregarà.
Per a blocar les habilitats oficials que no són compatibles amb el català, editeu el fitxer mycroft.conf
i afegiu la secció següent. Assegureu-vos d'usar els noms exactament igual com apareixen en la carpeta d'habilitats. Habitualment en el format nom_repositori_a_github.autor
"skills": {
"blacklisted_skills": [
"mycroft-npr-news.mycroftai",
"mycroft-fallback-duck-duck-go.mycroftai",
"mycroft-joke.mycroftai"
]
}
Si esteu escrivint una habilitat que explícitament substitueix una habilitat oficial, podeu fer el següent en Python:
from mycroft.messagebus.message import Message
from mycroft.configuration import LocalConf, USER_CONFIG
class MyAlternativeSkill(MycroftSkill):
def initialize(self):
self.blacklist_default_skill()
def blacklist_default_skill(self):
# carrega la llista d'habilitats que actualment estan blocades
blacklist = self.config_core["skills"]["blacklisted_skills"]
# comprova el nom de la carpeta (skill_id) de l'habilitat que voleu substituir
skill_id = "mycroft-skill-to-replace.mycroftai"
# afegeix l'habilitat a la llista negra
if skill_id not in blacklist:
self.log.debug("Blacklisting official mycroft skill")
blacklist.append(skill_id)
# carrega el fitxer de configuració de l'usuari (~/.mycroft/mycroft.conf)
conf = LocalConf(USER_CONFIG)
if "skills" not in conf:
conf["skills"] = {}
# actualitza el camp blacklist
conf["skills"]["blacklisted_skills"] = blacklist
# desa el fitxer de configuració de l'usauri
conf.store()
# indica a al servei d'intents que descarrega l'habilitat en cas que estigués carregada
# això hauria d'evitar la necessitat de reiniciar
self.bus.emit(Message("detach_skill", {"skill_id": skill_id}))
Aquest tutorial usa algunes extensions. En cada secció teniu enllaços a aquestes extensions i detalls sobre com configurar-les.
Per a instal·lar una extensió, podeu usar pip
, però cal que esteu en l'entorn virtual (venv) de Mycroft!
Podeu fer-ho de diverses maneres.
- Activeu el .venv manualment,
source mycroft-core/.venv/bin/activate
. - Useu l'script àlies mycroft (pot ser no és disponible)
mycroft-venv-activate
. - Executeu l'script explícitament
mycroft-core/venv-activate.sh
.
Després executeu l'ordre d'instal·lació:
pip install jarbas-stt-plugin-chromium
Mycroft proporciona un embolcall de pip per a facilitar-vos la part anterior, això potser no és disponible en la vostra plataforma.
- Useu l'àlies de Mycroft (potser no és disponible)
mycroft-pip install jarbas-stt-plugin-chromium
. - Executeu l'script explícitament
mycroft-core/bin/mycroft-pip install jarbas-stt-plugin-chromium
. - En un Mark I cal que useu sudo
sudo mycroft-pip install jarbas-stt-plugin-chromium
.
Instal·lació des de Github a partir d'un URL usant pip
:
mycroft-pip install git+https://github.com/JarbasLingua/jarbas-stt-plugin-chromium
O manualment:
git clone https://github.com/JarbasLingua/jarbas-stt-plugin-chromium
cd jarbas-stt-plugin-chromium
mycroft-pip install .
TODO
- Com traduir
- Ús
- Actualitzar el nucli per a usar la bifurcació
Si voleu editar la configuració d'usuari, el fitxer és a ~/.mycroft/mycroft.conf
Tingueu present que aquest és el directori d'usuari per a l'usuari que executa Mycroft, en un Mark I això significa /home/mycroft/.mycroft/mycroft.conf
NO PAS /home/pi/.mycroft/mycroft.conf
Teniu més informació sobre el fitxer mycroft.conf en la documentació (en anglès)
Després d'editar el fitxer mycroft.con cal que reinicieu Mycroft perquè els canvis tinguin efecte.
Primer de tot cal definir la llengua global de Mycroft. Aquesta llengua és la que s'usarà en carregar les habilitats i els fitxers de recursos.
NOTES ESPECIALS:
- El codi ha de coincidir amb el codi de llengua del fitxers de recursos de nucli de mycroft-core, en el nostre cas
ca-es
. - El codi de llengua ha de coincidir de forma exacta! Vaig enviar una PR per a millorar-ho l'any 2017, però es va ingorar completament.
- Els habilitats també usaran aquest codi de llengua per a cerca fitxers de recursos.
- Els termes "codi de llengua" i "lang code" és refereixen als codis de llengua del lBCP-47 (en anglès), habitualment usats pels ordinadors per a identificar una llengua i regió. Farem servir el codi de llengua "ca-es" per a referir-nos a la variant de català parlada a l'estat espanyol. Altres exemples familiars són "en-us" (anglès/Estats Units) i "es-es" (espanyol/Espanya)".
{
"lang": "ca-es"
}
Hem de configurar un motor que admeti el català. Google STT admet el català, i aquest és el que usa el motor de Mycroft.
NOTES ESPECIALS:
- El motor de Mycrfot hauria de funcionar de sèrie amb la majoria de llengües.
- El motor chromium STT espera el codi de llengua
ca-es
, no funciona si useu el codi de llenguaca
. - La majoria de motors STT no permeten personalitzar el codi de llengua de forma independent a la llengua global de Mycroft si no s'implementa manualment.
El millor que es pot fer és usar extensions que admetin llengües correctament.
- mycroft: Només funciona si la llengua global definida és
ca-es
, però pot deixar de funcionar perquè funciona de casualitat. Vegeu mycroft chat per a més detalls. - google cloud: Bona qualitat, no és lliure. Permet especificar un codi de llengua específic
- google: Per a usar-lo cal una clau API, però ja no se n'emeten claus. Vegeu els detalls a l'extensió google chromium. A tots els efectes és inútil.
Teniu instruccions detallades sobre la instal·lació d'extensions a la secció d'extensions
Simplement evitem el motor STT de Mycroft perquè pot deixar de funcionar en qualsevol moment.
mycroft-pip install jarbas-stt-plugin-chromium
Configureu l'extensió google chromium i definiu el codi de llengua específic per del motor.
{
"stt": {
"module": "chromium_stt_plug",
"chromium_stt_plug": {
"lang": "ca-ES"
}
}
}
Una altra vegada, hem de triar un motor que admeti el català, per defecte el motor de Mycroft només admet l'anglès.
- espeak: cal instal·lar-lo manualment. La veu és massa robòtica!
- festival: cal instal·lar-lo manualment. La qualitat és acceptable.
- gtts: es pot definir des de la interfície web de Mycroft. Sovint té problemes i deixa de funcionar (usa una API no documentada del traductor de Google).
Teniu instruccions detallades per a fer-ne la instal·lació en la secció d'extensions
- catotron: la millor qualitat, però és lent.
- softcatala: mateixa qualitat que festival, però funciona en un servidor.
- voicerss: requereix una clau API (gratuïta).
- responsive voice: usa espeak per al català. La veu és massa robòtica.
Configurem Mycroft perquè usi festival
El nucli de Mycroft (mycrot-core) admet festival, però cal instal·lar-lo manualment en el sistema operatiu:
sudo apt-get -y install festival festvox-ca-ona-hts lame
{
"tts": {
"module": "festival",
"festival": {
"lang": "catalan",
"encoding": "ISO-8859-15//TRANSLIT"
}
}
}
Si useu l'habilitat naptime skill podeu dir al Mycroft "vés a dormir", si ho feu, no es processa el reconeixement de la parla STT. Això és una funcionalitat de privadesa.
Això atura les crides al sistema de reconeixement de la parla STT, i garanteix que la vostra veu no s'envia enlloc per una activacio accidental.
Però això vol dir que heu de traduir aquesta paraula d'activació, per defecte és en anglès: "wake up"
NOTES ESPECIALS:
- Mentre dorm, Mycroft encara reaccionarà a la paraula d'activació, però en comptes d'activar el motor STT escoltarà per la segona paraula despertadora.
- Cal que digueu "ei mycroft, desperta" per a reactivar el STT.
- Atès que això requereix 2 paraules d'activació seguides, la precisió de l'activació pot ser inferior i s'accepten més falses activacions.
Per a traduir tot això al català usem l'extensió snowboy:
- És molt lleugera
- Es poden carregar diversos models simultàniament.
- Podeu entrenar un model personal per a cada membre de la casa.
- Malauradament, snowboy tanca el 31 de desembre de 2020, entreneu models mentre pugueu!!!
Instal·leu l'extensió amb:
mycroft-pip install jarbas-wake-word-plugin-snowboy
Ara configurem Mycroft perquè usi això:
"listener": {
"stand_up_word": "desperta"
},
"hotwords": {
"desperta": {
"module": "snowboy_ww_plug",
"models": [
{"sensitivity": 0.5, "model_path": "camí/a/model_persona_1.pmdl"},
{"sensitivity": 0.5, "model_path": "camí/a/model_persona_2.pmdl"},
{"sensitivity": 0.5, "model_path": "camí/a/model_persona_2.pmdl"}
]
}
}
Si no heu entrenat un model, no patiu, @jmontane va entrenar alguns models que s'inclouen en l'extensió i que haurien de funcionar correctament! Assegureu-vos d'ajustar-ne les precisions.
"listener": {
"stand_up_word": "desperta"
},
"hotwords": {
"desperta": {
"module": "snowboy_ww_plug",
"models": [
{"sensitivity": 0.5, "model_path": "desperta_jm.pmdl"},
{"sensitivity": 0.5, "model_path": "desperta_jm2.pmdl"}
]
}
}
Ara podeu activar el Mycroft en català! "ei mycroft, desperta"
Aquest ha estat un tutorial força llarg, però si heu seguit totes les instruccions, el vostre fitxer mycroft.conf
hauria de ser similar a aquest:
{
"lang": "ca-es",
"stt": {
"module": "chromium_stt_plug",
"chromium_stt_plug": {
"lang": "ca-ES"
}
},
"tts": {
"module": "festival",
"festival": {
"lang": "catalan",
"encoding": "ISO-8859-15//TRANSLIT"
}
},
"skills": {
"blacklisted_skills": [
"mycroft-npr-news.mycroftai",
"mycroft-fallback-duck-duck-go.mycroftai",
"mycroft-joke.mycroftai"
]
},
"listener": {
"stand_up_word": "desperta"
},
"hotwords": {
"desperta": {
"module": "snowboy_ww_plug",
"models": [
{"sensitivity": 0.5, "model_path": "desperta_jm.pmdl"},
{"sensitivity": 0.5, "model_path": "desperta_jm2.pmdl"}
]
}
}
}
Una paraula d'activació és el que heu de dir perquè Mycroft comenci a escoltar.
Mycroft usa el motor precise per a fer això. És un model entrenat amb sons, per tant no requereix una "traducció". Si voleu canviar el nom de Mycroft aleshores cal que feu més de 50 enregistraments i entreneu un model
Alguns usuaris tenen traça amb l'entreament de models, per tant us recomano de revisar el repositori comuntari de Precise, si hi pugeu els enregistraments la comunitat us entrenarà un model! Això també significa que el model millorarà amb el temps.
Hi ha dues paraules d'activació que cal configurar. El "nom" de Mycroft, i la paraula despertadora "desperta" (teniu més informació sobre això més avall)
Mycroft baixa el binari de precise en temps d'execució. Hi ha la versió 0.2 i la 0.3. Per defecte Mycroft usa la versió 0.2, però alguns models estan entrenats per a la 0.3 (la versió de github)
"precise": {
"dist_url": "https://github.com/MycroftAI/precise-data/raw/dist/{arch}/latest-dev"
}
Si voleu tornar a la versió 0.2
"precise": {
"dist_url": "https://github.com/MycroftAI/precise-data/raw/dist/{arch}/latest"
}
Podem canviar la forma amb que activem Mycroft.
Per a aquest exemple farem servir un model comunitari, Ey Ordenador, que funciona prou bé en català si diem "ei ordinador"
Baixeu el model d'aquí i descomprimiu els fitxers a ~/.mycroft/precise/models
(o a qualsevol altra ubicació que vulgueu)
Podeu canviar 2 paràmetres per a millorar la detecció amb la vostra veu
sensitivity
Més alt -> més precisiótrigger_level
Més alt -> més retard i menys sensible
"listener": {
"wake_word": "ey_ordenador"
},
"hotwords": {
"ey_ordenador": {
"module": "precise",
"local_model_file": "~/.mycroft/precise/models/hey-computer-es.pb",
"sensitivity": 0.5,
"trigger_level": 3
}
}
De vegades ens interessarà substituir una aplacació oficial per una altra d'alternativa que funciona millor en català.
L'habilitat oficial jokes encara no té bromes en català, podeu activar l'habilitat (perquè els fitxers s'han traduït), però no funcionarà correctament, hauríeu de blocar-la per a evitar conflictes.
Podeu usar l'habilitat alternativa, skill-icanhazdadjoke, que usa l'API de icanhazdadjoke.com/, blocarà l'habilitat predeterminada automàtica i admet moltes llengües (mitjançant el traductor de Google).
msm install https://github.com/JarbasSkills/skill-icanhazdadjoke
Per a funcionar en català ens cal trobar un proveïdor de notícies en català.
Aquesta sol·licitud d'entrada afegeix CCMA Catalunya Informació, però està aturada per un error en el motor de Mycroft.
Podeu instal·lar l'habilitat skill-news, blocarà l'habilitat predeterminada i ja admet el català.
NOTA: això és temporal, quan Mcyroft corregeixi el problema retiraré aquesta habilitat, però intentaré fer-ho de forma transparent, desblocant l'habilitat de notícies predeterminada, no caldrà que feu res.
msm install https://github.com/JarbasLingua/skill-news
De forma predeterminada, Mycroft usa un motor d'àudio simple que té alguns problemes amb fluxos http. Ens cal que Mycroft usi el motor vlc
, a més, això permetrà que altres habilitats funcionin correctament.
sudo apt-get install vlc
Editeu el vostre fitxer mycroft.conf
i afegiu-hi el següent:
"Audio": {
"backends": {
"vlc": {
"active": true
}
},
"default-backend": "vlc"
}