Ääni vuorovaikutuskeinona

Viime vuosina äänentunnistusteknologia on kehittynyt huimasti koneoppimis- ja tekoälyteknologian myötä. Mobiililaitteiden suorituskyvyn kasvaessa äänentunnistus on tulllut kiinteäksi osaksi mobiilisovelluksia. Esimerkiksi Android ja iOS-käyttöjärjestelmiin on integroitu äänentunnistus osaksi käyttöliittymää.

Ääni-teksti muunnoksen lisäksi, ääni voi olla mielenkiintoinen tapa ohjata esimerkiksi peliä tai taideinstallaatiota. Esimerkiksi muutaman vuoden takaiseen Flappy Bird -peliin tulee aivan uusi ulottuvuus, jos linnun lentorataa ohjaa vaikkapa huutamalla lujempaa ja hiljempaa.

Tässä kappaleessa käydään läpi, miten lisäät ohjelmaasi ulkopuolisen kirjaston ja miten pääset käsiksi tietokoneen mikrofonin tarjoamaan dataan.

Ulkopuolinen kirjasto

Kun kirjoitat Processing-ohjelmaasi vaikkapa komennon ellipse(0,0,50,50), Processing kutsuu ellipse-metodia alla olevasta Processing core -kirjastosta (voit vilkaista Processing lähdekoodia täältä). Olet koko kurssin ajan käyttänyt apunasi Processing core -kirjastoa. Processingin core -kirjastossa on vain rajattu määrä toiminnallisuuksia, joten usein tiettyä toiminnallisuutta varten tulee asentaa ulkopuolinen kirjasto. Onneksi Processing IDE:ssä on kätevä toiminto tähän tarkoitukseen. Saat valikon auki kohdasta Sketch > Import Library... > Add Library...

Etsi kirjastoa hakusanalla sound ja asenna Sound-niminen kirjasto. Kirjasto asennetaan klikkaamalla Install-painiketta.

Kirjaston dokumentaatio löytyy täältä: https://processing.org/reference/libraries/sound/. Kirjaston avulla voit soittaa, analysoida sekä syntetisoida ääntä. Seuraavan sivun esimerkissä sound-kirjastoa käytetään äänen analysointiin ja rudulle piirrettävien elementtien ohjaamiseen.


Sound-kirjaston käyttö

Sound-kirjastolla voit toistaa, analysoida ja syntetisoida ääntä. Seuraavassa esimerkissä käytät sound-kirjastoa tietokoneen mikrofonin vastaanottaman äänen analysoimiseen. Esimerkissä ohjataan ruudulle piirrettävieä elementtejä analysoidun äänen perusteella.

Jotta pääset käsiksi sound-kirjaston toiminnallisuuksiin, kirjasto tulee lisätä ohjelmaan import-komennolla:

import processing.sound.*;

Yllä olevan komennon merkki "*" lisää kaikki processing.sound paketissa olevat luokat ohjelmaan. Luokkiin ja luokista luotaviin olioihin tutustutaan luvussa 5, mutta nyt voit luottaa siihen, että kaikki sound-kirjaston referenssissä esitellyt toiminnallisuudet ovat käytössäsi.

Seuraavaksi pitäisi päästä käsiksi tietokoneen mikrofoniin. Referenssistä löytyy luokka AudioIn. Dokumentaation referenssistä löytyy avuksi esimerkki.

import processing.sound.*;
AudioIn in;

void setup() {
  size(640, 360);
  background(255);
    
  // Create the Input stream
  in = new AudioIn(this, 0);
  in.start(); // Start the audio stream
}      

void draw() {
}

Koodinpätkä luo AudioIn-tyyppisen muuttujan in, jonka arvoksi asetetaan setup-metodissa new AudioIn(this, 0). new AudioIn(this, 0) luo uuden AudioIn-olion (olioista lisää kappaleessa 5), joka kuuntelee äänilähdettä 0. Jos sinulla on käytössäsi useita sisääntulokanavia äänelle, voit valita lähteen muuttamalla parametria. Nyt sinulla on käytössäsi muuttuja in, jolle voit kutsua referenssistä löytyviä parametreja start(), play(), set(), amp(), add(), pan() ja stop().

Seuraavaksi tarvitset keinon analysoida siisään tulevan äänen voimakkuutta eli amplitudia. Referenssistä löytyy analysis-otsikon alta luokka Amplitude. Referenssin esimerkkien avulla voit muokata ohjelmaa seuraavasti:

import processing.sound.*;
AudioIn in;
Amplitude amp;

void setup() {
  size(640, 360);
  background(255);
    
  // Create an Input stream which is routed into the Amplitude analyzer
  in = new AudioIn(this, 0);
  amp = new Amplitude(this);
  in.start(); // Start the audio stream
  amp.input(in); // Start analysing audio stream
}      

void draw() {
  println(amp.analyze());
}

Lisäsit ohjelman alkuun globaalin Amplitude-tyyppisen muuttujan amp, jonka arvoksi asetetaan setup-metodissa uusi Amplitude-olio. Amp-muuttujalle asetetaan setup-metodissa analysoitava äänilähde input-metodin avulla (amp.input(in)) ja äänenvoimakkuus tulostetaan konsoliin draw-metodissa analyze-metodin avulla. amp.analyze() palauttaa arvon välillä 0-1. Piirrä seuraavaksi draw-metodissa ympyrä, jonka y-koordinaatti määräytyy äänenvoimakkuuden perusteella:

import processing.sound.*;
AudioIn in;
Amplitude amp;

void setup() {
  size(640, 360);
    
  // Create an Input stream which is routed into the Amplitude analyzer
  in = new AudioIn(this, 0);
  amp = new Amplitude(this);
  in.start(); // Start the audio stream
  amp.input(in); // Start analysing audio stream
}      

void draw() {
  background(255);
  float posY = height - amp.analyze() * height;
  ellipse(width/2, posY, 40, 40);
}

Loistavaa! Jos haluat kehittää ohjelmaa edelleen voit esimerkiksi tutkia Processingin esimerkeistä löytyvää BouncingBall-esimerkkiä ja muokata velocity-muuttujan arvon määrittymään äänenvoimakkuuden perusteella.