Taligenkänning och syntes med Arduino (2 / 4 steg)
Steg 2: Ladda upp koden till Arduino
Nu måste du ladda upp koden nedan till din Arduino. Du kan också hämta den Arduino skissen från länken längst ner på sidan. Innan du överför koden, måste du installera korrekt BitVoicer Server biblioteken i Arduino IDE (Importera .zip bibliotek).
#include < BVSP.h >
#include < BVSMic.h >
#include < BVSSpeaker.h >
#include < DAC.h >
Definierar den Arduino PIN-kod som används för att spela in ljud
#define BVSM_AUDIO_INPUT 7
Definierar de LED stift
#define RED_LED_PIN 6
#define YELLOW_LED_PIN 9
#define GREEN_LED_PIN 10
Definierar de konstanter som ska skickas som parametrar till
funktionen BVSP.begin
CONST osignerade långa STATUS_REQUEST_TIMEOUT = 3000;
CONST osignerade långa STATUS_REQUEST_INTERVAL = 4000;
Definierar storleken på mic audio bufferten
CONST int MIC_BUFFER_SIZE = 64;
Definierar storleken på högtalare audio bufferten
CONST int SPEAKER_BUFFER_SIZE = 128;
Definierar storleken på mottagningsbufferten
CONST int RECEIVE_BUFFER_SIZE = 2;
Initierar en ny global instans av klassen BVSP
BVSP bvsp = BVSP();
Initierar en ny global instans av klassen BVSMic
BVSMic bvsm = BVSMic();
Initierar en ny global instans av klassen BVSSpeaker
BVSSpeaker bvss = BVSSpeaker();
Skapar en buffert som används för att läsa registrerade värden
från klassen BVSMic
byte micBuffer [MIC_BUFFER_SIZE];
Skapar en buffert som används för att skriva ljud prover
i klassen BVSSpeaker
byte speakerBuffer [SPEAKER_BUFFER_SIZE];
Skapar en buffert som används för att läsa kommandon skickas
från BitVoicer Server.
Byte 0 = pin-kod
Byte 1 = pin värde
byte receiveBuffer [RECEIVE_BUFFER_SIZE];
Dessa variabler används till att kontrollera när du vill spela
"LED anteckningar". Dessa anteckningar kommer att spelas tillsammans med
sången strömmas från BitVoicer Server.
bool playLEDNotes = false;
unsigned int playStartTime = 0;
void setup()
{
Ställer in pin lägen
pinMode (RED_LED_PIN, OUTPUT);
pinMode (YELLOW_LED_PIN, OUTPUT);
pinMode (GREEN_LED_PIN, OUTPUT);
Anger starttillståndet för alla lysdioder
digitalWrite (RED_LED_PIN, låg);
digitalWrite (YELLOW_LED_PIN, låg);
digitalWrite (GREEN_LED_PIN, låg);
Börjar seriell kommunikation på 115200 bps
Serial.BEGIN(115200);
Ställer Arduino seriell port som ska användas för
kommunikation, hur lång tid det tar innan en statusbegäran
gånger ut och hur ofta ska status förfrågningar skickas till
BitVoicer Server.
BVSP.BEGIN (serienummer, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL);
Definierar den funktion som kommer att hantera frameReceived
händelse
bvsp.frameReceived = BVSP_frameReceived;
Anger den funktion som kommer att hantera modeChanged
händelse
bvsp.modeChanged = BVSP_modeChanged;
Anger den funktion som kommer att hantera streamReceived
händelse
bvsp.streamReceived = BVSP_streamReceived;
Förbereder BVSMic klassen timer
bvsm.BEGIN();
Anger den DAC som kommer att användas av klassen BVSSpeaker
bvss.BEGIN(DAC);
}
void loop()
{
Kontrollerar om status begäran intervallet har förflutit och om det
har, skickar en statusbegäran till BitVoicer Server
bvsp.keepAlive();
Kontrollerar om det finns data på den seriella port buffert
och bearbetar dess innehåll enligt specifikationerna
för BitVoicer servern protokoll
BVSP.Receive();
Kontrollerar om det finns en SRE. Om sådan finns,
Starta inspelning.
om (bvsp.isSREAvailable())
{
Om klassen BVSMic inte spelar in, ställer in ljud
ingång och startar inspelning
om (! bvsm.isRecording)
{
bvsm.setAudioInput (BVSM_AUDIO_INPUT, standard);
bvsm.startRecording();
}
Kontrollerar om klassen BVSMic har tillgängliga prover
om (bvsm.available)
{
Ser till att de inkommande läge är STREAM_MODE innan
överföring av dataströmmen
om (bvsp.inboundMode == FRAMED_MODE)
bvsp.setInboundMode(STREAM_MODE);
Läser de ljud proverna från klassen BVSMic
int bytesRead = bvsm.read (micBuffer, MIC_BUFFER_SIZE);
Skickar ljudströmmen till BitVoicer Server
bvsp.sendStream (micBuffer, bytesRead);
}
}
annat
{
Det finns ingen SRE. Om klassen BVSMic inspelning,
stannar den.
om (bvsm.isRecording)
bvsm.stopRecording();
}
Spelar alla ljud prover finns i klassen BVSSpeaker
intern buffert. Dessa prover är skrivna i den
BVSP_streamReceived händelsehanterare. När inga prov
finns i interna bufferten, ingenting spelas.
bvss.Play();
Om playLEDNotes har angetts till true,
spelar "LED notes" tillsammans med musiken.
om (playLEDNotes)
playNextLEDNote();
}
Hanterar frameReceived händelsen
void BVSP_frameReceived (byte dataType, int payloadSize)
{
Kontrollerar om den mottagna ram innehåller binära data
0x07 = binära data (bytematris)
om (datatyp == DATA_TYPE_BINARY)
{
Om 2 byte var emot, behandla kommandot.
om (bvsp.getReceivedBytes (receiveBuffer, RECEIVE_BUFFER_SIZE) ==
RECEIVE_BUFFER_SIZE)
{
analogWrite (receiveBuffer [0], receiveBuffer[1]);
}
}
Kontrollerar om den mottagna ram innehåller datatypen byte
0x01 = byte datatyp
annars om (datatyp == DATA_TYPE_BYTE)
{
Om det mottagna bytevärdet 255, anger playLEDNotes
och markerar den aktuella tiden.
om (bvsp.getReceivedByte() == 255)
{
playLEDNotes = sant;
playStartTime = millis();
}
}
}
Hanterar modeChanged händelsen
void BVSP_modeChanged()
{
Om outboundMode (Server--> enhet) har vänt sig till
FRAMED_MODE, ingen ljudströmmen är tänkt att tas emot.
Berättar för klassen BVSSpeaker till slut spela när dess
intern buffert bli tom.
om (bvsp.outboundMode == FRAMED_MODE)
bvss.finishPlaying();
}
Hanterar streamReceived händelsen
void BVSP_streamReceived(int size)
{
Får den mottagna strömmen från klassen BVSP
int bytesRead = bvsp.getReceivedStream (speakerBuffer,
SPEAKER_BUFFER_SIZE);
Enqueues mottagna strömmen att spela
bvss.enqueue (speakerBuffer, bytesRead);
}
Tänds den lämpliga LED-baserade på tiden
kommandot för att börja spela LED anteckningar mottogs.
Timings används här är synkroniserad med musik.
void playNextLEDNote()
{
Blir tiden mellan playStartTime och den
aktuell tid.
osignerade långa förflutit = millis() - playStartTime;
Stänger av alla lysdioder
allLEDsOff();
Sista noteringen har spelats.
Stänger av den sista LED och slutar spela LED toner.
om (förflutit > = 11500)
{
analogWrite (RED_LED_PIN, 0);
playLEDNotes = false;
}
annars om (förflutit > = 9900)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 9370)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 8900)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 8610)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 8230)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 7970)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 7470)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 6760)
analogWrite (GREEN_LED_PIN, 255); E Obs
annars om (förflutit > = 6350)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 5880)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 5560)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 5180)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 4890)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 4420)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 3810)
analogWrite (GREEN_LED_PIN, 255); E Obs
annars om (förflutit > = 3420)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 2930)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 2560)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 2200)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 1930)
analogWrite (YELLOW_LED_PIN, 255); D Obs
annars om (förflutit > = 1470)
analogWrite (RED_LED_PIN, 255); C Obs
annars om (förflutit > = 1000)
analogWrite (GREEN_LED_PIN, 255); E Obs
}
Stänger av alla lysdioder.
void allLEDsOff()
{
analogWrite (RED_LED_PIN, 0);
analogWrite (YELLOW_LED_PIN, 0);
analogWrite (GREEN_LED_PIN, 0);
}
Denna skiss har sju huvuddelar:
- Referenser bibliotek och variabeldeklaration: de fyra första raderna innehåller hänvisningar till den BVSP, BVSMic, BVSSpeaker och DAC biblioteken. Dessa bibliotek kommer från BitSophia och finns i mappen BitVoicer Server installation. DAC biblioteket ingår automatiskt när du lägger till en referens till BVSSpeaker-biblioteket. De övriga raderna deklarera konstanter och variabler som används i hela skissen. Klassen BVSP används för att kommunicera med BitVoicer Server, klassen BVSMic används för att fånga och lagra ljud prover och klassen BVSSpeaker används för att återge ljud med vederbörlig DAC.
- Setup funktion: denna funktion utför följande åtgärder: ställer in pin lägen och deras ursprungliga tillstånd; initierar seriell kommunikation; och initialiserar klasserna BVSP, BVSMic och BVSSpeaker. Det fastställer också "händelsehanterare" (de är faktiskt fungerar pekare) för frameReceived, modeChanged och streamReceived händelserna i BVSP klass.
- Loop funktion: denna funktion utför fem viktiga åtgärder: begär status information till servern (keepAlive() funktion); kontrollerar om servern har skickat några data och bearbetar den mottagna datan (receive() funktion); styr inspelningen och sändning av ljudströmmar (isSREAvailable(), startRecording(), stopRecording() och sendStream() funktioner); spelar de ljud proverna i kö i klassen BVSSpeaker (play() funktion); och samtal i playNextLEDNote() funktion som styr hur lamporna bör blinka efter kommandot playLEDNotes tas emot.
- BVSP_frameReceived funktion: denna funktion kallas varje gång funktionen receive() anger att en komplett ram har mottagits. Här kör jag de kommandon som skickas från BitVoicer Server. Kommandon som styr lysdioderna innehåller 2 byte. Den första byten anger PIN-koden och den andra byten anger pin värdet. Jag använder analogWrite() funktionen för att ange lämpligt värde till PIN-koden. Jag också kontrollera om kommandot playLEDNotes, som är av typen Byte, har mottagits. Om det har tagits emot, sätta jag playLEDNotes till true och markera den aktuella tiden. Denna tid kommer att användas av funktionen playNextLEDNote synkronisera lysdioder med sången.
- BVSP_modeChanged funktion: denna funktion kallas varje gång funktionen receive() identifierar en lägesändring i utgående riktning (Server--> Arduino). WOW! Vad är det?! BitVoicer servern kan skicka inramade data eller ljudströmmar till Arduino. Innan meddelandet går från ett läge till ett annat, skickar BitVoicer servern en signal. Klassen BVSP identifierar denna signal och väcker händelsen modeChanged. I funktionen BVSP_modeChanged om jag upptäcker att meddelandet kommer från Strömläge att inramade läge, vet jag att ljudet är slut så jag kan berätta den BVSSpeaker klassen att sluta spela ljud prover.
- BVSP_streamReceived funktion: denna funktion kallas varje gång funktionen receive() identifierar att ljud prover har tagits emot. Jag bara hämta proverna och köa dem in i BVSSpeaker klassen så funktionen play() kan återge dem.
- playNextLEDNote funktion: denna funktion körs endast om funktionen BVSP_frameReceived identifierar kommandot playLEDNotes. Det kontrollerar och synkroniserar lysdioderna med ljud skickas från BitVoicer Server. Om du vill synkronisera lysdioder med ljud och vet rätt timing, använde jag Sonic Visualizer. Fri programvara får mig att se ljud vågor så jag kunde enkelt säga när ett piano knapptryckningen. Det visar också en tidslinje och det är hur jag fick millisekunder används i denna funktion. Låter som en dum knep och det är. Jag tror det skulle vara möjligt att analysera ljudströmmen och vända på motsvarande LED, men det är min oåtkomligt.