Azure docker ja eestikeelne kõnetuvastus

01.11.2019

Eesti keele kõnetuvastus on üsna keeruline tarkvara. Isegi selle installeerimine enda arvutisse võib olla väljakutse. Mis siis rääkida veel selle kirjutamisest programmeerijana.

Veebibrauseris vastav tööriist on internetis saadaval siin: http://bark.phon.ioc.ee/webtrans/

Kui siiski soovime seda tarkvara ise jooksutada, siis üks lihtne võimalus on kasutada valmis docker konteinerit.

Juhendi leiame siit:

https://github.com/alumae/kaldi-offline-transcriber/tree/master/misc/docker

Kui teha selle juhendi järgi, siis suure tõenäosusega saame selle ka kohe tööle. Eelnevalt tuleb jälgida, et docker konteineri käsutuses oleks vähemalt 6GB RAM. Mul ebaõnnestus 4GB RAM-ga, kuid 6GB oli piisav, et üks näide tööle saada.

Kui me ei sooviks seda tarkvara hoida enda arvutis vaid hoopis Azure pilves, kuidas see siis tööle saada? Järgnevalt on dokumenteeritud väike juhend, kuidas mul see õnnestus kasutades PowerShell käsurida.

Kõigepealt tee resource group:

az group create --name tuvastusResourceGroup --location uksouth

vastus:

{
  "id": "/subscriptions/55622624-1ccb-4e6c-97dc-51d463935a2e/resourceGroups/tuvastusResourceGroup",
  "location": "uksouth",
  "managedBy": null,
  "name": "tuvastusResourceGroup",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

Seejärel tee Container Registry:

az acr create --resource-group tuvastusResourceGroup --name tuvastusContainerRegistry --sku Basic

vastus:

{
  "adminUserEnabled": false,
  "creationDate": "2019-11-01T08:36:50.213637+00:00",
  "id": "/subscriptions/55622624-1ccb-4e6c-97dc-51d463935a2e/resourceGroups/tuvastusResourceGroup/providers/Microsoft.ContainerRegistry/registries/tuvastusContainerRegistry",
  "location": "uksouth",
  "loginServer": "tuvastuscontainerregistry.azurecr.io",
  "name": "tuvastusContainerRegistry",
  "networkRuleSet": null,
  "policies": {
    "quarantinePolicy": {
      "status": "disabled"
    },
    "retentionPolicy": {
      "days": 7,
      "lastUpdatedTime": "2019-11-01T08:36:52.156079+00:00",
      "status": "disabled"
    },
    "trustPolicy": {
      "status": "disabled",
      "type": "Notary"
    }
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "tuvastusResourceGroup",
  "sku": {
    "name": "Basic",
    "tier": "Basic"
  },
  "status": null,
  "storageAccount": null,
  "tags": {},
  "type": "Microsoft.ContainerRegistry/registries"
}

Logi sisse:

az acr login --name tuvastusContainerRegistry

Vastus:

Login Succeeded

Lubame admin kasutaja:

az acr update -n tuvastusContainerRegistry --admin-enabled true

vastus:

{
  "adminUserEnabled": true,
  "creationDate": "2019-11-01T08:36:50.213637+00:00",
  "id": "/subscriptions/55622624-1ccb-4e6c-97dc-51d463935a2e/resourceGroups/tuvastusResourceGroup/providers/Microsoft.ContainerRegistry/registries/tuvastusContainerRegistry",
  "location": "uksouth",
  "loginServer": "tuvastuscontainerregistry.azurecr.io",
  "name": "tuvastusContainerRegistry",
  "networkRuleSet": null,
  "policies": {
    "quarantinePolicy": {
      "status": "disabled"
    },
    "retentionPolicy": {
      "days": 7,
      "lastUpdatedTime": "2019-11-01T08:36:52.156079+00:00",
      "status": "disabled"
    },
    "trustPolicy": {
      "status": "disabled",
      "type": "Notary"
    }
  },
  "provisioningState": "Succeeded",
  "resourceGroup": "tuvastusResourceGroup",
  "sku": {
    "name": "Basic",
    "tier": "Basic"
  },
  "status": null,
  "storageAccount": null,
  "tags": {},
  "type": "Microsoft.ContainerRegistry/registries"
}

Tekitatud kasutajanime ja parooli saab vaadata nii:

az acr credential show --name tuvastusContainerRegistry

Vastus:

{
  "passwords": [
    {
      "name": "password",
      "value": "********************************"
    },
    {
      "name": "password2",
      "value": "********************************"
    }
  ],
  "username": "tuvastusContainerRegistry"
}

Veendu, et käsurida lokaalses dockeris töötab. Näiteks:

docker exec 79bafd51385a1933d7ea584a07870a0bc8ab9c791ab24a938e17e3313ce750cb bash -c 'mkdir -p /opt/speechfiles/ ; cd /opt/speechfiles/ ; wget https://www.infokiir.ee/mp3test/proov.mp3 ; /opt/kaldi-offline-transcriber/speech2text.sh  --trs /opt/speechfiles/proov.trs /opt/speechfiles/proov.mp3 ; cat /opt/speechfiles/proov.trs'

tag käsklusega märgistame konteineri:

docker tag alumae/kaldi-offline-transcriber-et tuvastuscontainerregistry.azurecr.io/kaldi-offline-transcriber-et:v1

Saadame selle azure pilve (see võtab üsnagi aega, sõltuvalt interneti kiirusest):

docker push tuvastuscontainerregistry.azurecr.io/kaldi-offline-transcriber-et:v1

Nüüd teen docker image vastava käsureaga:

az container create --restart-policy Never --registry-username tuvastusContainerRegistry --registry-password ******************************** --cpu 2 --memory 6 --resource-group tuvastusResourceGroup --name tuvastus6m --image tuvastuscontainerregistry.azurecr.io/kaldi-offline-transcriber-et:v1 --command-line "bash -c 'mkdir -p /opt/speechfiles/ ; cd /opt/speechfiles/ ; wget https://www.infokiir.ee/mp3test/proov.mp3 ; /opt/kaldi-offline-transcriber/speech2text.sh  --trs /opt/speechfiles/proov.trs /opt/speechfiles/proov.mp3 ; cat /opt/speechfiles/proov.trs'"

Muide alla 6GB mälu ei tasu panna. Proovisin 4GB ja sellest jäi väheks.

Tulemust vaatan käsklusega:

az container logs --resource-group tuvastusResourceGroup --name tuvastus6m

See näeb välja umbes selline:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Trans SYSTEM "trans-14.dtd">
<Trans scribe="est-speech2txt" audio_filename="proov" version="1" version_date="191101">
<Speakers>
<Speaker id="spk1" name="K01" check="no" dialect="native" accent="" scope="local"/>
</Speakers>
<Episode>
<Section type="report" startTime="0.000" endTime="9.330">
<Turn speaker="spk1" startTime="0.690" endTime="9.150">
<Sync time="0.690"/>
Ma teen siis ise kõigepealt ühe väikse proovi. Vaatame, kas ta oskab helifaili teha tekstiks.
</Turn>
</Section>
<Section type="filler" startTime="9.330" endTime="10.320">
</Section>
</Episode>
</Trans>

Kui soovin uuesti käivitada kestuse mõõtmisega, siis kasutan käsklust:

Measure-Command { az container start --resource-group tuvastusResourceGroup --name  tuvastus6m }

Tulemus:

Days              : 0
Hours             : 0
Minutes           : 8
Seconds           : 43
Milliseconds      : 367
Ticks             : 5233673801
TotalDays         : 0,00605749282523148
TotalHours        : 0,145379827805556
TotalMinutes      : 8,72278966833333
TotalSeconds      : 523,3673801
TotalMilliseconds : 523367,3801

See tarkvara jookseb üllatavalt kaua, samas tuvastuse kvaliteet on üllatavalt hea.