Hlasové ovládání HA v češtině STT - řeč na text

Home Assistant CZ drbna
kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

Udělám si tu prozatím jen pár poznámek.

https://www.home-assistant.io/integrations/stt/
https://www.home-assistant.io/blog/2019 ... stant/#ada (a v diskuzi také zajímavé odkazy)

Home Assistant - Almond, Ada
Zjednodušeně - Almond zpracovává text (tedy takové ty "Jaké je počasí") a text mu dodává Ada na základě hlasového vstupu, pro jehož převod používá služby Microsoftu. MS Speech to text češtinu umí, stejně jako spoustu jiných jazyků. Níže odkaz na online demo.
Z ADA by tedy mohl vypadnout český text. Takže české hlasové ovládání HA by mělo být možné.
Napadají mne
- mezi Ada a Almond vložit online překladač (univerzální řešení pro všechny jazyky podporované MS STT, záleží na kvalitě překladače)
- Fork Almondu pro češtinu
- náhrada Almondu něčím malým vlastním (základní parsování vět typu zhasni nebo zvyš teplotu by mohlo být jednoduché)
- náhrada Almondu něčím z cognitive-services MS

Rozpoznávání češtiny - online dema
Jen perlička - můj HA má název HAgrid, oslovení Hagride MS rozpozná jinak než Google.
Microsoft - https://azure.microsoft.com/cs-cz/servi ... /#overview
Služba využívající Google - https://www.speechtexter.com/


Microsoft - Azure - https://azure.microsoft.com/cs-cz/servi ... -services/
Google cloud - https://cloud.google.com/speech-to-text/docs/languages

Mozilla, deepspeech (Lokální, tensor flow, open source)
Tady se dá pomoci s trénováním češtiny - https://commonvoice.mozilla.org/cs
https://research.mozilla.org/machine-learning/
https://hacks.mozilla.org/2019/12/deeps ... xt-engine/
https://deepspeech.readthedocs.io/en/r0.9/



Něco dalšího TTS/STT offline, nicméně pro HA asi nepoužitelné.
https://www.newtontech.net/cs/newton-dictate/
https://www.speechtech.cz/speechtech-te ... aterina210
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

MS Lab je na hodinu. Na lokálu trvale.
K dispozici ukázka v C#, nebo Python, který jsem zkusil.
Stačí mít nainstalované Visual Studio Code, Python, free účet na Azure.

Kód: Vybrat vše

pip install azure-cognitiveservices-speech
Přepis hlasu na text, rozpoznání "What time is it?", hlasová odpověď. Zatím v angličtině, jdu zkusit jak to půjde česky.

Vytváření aplikací s podporou řeči pomocí služby Speech: https://docs.microsoft.com/cs-cz/learn/ ... nput-text/
Dokumentace: https://docs.microsoft.com/cs-cz/azure/ ... h-service/
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

První krůček se mi myslím povedl -

[spoiler=kód]
Originál MS je na GITu - https://github.com/MicrosoftLearning/AI-102-AIEngineer

Tohle je jen úprava pár řádků

.env

Kód: Vybrat vše

COG_SERVICE_KEY=azure_jeden_z_klicu
COG_SERVICE_REGION=westeurope
a speaking-clockcz.py

Kód: Vybrat vše

from dotenv import load_dotenv
from datetime import datetime
import os

# Import namespaces
import azure.cognitiveservices.speech as speech_sdk
# from playsound import playsound


def main():
    try:
        global speech_config

        # Get Configuration Settings
        load_dotenv()
        cog_key = os.getenv('COG_SERVICE_KEY')
        cog_region = os.getenv('COG_SERVICE_REGION')

        # Configure speech service
        speech_config = speech_sdk.SpeechConfig(cog_key, cog_region)        
        print('Připraven na použití hlasových služeb v:', speech_config.region)
        
        # Get spoken input
        command = TranscribeCommand()
        if command.lower() == 'kolik je hodin?':
            TellTime()
        if command.lower() == 'zhasni světlo.':
            ZhasniSvetlo()

    except Exception as ex:
        print(ex)

def TranscribeCommand():
    command = ''

    # Configure speech recognition
    audio_config = speech_sdk.AudioConfig(use_default_microphone=True)    
    speech_recognizer = speech_sdk.SpeechRecognizer(speech_config, audio_config, language="cs-CZ")    
    print('Teď mluv...')
    
    # Configure speech recognition
    # audioFile = 'time.wav'
    # playsound(audioFile)
    # audio_config = speech_sdk.AudioConfig(filename=audioFile)
    # speech_recognizer = speech_sdk.SpeechRecognizer(speech_config, audio_config)


    # Process speech input
    speech = speech_recognizer.recognize_once_async().get()    
    if speech.reason == speech_sdk.ResultReason.RecognizedSpeech:        
        command = speech.text        
        print(command)    
    else:        
        print(speech.reason)        
        if speech.reason == speech_sdk.ResultReason.Canceled:            
            cancellation = speech.cancellation_details            
            print(cancellation.reason)            
            print(cancellation.error_details)


    # Return the command
    return command


def TellTime():
    now = datetime.now()
    response_text = 'Je právě {}:{:02d}'.format(now.hour,now.minute)


    # Configure speech synthesis
    # speech_config.speech_synthesis_voice_name = "en-GB-RyanNeural"
    # speech_synthesizer = speech_sdk.SpeechSynthesizer(speech_config)
    # speech_config.speech_synthesis_voice_name = 'en-GB-LibbyNeural' # change this    
    speech_config.speech_synthesis_voice_name = 'cs-CZ-VlastaNeural' # cs-CZ-AntoninNeural
    speech_synthesizer = speech_sdk.SpeechSynthesizer(speech_config) 


    # Synthesize spoken output
    # speak = speech_synthesizer.speak_text_async(response_text).get()
    # if speak.reason != speech_sdk.ResultReason.SynthesizingAudioCompleted:
    #     print(speak.reason)
    responseSsml = " \
        <speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='cs-CZ'> \
            <voice name='cs-CZ-VlastaNeural'> \
                {} \
                <break strength='weak'/> \
                Tak to snad funguje! \
            </voice> \
        </speak>".format(response_text)
    speak = speech_synthesizer.speak_ssml_async(responseSsml).get()
    if speak.reason != speech_sdk.ResultReason.SynthesizingAudioCompleted:
        print(speak.reason)

    # Print the response
    print(response_text)

def ZhasniSvetlo():
    response_text = 'Nezhasnu, neviděl bych na práci'
    speech_config.speech_synthesis_voice_name = 'cs-CZ-AntoninNeural'
    speech_synthesizer = speech_sdk.SpeechSynthesizer(speech_config)
    speak = speech_synthesizer.speak_text_async(response_text).get()
    if speak.reason != speech_sdk.ResultReason.SynthesizingAudioCompleted:
        print(speak.reason)

    # Print the response
    print(response_text)
    

if __name__ == "__main__":
    main()
[/spoiler]

Vzhledem k tomu že na Azure je zdarma 5 hodin mluvení měsíčně tak potřebuji předřadit rozpoznávání klíčového slova po kterém se teprve bude volat služba. A ne abych na cloudu visel 24/7
K tomu nějaký návod mám - https://www.youtube.com/watch?v=re-dSV_a0tM

Na začátek mi bude stačit pár frází, ale určitě bude nutné časem přistoupit k nějakému zpracování typu odhad entita/činnost, tedy to co dělá v originále "Almond".
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

BigSandy
Začínající autor
Začínající autor
Příspěvky: 16
Registrován: 06. březen 2022, 06:53

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od BigSandy »

Zdravím Tě.Umiš v AS?

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

Tak jak pokračuji?
Zapojení zhruba podle https://www.youtube.com/watch?v=re-dSV_a0tM

1) Zkusil jsem češtinu, WIT ji nepodporuje co se "hlas na text" týče, nicméně pokud dostane text tak jej rozparsuje dobře. Nevadí, to půjde přes Azure.
[spoiler]

Kód: Vybrat vše

curl -XPOST -H "Authorization: Bearer CLIENTGENERATEDGFUHJGDFYJDYD" "https://api.wit.ai/speech?v=20220309" -H "Content-Type:audio/wav" --data-binary "@rosvloz.wav"
{
  "code": "bad-request",
  "error": "Speech recognition is not supported for language: cs"
}
[/spoiler]

Trénovat model je možné online

A chci se podívat i na Mycroft a https://www.youtube.com/watch?v=AWvsXxDtEkU

Trocha teorie a náhledů jak pracovat se zvukem včetně ESP32
https://www.youtube.com/watch?v=ca2GKE4xkvM
https://www.youtube.com/watch?v=YereI6Gn3bM

Do ESP nacpeme i pár hlasových příkazů bez cloudu
A zajímalo by mne jak si poradí s češtinou čínský DSP za pár stovek, takže jsem jej rovnou objednal

Zároveň už mám na stole vývojový modul s ESP32-A1S.

Jako momentálně nejjednodušší cesta se mi jeví použití víceméně hotových věcí.

Natrénovat online probouzecí slovo.

ESP + I2S mikrofon a reproduktor,

Na probouzecí slovo rozpoznané ESP začít snímat zvuk (zkouším)
Zvuk poslat ho do cognitive services na Azure cloudu, vrátí se mi český text.
Mám vyzkoušeno, funguje celkem hezky, kontextově to občas nesedí.
Slova která zaměňuje pravidelně se nicméně dají opravit následně, předtím než je věta poslána k dalšímu zpracování.

Tento český text vzít a poslat ho do něčeho co mi ho rozparsuje na základě naučených pravidel vrátí z běžné věty důležitá slova - entitu a požadavek - tedy třeba světlo, ložnice, off (Zkusil jsem zatím wit.ai , nicméně i ostatní budou mít podobné služby, případně to udělat bez cloudu)

Výsledné příkazy posílat přes mqtt do HomeAssistant (případně jinam - univerzální) - MQTT mám vyzkoušeno na jiných projektech.
a zvukový výstup generovat opět přes Azure (Mám vyzkoušeno). Český mužský neurální hlas je dle mého názoru to nejlepší co jsem kdy slyšel z hlediska záměny s živým člověkem.

No a teď už zbývá "jen" dát to vše dohromady.
Výstupem mojí práce by měl být nějaký kus software, návod a možná i kus hardware.

[spoiler=Do budoucna bych nerad byl závislý na cloudech.]Pokud bude rozumně fungovat čínský DSP (nebude to jen hračka s vysokou chybovostí) tak rozpoznávání půjde lokálně, stejně jako zpracování příkazu. Zvukový výstup přes cloud. Pokud nebude cloud dostupný tak v nouzovém režimu alespoň nějaký základní hlas lokálně.
Na vlastní DSP si zatím netroufám, resp. si to možná dám do plánu na neurčito s nízkou prioritou. I když by to byla pecka. Rodina si vytrénuje asistenta na vlastní hlasy, nevadily by vady řeči, případně by mohl reagovat třeba na pískání nebo klingonštinu.[/spoiler]

[spoiler=A přihodím ještě dva odkazy na kurzy v oblasti umělé inteligence:]https://www.edx.org/course/google-ai-fo ... nsorflowjs
https://aka.ms/30daysAI[/spoiler]
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

Tak po několika dnech v minovém poli jsem rozchodil C# SDK Microsoft-Cognitive-Services na RaspberryPi 3/Raspbian-lite (bez grafického prostředí)
Aktuálně Bullseye na Arm32 architektuře, Arm64 by neměl být rozdíl.

Použitý HW: Raspberry Pi 3B, I2S mikrofon INMP441, I2S zesilovač max98357 + nějaký malý reproduktor, BT reproduktor/mikrofon "Google Nest Mini 2"
[spoiler=Vytvoření SD karty se systémem pro raspberry] - Raspberry Pi Imager, OS vybrat některý Raspberry Pi Lite (Buster je podporován v dokumentaci, Bullseye mi nicméně funguje)
pomocí - ctrl+shift+x se otevře skryté menu, možnost nastavit jméno stroje, doplnit rovnou wifi, povolit ssh, nastavit heslo[/spoiler]

Pro připojení k RPi se hodí nějaký SSH klient, pro Windows je hezký třeba https://www.bitvise.com/ssh-client-download

[spoiler=Poznámky k hardware]
Arm v6 nestačí, tedy RPi1 a Zero fungovat nebude
RPi3 B co jsem použil má 1GB ram, RPi 3A a RPi Zero 2 mají 512MB - je to méně než jsem našel někde v dokumentaci k Visual Studio Code pro remote development, nicméně odhaduji že by fungovat mohly také protože není nainstalováno desktopové prostředí. Vyzkouším časem, objednáno.

I2S mikrofon a I2S zesilovač by měl fungovat asi jakýkoli, je to levné řešení, a pravděpodobně s nejrychlejší odezvou.
Ve výsledku je asi jedno jaký zvukový vstup/výstup se použije, momentálně mám připojený na vstupu I2S mikrofon a výstup jde přes bluetooth Google Nest. Google Nest jsem zkusil i jako mikrofon, funguje, jen odezva je delší než u přímo připojeného I2S mikrofonu.
[/spoiler]

[spoiler=instalace hardware i s obrázky]
I2S mikrofon: https://learn.adafruit.com/adafruit-i2s ... iring-test
I2S zesilovač https://learn.adafruit.com/adafruit-max ... -pi-wiring
vynechat bod 2) https://www.okdo.com/project/set-up-a-b ... pberry-pi/[/spoiler]

[spoiler=Proč zrovna C#?]
Většina oficiální dokumentace a příkladů je pro dva jazyky. Python a C#.

Pro kombinaci Linux + Arm32, případně Arm64 jsou k dispozici SDK pro jazyky C++, C# a Java
Teoreticky by v budoucnu mohla být i podpora pro Python na Arm64 (vývojářský blog ohledně Mac s procesory M1)
[/spoiler]





[spoiler=Instalace .NET, .NET Core včetně SDK a powershellu]

Kód: Vybrat vše

#je nakonec primitivně jednoduchá, jen to chce vše .NET do stejné složky, pak to funguje a nerozbije si to vzájemně cesty.
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel Current
echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$HOME/.dotnet' >> ~/.bashrc
source ~/.bashrc
#adresu pro stazeni zjistim tady> https://dotnet.microsoft.com/en-us/download/dotnet/3.1
wget https://download.visualstudio.microsoft.com/download/pr/36a601f0-b88e-41ea-910b-4dde7b083e73/61ec8564d50fb391f9e3a10b226fdd0d/dotnet-sdk-3.1.417-linux-arm.tar.gz
tar zxf dotnet-sdk-3.1.417-linux-arm.tar.gz -C $HOME/.dotnet
#jen kontrola:
dotnet --info
dotnet --list-sdks
dotnet --list-runtimes

#---------------------  powershell - instalace pres dotnet core
dotnet tool install --global PowerShell
[/spoiler]

[spoiler=případně powershell jde nainstalovat z binárek]

Kód: Vybrat vše

#balicky pro nasledujici prikaz> https://github.com/PowerShell/PowerShell/releases

curl -L -o /tmp/powershell.tar.gz https://github.com/PowerShell/PowerShell/releases/download/v7.2.1/powershell-7.2.1-linux-arm32.tar.gz
# Create the target folder where powershell will be placed
sudo mkdir -p /opt/microsoft/powershell/7
# Expand powershell to the target folder
sudo tar zxf /tmp/powershell.tar.gz -C /opt/microsoft/powershell/7
# Set execute permissions
sudo chmod +x /opt/microsoft/powershell/7/pwsh
# Create the symbolic link that points to pwsh
sudo ln -s /opt/microsoft/powershell/7/pwsh /usr/bin/pwsh
pwsh
[/spoiler]

[spoiler=Visual Studio Code a přístup k RPi]Na počítači nainstalovat Visual Studio Code
ctrl+shift+x nainstalovat Remote Development
ctrl+shift+p remote-ssh se připojit k raspberry
remoteDevelopment.jpg
Pro rychlý start jsem zvolil oficiální online kurz Microsoftu (vše zdarma pokud nechcete certifikát o absolvování)
Jen pak namísto virtuálního stroje používáte svoje Visual Studio Code připojené k raspberry.
Je tam i odkaz na vytvoření klíčů v Azure. https://azure.microsoft.com/cs-cz/free/ ... -services/

Instalace SDK ve složce s programem:
remoteTerminalAddPackage.jpg
A přidám trošku upravený původní kód program.cs o češtinu:

Kód: Vybrat vše

// nezapomenout doplnit Azure klíč do appsettings.json
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;

// Import namespaces
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

namespace speaking_clock
{
    class Program
    {
        private static SpeechConfig speechConfig;
        static async Task Main(string[] args)
        {
            try
            {
                // Get config settings from AppSettings
                IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
                IConfigurationRoot configuration = builder.Build();
                string cogSvcKey = configuration["CognitiveServiceKey"];
                string cogSvcRegion = configuration["CognitiveServiceRegion"];

                // Configure speech service
                speechConfig = SpeechConfig.FromSubscription(cogSvcKey, cogSvcRegion);
                Console.WriteLine("Připraven na použití hlasových služeb v: " + speechConfig.Region);

                // // //testing what input devices avail. https://stackoverflow.com/questions/62006306/azure-speech-recognition-not-detecting-microphone-spxerr-mic-not-found
                // // var devices = await DeviceInformation.FindAllAsync(DeviceClass.AudioCapture);

                // // foreach (var device in devices)
                // // {
                // //     Console.WriteLine($"{device.Name}, {device.Id}\n");
                // // }


                // Configure voice
                speechConfig.SpeechSynthesisVoiceName = "cs-CZ-VlastaNeural";


                // Get spoken input
                string command = "";
                command = await TranscribeCommand();
                if (command.ToLower()=="kolik je hodin?")
                {
                    await TellTime();
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        static async Task<string> TranscribeCommand()
        {
            string command = "";
            
            // Configure speech recognition
            using AudioConfig audioConfig = AudioConfig.FromDefaultMicrophoneInput();
/*                 var enumerator = new MMDeviceEnumerator();
                string specifiedMicID = string.Empty;
                foreach (var endpoint in
                         enumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active))
                {
                    if (endpoint.FriendlyName != this.MicName)
                        continue;
                    else
                    {
                        specifiedMicID = endpoint.ID;
                        break;
                    }
                }
               using AudioConfig audioConfig = AudioConfig.FromMicrophoneInput(specifiedMicID); */
            using SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, "cs-CZ", audioConfig);
            Console.WriteLine("Ted mluv...");

            // Process speech input
            SpeechRecognitionResult speech = await speechRecognizer.RecognizeOnceAsync();
            if (speech.Reason == ResultReason.RecognizedSpeech)
            {
                command = speech.Text;
                Console.WriteLine(command);
            }
            else
            {
                Console.WriteLine(speech.Reason);
                if (speech.Reason == ResultReason.Canceled)
                {
                    var cancellation = CancellationDetails.FromResult(speech);
                    Console.WriteLine(cancellation.Reason);
                    Console.WriteLine(cancellation.ErrorDetails);
                }
            }


            // Return the command
            return command;
        }

        static async Task TellTime()
        {
            var now = DateTime.Now;
            string responseText = "Je právě " + now.Hour.ToString() + ":" + now.Minute.ToString("D2");
                        
            // Configure speech synthesis
            speechConfig.SpeechSynthesisVoiceName = "cs-CZ-AntoninNeural";
            using SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig);


            // Synthesize spoken output
            SpeechSynthesisResult speak = await speechSynthesizer.SpeakTextAsync(responseText);
            if (speak.Reason != ResultReason.SynthesizingAudioCompleted)
            {
                Console.WriteLine(speak.Reason);
            }


            // Print the response
            Console.WriteLine(responseText);
        }

    }
}
[/spoiler]

Pokud neposlouchá nebo nemluví tak je potřeba zvolit výchozí mikrofon a reproduktor.
Na tom jsem se zasekl při prvním pokusu, server socket error jsem si nespojil s audiem..., pak odešla stará SD karta. V současné instalaci jsem konečně na to přišel. Ač to vypisuji po spuštění "dotnet run" chybové hlášky, tak funguje vše a tyto jsou vztaženy pouze k zvukovému subsystému. Stačí mít vybrán mikrofon a reproduktor.
[spoiler=Jak vybrat výchozí zvukový vstup a výstup pomocí pactl]
service aplay blokuje v ALSA slave zařízení takže se zdá že nefunguje I2S mikrofon. Což ničemu nevadí, jde přes pulse.

Kód: Vybrat vše

pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ service aplay start
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'aplay.service'.
Authenticating as: ,,, (pi)
Password:
==== AUTHENTICATION COMPLETE ===
pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ pactl list short sources
0       alsa_output.platform-asoc-simple-card.0.stereo-fallback.monitor module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED
1       alsa_input.platform-asoc-simple-card.0.stereo-fallback  module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED
2       bluez_sink.CC_F4_11_E1_76_93.a2dp_sink.monitor  module-bluez5-device.c  s16le 2ch 44100Hz       SUSPENDED
pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ pactl list short sinks
0       alsa_output.platform-asoc-simple-card.0.stereo-fallback module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED
1       bluez_sink.CC_F4_11_E1_76_93.a2dp_sink  module-bluez5-device.c  s16le 2ch 44100Hz       SUSPENDED
pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ pactl set-default-sink bluez_sink.CC_F4_11_E1_76_93.a2dp_sink
pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ pactl set-default-source alsa_input.platform-asoc-simple-card.0.stereo-fallback
pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ dotnet run
Připraven na použití hlasových služeb v: westeurope
Ted mluv...
Kolik je hodin?
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
Je právě 22:28
pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ pactl set-default-source bluez_sink.CC_F4_11_E1_76_93.a2dp_sink.monitor
pi@lilith1:~/projects/AI-102-AIEngineer/07-speech/C-Sharp/speaking-clock $ dotnet run
Připraven na použití hlasových služeb v: westeurope
Ted mluv...
Kolik je hodin?
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
Je právě 22:35
[/spoiler]

[spoiler=Ještě instalace speech SDK i pro C++]
SDK pro C++. Jen rozbalit a nastavit cesty. Instalace a příklady:
https://docs.microsoft.com/cs-cz/azure/ ... nguage-cpp
https://pimylifeup.com/raspberry-pi-swap-file/
https://docs.microsoft.com/en-us/azure/ ... oid-studio
https://github.com/Azure-Samples/cognit ... start-code
https://github.com/Azure-Samples/cognit ... quickstart

Jen rychlý test bez úprav:

Kód: Vybrat vše

echo 'export SPEECHSDK_ROOT="$HOME/speechsdk"' >> ~/.bashrc 
echo 'export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SPEECHSDK_ROOT/lib/arm32"' >> ~/.bashrc
source ~/.bashrc

pi@lilith1:~/projects/cognitive-services-speech-sdk-2/quickstart/cpp/linux/from-microphone $ make 
g++ helloworld.cpp -o helloworld \
    --std=c++14 \
    -I/home/pi/speechsdk/include/cxx_api -I/home/pi/speechsdk/include/c_api \
    -L/home/pi/speechsdk/lib/arm32 \
    -lMicrosoft.CognitiveServices.Speech.core -lpthread -l:libasound.so.2
pi@lilith1:~/projects/cognitive-services-speech-sdk-2/quickstart/cpp/linux/from-microphone $ ./helloworld 
Say something...
We recognized: Hello.
A na češtinu přepnete jen doplněním

Kód: Vybrat vše

config->SetSpeechRecognitionLanguage("cs-CZ");
[/spoiler]

Přihodím ještě zajímavé odkazy
mikrofony ESP32: https://github.com/robertoostenveld/wifimic (a detekci probouzecího slova na ESP umíme)

A offline assistant - i pro HA - který chci vyzkoušet, případně upravit. Čeština je mezi jazyky.
https://rhasspy.readthedocs.io/en/latest/
https://community.home-assistant.io/t/r ... ker/154015
https://www.balena.io/blog/build-self-h ... e-required
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

Tip na velmi slušný mikrofon pro (asi jakékoliv) hlasové ovládání:
DSP, AGC, detekce směru hlasu, odfiltrování okolí. Připojení přes USB.
https://wiki.seeedstudio.com/ReSpeaker_Mic_Array_v2.0/
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

Jen porovnání MS vs Google

Zkusil jsem namluvit stejný text a
zkouším "masked profanity" - funguje dobře u obou. Zkouším "ITN"(Korun = Kč, sedmadvacet =27...), funguje daleko lépe u Google. Nicméně rozpoznání textu vyhrává MS na plné čáře. Ještě to bude náročné co se týče porozumnění textu.
[spoiler=Azure:]

Kód: Vybrat vše

{'RecognitionStatus': 'Success', 'Offset': 5000000, 'Duration': 186900000, 
'NBest': [{'Confidence': 0.8479176759719849, 
'Lexical': 'no tak zkouším něco namluvit uvidíme jak to dopadne a nechám to rozpoznat do prdele co si jako o sobě myslíš doktore mráčku byl to doktor vejvoda s platem tři a půl tisíce korun venku je tři a půl stupně teplotu nastavte na sedmadvacet', 
'ITN': 'no tak zkouším něco namluvit uvidíme jak to dopadne a nechám to rozpoznat do prdele co si jako o sobě myslíš doktore mráčku byl to doktor vejvoda s platem 3 a půl 1000 korun venku je 3 a půl stupně teplotu nastavte na sedmadvacet', 
'MaskedITN': 'no tak zkouším něco namluvit uvidíme jak to dopadne a nechám to rozpoznat ** ****** co si jako o sobě myslíš doktore mráčku byl to doktor vejvoda s platem 3 a půl 1000 korun venku je 3 a půl stupně teplotu nastavte na sedmadvacet', 
'Display': 'No tak zkouším něco namluvit, uvidíme jak to dopadne a nechám to rozpoznat. ** ****** co si jako o sobě myslíš doktore mráčku? Byl to doktor vejvoda s platem 3 a půl 1000 korun. Venku je 3 a půl stupně, teplotu nastavte na sedmadvacet.'}]}
[/spoiler]
[spoiler=Google:]

Kód: Vybrat vše

A tak zkouším něco namluvit a uvidíme jak to dopadne a nechám to dostat do p***** se kosi do měsíce to jde miláčku Eltodo Rubicon a spal jsem tři a půl 1300 Kč až budu ve tři a půl stupně teplotu nastav na 27
[/spoiler]
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

Další poznámky - trochu odbočka na uklidněnou protože se mi nedaří s ESP32 stream z mikrofonu přes API...
Mycroft/Picroft
Poznámky k návodu. Postupně budu doplňovat do tohoto příspěvku.
https://mycroft-ai.gitbook.io/docs/usin ... ft/picroft

Přes raspberry pi imager ctrl+shift+x jde nastavit jak ssh tak wifi i u tohoto image, takže nejsou potřeba žádné periferie.

Novější image, házím na samostatné RPi, počítám že po odladění konfigurace pojede i docker image na stroji s HA.
https://github.com/kleo/picroft/releases
apt update, upgrade,
Při hlášce v puštěném CLI nebo logu - "Error running install_or_update on mycroft-něco" smazávám, nebo raději přesunuji (pro případ rozbití) /opt/mycroft/skills/mycroft-něco nebo postup dle https://community.mycroft.ai/t/mycroft- ... flict/9541

setup přes mycroft-setup-wizard, při použití
HW: ReSpeaker Mic Array v2.0 nebo ReSpeaker USB Mic Array (což je mírně vylepšené předchozí a zakrytované)
upgraduje sám firmware, není potřeba nic dalšího

při padání precise_runner přepnout na jiné "naslouchátko" - z cli: "set listener to pocketsphinx"
(chybí podpora AVX instrukční sady nebo předtím fungoval? )
a do totoho problému jsem se dostal pravděpodobně smazáním původního /opt/mycroft/skills/mycroft-configuration.mycroftai


Důležité soubory
po první registraci na mycroft.ai je vytvořen soubor s identitou, použít při reinstalaci
/home/pi/.config/mycroft/identity/identity2.json

Jedno z lokálních umístění konfigurace:
/home/pi/.config/mycroft/mycroft.conf

Kód: Vybrat vše

{
"tts": {
    "module": "azure_tts",
    "azure_tts": {
        "api_key": "klic vygenerovany na azure",
        "voice": "cs-CZ-AntoninNeural",
        "region": "westeurope",
        "lang": "cs-CZ"
     }
},

"stt": {
  "google_cloud": {
    "lang": "cs-CZ",
    "credential": {
      "json": {
        "type": "service_account",
............  celý json vygenerovaný v api ...............https://console.cloud.google.com/apis/api/speech.googleapis.com/
      }
    }
  },
  "module": "google_cloud"
},
  "lang": "cs-cz",
  "max_allowed_core_version": 21.2,
  "hotwords": {
    "hey mycroft": {
      "module": "pocketsphinx"
    }
  }
}
odkazy ke klíčům:
https://pypi.org/project/mycroft-tts-plugin-azure/
https://www.voiptools.com/setup-google- ... scription/

Pro použití azure tts doinstalovat bezocasý
mycroft-pip install mycroft-tts-plugin-azure

instalace skills, jak na různé různé zdroje, https://mycroft-ai.gitbook.io/docs/skil ... ls-manager
budu instalovat z githubu kde jsem si forknul repozitáře s podporou češtiny (zkusím je i zaktualizovat proti hlavní větvi)
https://github.com/kiklhorn/mycroft-skills-manual

Kód: Vybrat vše

mycroft-msm remove mycroft-spelling
mycroft-msm install https://github.com/kiklhorn/skill-spelling

Snažím se jen spojit aktuální vývoj s hotovými cz překlady. Mezi prvními zkusím i homeassistant. ten forknout nemusím, čeština je.

Kód: Vybrat vše

  mycroft-msm install https://github.com/MycroftAI/skill-homeassistantt
Povídá hned o nastavení IP HA. Nastavím, nastavím klíč z HA a jede.

Podívám se ještě na kompletní konfiguraci (Mycroft si ji sestavuje jak z toho co je nastaveno na mycroft.ai tak z lokálních souborů. Pokud se tlučou, platí poslední)

Kód: Vybrat vše

mycroft-config get
a přes konzoli (mycroft-cli-client) nastavím listener (lokální komponenta snažící se odchytit probouzecí slovo - např. "hey Mycroft") na precise engine - funguje mnohem spolehlivěji než samotný pocketsphinx, zejména v hlasitém prostředí. Na videu ještě použit není, to jsem ale nahrával v relativním tichu.

Kód: Vybrat vše

set listener to precise
Informace jsou tu snad všechny, použito Raspberry Pi4 + ReSpeaker Mic Array v2.0 + přes jack připojené dva malé pasivní reproduktorky.

Integrace s HA funguje krásně bez nějakého nastavování na straně HA díky fuzzywuzzy komponentě která se v seznamu entit HA snaží najít nejpodobnější název entity a provést s ní akci.

Možná je Mycroft pro pouhé použití s HA trochu kanón na vrabce, ale díky dalším skillům se s ním dá pokecat - kdo je... za jak dlouho budou... a spousta dalšího.

Topic tématu splněn, ovládám HA česky.
Rozhodně téma neopouštím.
V plánu mám napsat funkční STT přes Azure.
Bing který je k dispozici mi nefunguje, možná pojede pokud bude použit region westus.
Nefunguje mi ani streamovaný Google, tento výchozí si nejdříve poslechne požadavek a pak jej teprve celý pošle. Což znamená odpověď dostanu o nějakou tu sekundu později oproti tomu co by bylo technicky možné.
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Hlasové ovládání HA v češtině STT - řeč na text

Příspěvek od kiklhorn »

Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Odpovědět

Zpět na „Všeobecná diskuse“