Suatu hari ketika saya scanning frekuensi maritim (150Mhz-170Mhz) menggunakan RTL-SDR yang beberapa bulan ini sedang saya gandrungi, terdengar sayup-sayup suara operator yang membacakan laporan cuaca di wilayah syahbandar pelabuhan tanjung perak Surabaya. Suaranya begitu "kurang bersemangat", mungkin karena dia sadar data cuaca untuk kapal shiping line, sudah lengkap dan mudah didapatkan melalui internet atau radar mereka, jadi operator ini hanya menjalankan tugas rutinitas yang harus dia lakukan sesuai perintah instansi.
Tahukah kamu, di belahan bumi Amerika utara terdapat stasiun radio amateur WWV yang bekerja pada 2,5Mhz, 5Mhz, 10 Mhz, 15 Mhz dan 20Mhz, dimana secara berkala akan memberikan informasi waktu yang akurat berdasarkan jam atom. Yang berbicara di radio adalah suara mesin/komputer. Sempat juga saya melihat youtuber asal kanada yg scanning radio di dekat pelabuhan, laporan cuaca nya dibacakan juga oleh komputer, seperti halnya suara google map ketika kita berkendara dan menggunakan panduan arah.
Lalu teringat lah saya pada suatu kejadian letusan gunung merapi dan gunung agung beberapa tahun yg lalu, dimana laporan kegempaan seismik ditautkan pada sebuah frekuensi radio amatir VHF dengan tone yang berayun jika ada guncangan / letusan di puncak. Dan di wilayah rural seperti pegunungan, radio amatir / HT menjadi sarana komunikasi handalan. Jadi penggunaan radio HT untuk pengiriman data serta warning lumayan masih diperlukan.
Lalu bagaiman sih caranya menggantikan operator manusia menjadi suara text to speech (TTS) layaknya suara google ? Ayo saya share caranya... Pertama-tama tentunya kamu butuh memiliki sepasang radio HT / Walkie Talkie untuk melakukan experimen ini. Dan saya pilihkan merek baofeng yang sedang laris manis digunakan satpam dimana-mana.
Saya akan menggunakan mikrocontroller ESP8266 - Wemos yang berfungsi sebagai :
- Pembaca Sensor Suhu LM35
- Penerjemah pembacaan suhu menjadi urutan file mp3
- Pemutar audio mp3
- Pemutus - sambung transmit PTT (Push To Talk) sesuai kebutuhan
Dengan komponen beserta rangkaian secara lengkap seperti ini :
Lalu pertanyaannya apakah ESP8266 dapat memutar file audio langsung tanpa memerlukan player lainnya semacan DF player ? Ooooo itu sudah lama saya tau, dengan memanfaatkan I2S dari generasi ESP8266 atau ESP32 maka memutar file audio sangatlah mudah. Silahkan meluncur ke : https://github.com/earlephilhower/ESP8266Audio untuk belajar bagaimana cara memutar beberapa jenis file audio secara langsung, tanpa atau dengan DAC.
Untuk melakukan generate audio robot, maka gunakan layanan TTS (text to speech) yang versi bahasa Indonesia secara gratis dapat di googling seperti BOTIKA. Kalau punya teman atau saudara yg suaranya renyah dapat juga direkam beberapa file pembacaan angka "satu", "dua", "sebelas" dan lainnya. Seperti contoh yang saya buat dan letakkan di folder /data dibawah directory project arduino saya.
Sedangkan script lengkap yang bisa kalian coba, saya bagikan secara FREE alias GRATEEESS
/* Pengubah pembacaan Suhu LM35 ke suara dan dikirim via HT Baofeng
www.aisi555.com 08155737755 nyoman yudi kurniawan 2024
Pada IDE gunakan mode clock ESP8266 160MHz, serta mode SPIFFS sebesar 1MB atau lebih
Pelajari cara "Tools->ESP8266/ESP32 Sketch Data Upload" untuk menyimpan MP3 di SPIFFS
Baca disini : https://randomnerdtutorials.com/install-esp8266-filesystem-uploader-arduino-ide/
File mp3 simpan di folder /data pada direktori sketch arduino, dengan nama file berikut
rekam sendiri di HP/PC atau gunakan layanan text to speech untuk membuat tiap file
0.mp3
1.mp3
2.mp3
3.mp3
4.mp3
5.mp3
6.mp3
7.mp3
8.mp3
9.mp3
10.mp3 ==> sepuluh
11.mp3 ==> sebelas
1_1.mp3 ==> belas
p.mp3 ==> puluh
d.mp3 ==> derajat
k.mp3 ==> koma
s.mp3 ==> ucapan pertama /salam
Selanjutnya bisa baca di www.aisi555.com
Gunakan secara gratis dan bertanggung jawab
semua aturan penggunaan frekuensi radio amatir mengacu pada ORARI/RAPI/KEMKOMINFO/BALMON
*/
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"
//sesuaikan pin PTT
#define ptt 5
#define lm35 A0
int16_t suhu = 337;
uint8_t proses = 0;
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
void setup()
{
pinMode(ptt, OUTPUT);
digitalWrite(ptt, LOW);
WiFi.mode(WIFI_OFF);
Serial.begin(115200);
delay(1000);
SPIFFS.begin();
Serial.println("======= www.aisi555.com ========");
Serial.println(" kirim Suhu LM 35 ke HT yukkkkk");
Serial.println("================================");
audioLogger = &Serial;
//baca suhu LM35 di A0, Vin = 3.3 volt
int16_t analogValue = analogRead(lm35);
suhu = analogValue * (3300/1024);
Serial.println(analogValue);
Serial.print("Suhu : ");
Serial.println(suhu);
//awal mulai pertama
proses=1;
//kirim PTT dan kirim suara ke HT
digitalWrite(ptt, HIGH);
delay(500);
file = new AudioFileSourceSPIFFS("/s.mp3");
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}
void tts(int16_t angka) //disini proses memilih angka jadi file mp3
{
uint8_t pilih;
if (proses == 2) {
pilih = angka/100;
if ( angka <200 && angka >=120 ) pilih = (angka /10) % 10;
else if (angka <120 && angka >=110) pilih =11;
else if (angka <110 && angka >=100) pilih =10;
else if (angka <100 && angka >=0) pilih = angka /10;
}
else if (proses == 4){
pilih = (angka /10) % 10;
if (pilih == 0) return;
if (angka <200 && angka >=0) return;
}
else if (proses == 6) pilih = angka % 10;
switch (pilih) {
case 0 : file = new AudioFileSourceSPIFFS("/0.mp3");
break;
case 1 : file = new AudioFileSourceSPIFFS("/1.mp3");
break;
case 2 : file = new AudioFileSourceSPIFFS("/2.mp3");
break;
case 3 : file = new AudioFileSourceSPIFFS("/3.mp3");
break;
case 4 : file = new AudioFileSourceSPIFFS("/4.mp3");
break;
case 5 : file = new AudioFileSourceSPIFFS("/5.mp3");
break;
case 6 : file = new AudioFileSourceSPIFFS("/6.mp3");
break;
case 7 : file = new AudioFileSourceSPIFFS("/7.mp3");
break;
case 8 : file = new AudioFileSourceSPIFFS("/8.mp3");
break;
case 9 : file = new AudioFileSourceSPIFFS("/9.mp3");
break;
case 10 : file = new AudioFileSourceSPIFFS("/10.mp3");
break;
case 11 : file = new AudioFileSourceSPIFFS("/11.mp3");
break;
}
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}
void loop()
{
if (mp3->isRunning()) {
if (!mp3->loop()) mp3->stop();
} else {
if(proses == 7){
proses =1;
Serial.printf("MP3 play selesai\n");
//matikan PTT
digitalWrite(ptt, LOW);
delay(5000);
//ulang reset ESP agar fresh terus
ESP.reset();
}
else if ( proses == 1){ //puluhan
proses=2;
tts(suhu);
}
else if ( proses == 2){ //puluh, belas atau lewat
proses=3;
if( suhu <200 && suhu >=120 ) file = new AudioFileSourceSPIFFS("/1_1.mp3");
else if( suhu <120 && suhu >=0 ) file = new AudioFileSourceSPIFFS(NULL);
else file = new AudioFileSourceSPIFFS("/p.mp3");
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}
else if ( proses == 3){ //satuan
proses=4;
tts(suhu);
}
else if ( proses == 4){ // koma
proses=5;
file = new AudioFileSourceSPIFFS("/k.mp3");
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}
else if ( proses == 5){ //desimal
proses=6;
tts(suhu);
}
else if ( proses == 6){ //derajat
proses=7;
file = new AudioFileSourceSPIFFS("/d.mp3");
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
mp3->begin(file, out);
}
}
}
Dan jika kalian sukses dan beruntung (karena setiap kali compile hasilnya bisa error mulu, jadi kesabaran adalah kunci), akan kira-kira seperti video dibawah ini :