Home » Smart hjem » Guide: Opret din egen digitale assistent
Guide: Opret din egen digitale assistent

Guide: Opret din egen digitale assistent

Share

I denne guide ser vi på det, der skal til for at lave din egen stemmestyrings-software til dine Raspberry Pi-projekter. Hvis du ønsker dig en virtuel assistent, kan du overveje Jasper-systemet

Dokumentationen på Jaspers website rummer en beskrivelse af den hardware, man skal knytte til sin Raspberry Pi, og her er der også et komplet sæt anvisninger til installation og konfiguration. Der findes en samling af standardmoduler, som muliggør interaktion med forskellige tjenester – du kan bruge modulerne time, Gmail eller sågar joke – og der er også tredjepartsmoduler, som man kan bruge. Der er tilmed et udvikler-API og dokumentation, der hjælper dig med at føje funktionalitet til Jasper.

1 Stemmestyring

Enhver, der har set Iron Man-filmene, har sikkert drømt om at have sit eget kunstig intelligens-system til at parere ordre. Filmenes J.A.R.V.I.S.-computer har enorme mængder af computerkraft, men man kan selv konstruere noget lignende med meget beskedne ressourcer.

Ved hjælp af en Raspberry Pi og programmeringssproget Python kan du lave din egen personlige assistent, som du kan bruge som facade for de enorme supercomputer-ressourcer, du bruger i din hverdag som genial playboy og filantrop. På de følgende sider gennemgår vi det grundlæggende, du har brug for at vide – når du er nået til vejs ende, bør du være i stand til at bygge din egen rudimentære, skræddersyede agent.

>> Det første element i systemets interaktion med mennesker består i at lytte efter verbale kommandoer, således at vi ved, hvad der skal bearbejdes. Der er flere mulige tilgange til denne opgave. For ikke at komplicere sagerne håndterer vi her kun enheder, der er sluttet til en af din Raspberry Pis USB-porte. Med den begrænsning kan man tale direkte med USB-enheden på de laveste niveauer. Det kan være nødvendigt, hvis man prøver at bruge noget usædvanligt til at stå for lytningen, men man er formentlig bedre faren, hvis man bruger noget mere almindeligt. I dette tilfælde kan du bruge Python-modulet PyAudio. PyAudio leverer en Python-wrapper til biblioteker PortAudio, der fungerer på tværs af platforme. Hvis vi antager, at du har noget i retning af Raspbian til din Linux-distribution, kan du nemt installere den nødvendige software med denne kommando:
sudo apt-get install python-pyaudio

>> Hvis du skal bruge den seneste version, kan du altid hente den fra kilden. PyAudio rummer funktionalitet til at indlæse audiodata fra en mikrofon plus evnen til at afspille audiodata til hovedtelefoner eller højttalere. Derfor bruger vi det som vores vigtigste form for interaktion med computeren.

Se også:  De lærende maskiner er over os

>> Det første skridt består i at kunne indlæse nogle audiokommandoer fra de mennesker, der tilfældigvis er i nærheden. Du skal importere PyAudio-modulet, før du kan begynde at interagere med mikrofonen. Arbejdet med PyAudio minder om arbejde med filer, og det burde derfor virke bekendt for de fleste programmører. Du kan begynde med at oprette et nyt PyAudio-objekt med statementet p = pyaudio.PyAudio() . Dernæst kan du åbne en input-stream med funktionen p.open(…) med adskillige parametre. Du kan vælge dataformatet for optagelsen. I vores eksempelkode har vi brugt format=pyaudio.paInt16 . Man kan indstille frekvensen i hertz. For eksempel bruger vi rate=44100 , der er en standard-samplingrate på 44,1 KHz.

Du skal også sige, hvor stor en buffer du vil bruge til optagelsen – vi brugte frames_per_buffer=1024 . Eftersom vi ønsker at optage, skal du bruge input=true . Den sidste parameter står for at vælge antallet af kanaler, der skal optages på. I dette tilfælde bruger vi channels=2 . Nu, da din stream er blevet åbnet, kan du begynde at læse fra den. Du skal indlæse dine audiodata med den samme chunk-størrelse, som du brugte, da du oprettede streamen – den ser ud som stream.read(1024) . Så kan du simpelthen loope og læse, indtil du er færdig. Og så findes der to kommandoer til at lukke input-streamen. Du skal kalde stream.stop_stream() og derefter stream.close() . Hvis du er helt færdig, kan du nu kalde p.terminate() for at lukke for forbindelsen til audioenhederne på din Raspberry Pi.

>> Det næste skridt består i at kunne sende audiooutput, således at J.A.R.V.I.S. også kan tale til dig. Hertil skal du bruge PyAudio, og vi behøver derfor ikke se på et andet Python-modul. For enkelhedens skyld siger vi, at du har en WAV-fil, som du vil afspille. Du kan bruge Python-modulet “wave” til at indlæse den. Igen skal du oprette et PyAudio-objekt og åbne en stream. Parameteren “output” skal være sat til true. Formatet, antallet af kanaler og frekvensen er altsammen information, som er afledt fra de audiodata, der er lagret i din WAV-fil. Når du vil høre din audio, kan du simpelthen loope igennem og læse en mængde data fra WAV-filen ad gangen og skrive den ud til PyAudio-streamen. Når du er færdig, kan du stoppe streamen og lukke den, som du gjorde tidligere.

Se også:  Harman Kardon Citation 300 [TEST]: Gennemført stemmestyret højttaler

>> I begge de to nævnte tilfælde blokerer funktionerne, når du kalder dem, indtil de er færdige. Hvilke muligheder har du så, hvis du vil arbejde, mens du enten optager eller outputter audio? Der findes ikkeblokerings-versioner, der tager en callback-funktion som en ekstra parameter, som hedder stream_callback . Denne callback-funktion tager fire parametre, der hedder in_data , frame_count , time_info og status . Parameteren in_data indeholder den optagede audio, hvis input er true. Callback-funktionen skal returnere en tupel med værdierne out_data og flag — out_data indeholder de data, der skal outputtes, hvis output er true i kaldet til funktionen open.

Hvis inputtet i stedet er true, skal out_data være lig med None. Flager kan være paContinue , paComplete eller paAbort  – med indlysende betydninger. Man skal være opmærksom på, at man ikke kan kalde, læse eller skrive funktioner, når man ønsker at at bruge en callback-funktion. Når streamen er åbnet, kan man simpelthen kalde funktionen stream.start_stream() . Det indleder en separat thread, der håndterer denne stream-bearbejdelse. Man kan bruge stream.is_active() til at tjekke den aktuelle status. Når stream-bearbejdelsen er færdig, kan du kalde stream.stop_stream() for at stoppe den sekundære thread.

stemmestyring: komplet kodeoversigt

# Du skal importere PyAudio-modulet
import pyaudio

# Først skal vi lytte
# Vi skal angive nogle parametre
# Buffer-chunkstørrelse i
CHUNK = 1024
# Audioformatet
FORMAT = pyaudio.paInt16
# Antallet af kanaler, der skal optages på
CHANNELS = 2
# Samplerate, 44,1 KHz
RATE = 44100
# Antallet af sekunder, der skal optages i
RECORD_SECS = 5

# Nu skal vi oprette et PyAudio-objekt
p = pyaudio.PyAudio()

# Vi skal have en stream, vi kan optage fra
stream = p.open(format=FORMAT, channels=CHANNELS,
rate=RATE, input=TRUE, frames_per_buffer=CHUNK)

# Nu kan vi optage ind i en midlertidig buffer
frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECS)):
data = stream.read(CHUNK)
frames.append(data)

# Nu kan vi lukke for det hele
stream.stop_stream()
stream.close()
p.terminate()

# Hvis vi vil spille en wave-fil, skal vi bruge wave-modulet
import wave

# Vi kan åbne det og give det et filnavn
wf = wave.open(“filename.wav”, “rb”)

# Vi skal have et nyt PyAudio-objekt
p = pyaudio.PyAudio()

# Vi åbner en stream med indstillingerne fra wave-filen
stream = p.open(format=p.get_format_from_width(wf.
getsampwidth()),channels=wf.getnchannels(), rate=wf.
getframerate(),output=True)

# Nu kan vi læse fra filen og afspille den
data = wf.readframes(CHUNK)
while data != ‘’:
stream.write(data)
data = wf.readframes(CHUNK)

# Glem ikke at lukke for det hele til sidst
stream.stop_stream()
stream.close()
p.terminate()

TAGS
digital assistent
gør det selv
Raspberry Pi

DEL DENNE
Share

Seneste Tech test
Seneste konkurrencer

Mest populære
Populære
Nyeste
Tags

Find os på de sociale medier

Modtag dagligt IT-nyhedsbrev

Få gratis tech-nyheder i din mail-indbakke alle hverdage. Læs mere om IT-UPDATE her

Find os på FaceBook

Alt om DATA

Lautrupsgade 7,
DK-2100 København Ø
Telefon: 33 91 28 33
redaktion@altomdata.dk

Datatid TechLife

Lautrupsgade 7,
DK-2100 København Ø
Telefon: 33 91 28 33
redaktion@datatid.dk

Audio Media A/S

CVR nr. 16315648,
Lautrupsgade 7,
DK-2100 København Ø
Telefon: 33 91 28 33
info@audio.dk
Annoncesalg / Prislister:
Lars Bo Jensen: lbj@audio.dk Telefon: 40 80 44 53
Annoncer: Medieinformation


Alt om DATA, Datatid TechLife  © 2019
Privatlivspolitik og cookie information - Audio Media A/S