Text-to-Speech untuk mainan

Joshua sangat menyukai huruf dan angka. Di usianya sekarang (3 tahun) dia sangat suka alfabet. Dia bisa menyebut nama alfabet dalam bahasa Inggris dan Indonesia, bisa mengingat urutan alfabet  dari depan ke belakang dan sebaliknya, bisa menuliskan semua huruf besar dan kecil. Selain itu Joshua juga suka alfabet Thai, dalam sekitar 2 minggu dia sudah mengingat nama semua 44 konsonan dan cara menuliskannya.

Mainan ini bisa mengucapkan kata-kata tertentu, misalnya APPLE, BALL, dsb

Setelah suka alfabet, Joshua suka belajar membaca dan juga menulis, termasuk juga mengetik di komputer. Dia sangat senang dibelikan mainan tablet alfabet di atas. Mainan di atas disertai beberapa buku, di buku itu ada kata-kata yang bisa “diketikkan”, dan setelah selesai  kata itu akan diucapkan oleh tablet tersebut.

Sayangnya jumlah kata-kata yang tidak banyak dan Joshua sudah bosan dengan semuanya. Kadang dia berusaha mengeja kata tertentu tapi tidak keluar suaranya. Tadinya kepikiran untuk membongkar benda itu dan memodifikasi supaya support lebih banyak kata, tapi sepertinya repot dan akan butuh waktu lama.

Setiap kali dekat saya, Joshua akan minta ikutan ngetik di keyboard saya, dan kadang kalau saya sedang bekerja, saya biarkan dia memakai Pinebook , Raspberry Pi atau Laptop yang kebetulan ada di samping saya sekedar untuk mengetik di editor teks atau LibreOffice. Tiap kali mengetik sesuatu dia akan meminta perhatian saya sambil mengucapkan apa yang baru diketiknya: “papa, APPLE”

Supaya lebih seru, saya buatkan web app kecil  dengan JS dan PHP untuk mengucapkan kata yang baru dia ketik. Pengucapannya memakai fitur dari Google Translate. Tampilannya sangat sederhana: masukkan teks dan tekan enter, suaranya akan keluar. Joshua sudah mengerti memakai backspace untuk menghapus karakter yang sudah diketik.

Sebenarnya aplikasi ini tidak butuh server, bisa langsung tembak ke URL Google translate, tapi saya agak khawatir bisa kena rate limit atau ban temporer, atau bahkan protokolnya berubah sama sekali. Jadi saya buatkan sisi server untuk mengontak Google untuk mengucapkan kata-kata, dan menyimpan ke disk dan berikutnya jika kata yang sama diminta lagi maka akan diambil dari disk. Andaikan Google mengubah URL/protokolnya, nanti bisa diganti dengan Text-to-speech offline atau dari layanan lain.

Tampilan program

Kode program baik untuk sisi server maupun client hanya beberapa baris, tapi cukup menghibur Joshua selama beberapa bulan terakhir ini. 

<html>
<head>
<title>Talk</title>
<script src="jquery-3.3.1.min.js"></script>
</head>
<body>
Say
<form onsubmit="return say();">
<input type="text" style="font-size: 72pt; background: #eeeeee" id="t" size=30 >
</form>
<script>
function say() {
$.getJSON( "talk.php", {"t": t.value}, function( data ) {
new Audio('talkdata/'+encodeURIComponent(data.id)).play()
});
return false;
}
</script>
</body>
</html>
view raw talk.html hosted with ❤ by GitHub

Dan ini kode servernya

<?php
header("Content-type: application/json");
$lang = "en";
$dir = "/var/www/html/talkdata/";
$text = $_GET['t'];
$m = urlencode($text);
$filename = $lang . "-". $m . ".mp3";
$file = $dir.$filename;
if (!file_exists($file)) {
$mp3 = file_get_contents(
'http://translate.google.com/translate_tts?ie=UTF-8&q='. $m .'&tl='. $lang .'&total=1&idx=0&textlen=5&prev=input&client=tw-ob');
file_put_contents($file, $mp3);
}
echo '{"id":"'.$filename.'"}';
?>
view raw talk.php hosted with ❤ by GitHub

Kode singkat tersebut tentunya bisa ditambahi banyak fitur, tapi saat ini masih takut terlalu membingungkan untuk Joshua. Misalnya saya terpikir untuk menambahkan fitur warna pada teks karena dia suka menuliskan nama tokoh Paw Patrol dengan warna yang sama dengan warna pakaian mereka (Marshall merah, Chase biru, dst).

Untuk yang belum tahu: Google sebenarnya punya API text to speech yang resmi, tapi lebih rumit. Untuk sekedar mainan, cara “menembak” URL Google translate sudah cukup, tapi jika ingin dipakai untuk proyek serius, sebaiknya pakailah API-nya yang berbayar. 

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.