Membuat Aplikasi Voice to Voice Translator dengan Python

Muhammad IhsanMuhammad Ihsan
4 min read

Pengembangan teknologi kecerdasan artifisial khusunya di bidang large language model semakin membuka kesempatan pemanfaatan yang semakin luas. Salah satunya adalah penerjemahan bahasa voice to voice di mana di sini digabungkan voice recognition, language transation, dan teknologi text-to-voice. Cara kerja aplikasi ini adalah mengambil input suara dalam satu bahasa, lalu mentranskripsinya ke teks, kemudian menerjemahkan teks tersebut ke bahasa lain, dan terakhir mengubah teks yang diterjemahkan kembali menjadi suara. Dengan adanya teknologi ini, implikasi yang mungkin didapatkan adalah teratasinya hambatan bahasa sehingga memungkinkan komunikasi real-time di berbagai bahasa.

Dalam artikel ini, kita akan membuat aplikasi translator voice to voice sederhana menggunakan Python. Di sini kita akan menggunakan Gradio untuk interface, AssemblyAI untuk pengenalan suara, pustaka translate untuk penerjemahan teks, dan ElevenLabs untuk konversi teks-ke-suara.

Mempersiapkan Environment

Sebelum memulai, pastikan kita sudah memiliki API key dan pustaka yang diperlukan Buat file .env di folder yang sama dengan projek kemudian simpan API key di file tersebut. Jangan lupa sertakan .env ke .gitignore jika ingin push kode kita ke github. Untuk mendapatkannya, kita terlebih dahulu ElevenLabs dan Assembly AI.

ELEVENLABS_API_KEY=your_elevenlabs_api_key
ASSEMBLYAI_API_KEY=your_assemblyai_api_key

Selanjutnya kita juga perlu menginstall library yang diperlukan:

pip install gradio assemblyai translate elevenlabs python-dotenv

Mengimpor Pustaka dan Memuat Konfigurasi

Pertama, kita mengimpor pustaka yang diperlukan dan memuat kunci API dari file .env.

import uuid
import gradio as gr
import assemblyai as aai
from pathlib import Path
from dotenv import dotenv_values
from translate import Translator
from elevenlabs import VoiceSettings
from elevenlabs.client import ElevenLabs

Interface web menggunakan gradio. Transkripsi audio ke teks menggunakan assemblyai. Translasi teks antar bahasa translate. Konversi teks ke suara menggunakan elevenlabs. Untuk membuat nama file yang unik menggunakan uuid. Penanganan jalur file menggunakan Path. Terakhir dotenv_values digunakan untuk memuat file .env.

Setelah mengimpor semua library yang diperlukan, selanjutnya kita memuat API key dari file .env yang sudah dibuat sebelumnya

config = dotenv_values(".env")

ELEVENLABS_API_KEY = config["ELEVENLABS_API_KEY"]
ASSEMBLYAI_API_KEY = config["ASSEMBLYAI_API_KEY"]

Transkripsi Audio

Kita menggunakan AssemblyAI untuk mentranskripsikan file audio.

def audio_transcription(audio_file):
    aai.settings.api_key = ASSEMBLYAI_API_KEY

    transcriber = aai.Transcriber()
    transcription = transcriber.transcribe(audio_file)

    return transcription

Pertama-tama kita masukkan API key untuk AssemblyAI di aai.settings.api_key. Lalu inisialisasi transcriber dengan aai.Transcriber kemudian mentranskripsikan file audio yang diberikan dengan transcribe.

Translasi Teks

Di fungsi ini kita menerjemahkan teks yang dimasukkan ke bahasa Spanyol, Arab, dan Jepang.

def text_translation(text):
    translator_es = Translator(from_lang="en", to_lang="es")
    es_text = translator_es.translate(text)

    translator_ar = Translator(from_lang="en", to_lang="ar")
    ar_text = translator_ar.translate(text)

    translator_ja = Translator(from_lang="en", to_lang="ja")
    ja_text = translator_ja.translate(text)

    return es_text, ar_text, ja_text

Pertama kita inisiasi penerjemah untuk setiap bahasa target menggunakan Translator. Selanjutnya adalah menggunakan methodtranslate untuk menerjemahkanteks dari bahasa Inggris ke bahasa target.

Teks ke suara

Terakhir kita menggunakan ElevenLabs, untuk mengonversi teks yang diterjemahkan menjadi suara.

def text_to_speech(text: str) -> str:
    client = ElevenLabs(api_key=ELEVENLABS_API_KEY)
    response = client.text_to_speech.convert(
        voice_id="pNInz6obpgDQGcFmaJgB",
        optimize_streaming_latency="0",
        output_format="mp3_22050_32",
        text=text,
        model_id="eleven_multilingual_v2",
        voice_settings=VoiceSettings(
            stability=0.5,
            similarity_boost=0.8,
            style=0.5,
            use_speaker_boost=True,
        ),
    )

    save_file_path = f"{uuid.uuid4()}.mp3"

    with open(save_file_path, "wb") as f:
        for chunk in response:
            if chunk:
                f.write(chunk)

    print(f"{save_file_path}: A new audio file was saved successfully!")

    return save_file_path

Pertama-tama kita inisialisasi variabel client dengan memanggil kelas ElevenLabs. Selanjutnya menggunakan method text_to_speech.convert kita konversikan teks menjadi ucapan dengan parameter yang telah ditentukan.

Fungsi voice_to_voice

Fungsi ini merupakan inti dari project kita. Fungsi ini akan mentranskripsikan audio input, menerjemahkannya ke sejumlah bahasa, dan mengubah terjemahan kembali menjadi audio.

def voice_to_voice(audio_file):
    transcription_response = audio_transcription(audio_file)

    if transcription_response.status == aai.TranscriptStatus.error:
        raise gr.Error(transcription_response.error)
    else:
        text = transcription_response.text

    es_translation, ar_translation, ja_translation = text_translation(text)

    es_audio_path = text_to_speech(es_translation)
    ar_audio_path = text_to_speech(ar_translation)
    ja_audio_path = text_to_speech(ja_translation)

    es_path = Path(es_audio_path)
    ar_path = Path(ar_audio_path)
    ja_path = Path(ja_audio_path)

    return es_path, ar_path, ja_path

Fungsi voice_to_voice menerima file audio sebagai parameter dan di dalamnya terjadi seluruh proses transkripsi, penerjemahan, dan konversi teks-ke-suara. Variabel transcription_response digunakan untuk menampung respons dari fungsi transkripsi. Transkripsi audio yang didapatkan kemudian diterjemahkan juga dalam bentuk teks ke bahasa Spanyol, Arab, dan Jepang. Setelah teks dalam bahasa tujuan didapatkan baru kemudian hasil terjemahan dikonversi kembali ke dalam bentuk suara.

Membuat Interface Pengguna

Untuk projek ini, kita menggunakan gradio untuk membuat interface sederhana yang mudah digunakan. Di sini pengguna dapat memasukkan audio melalui mikrofon mereka, dan mendapatkan output berupa audio yang diterjemahkan.

audio_input = gr.Audio(
    sources=["microphone"],
    type="filepath"
)

demo = gr.Interface(
    fn=voice_to_voice,
    inputs=audio_input,
    outputs=[gr.Audio(label="Spanish"), gr.Audio(label="Arabic"), gr.Audio(label="Japanese")],
    title="Voice-to-Voice Translator",
    description="Voice-to-Voice",
)

if __name__ == "__main__":
    demo.launch()

Pertama kita definisikan sumber input audio dengan gr.Audio. Kemudian dengan gr.Interface, kita buat antarmuka Gradio dengan input dan output yang ditentukan.

Kesimpulan

Pada artikel ini, kita sudah belajar cara membuat aplikasi sederhana penerjemah voice to voice menggunakan Python dan API dari ElevenLabs dan AssemblyAI. Dengan menggabungkan teknologi transkripsi, penerjemahan, dan teks-ke-ucapan, kita dapat menciptakan aplikasi yang menjembatani hambatan bahasa dan meningkatkan komunikasi secara global.

Masih banyak yang bisa kita kembangkan dari projek ini. Seperti penambahan bahasa dan antarmuka pengguna yang lebih intuitif. Terima kasih sudah membaca artikel ini. Semoga sukses dan selamat belajar.


Referensi : Assembly AI Youtube

Source code: Github

1
Subscribe to my newsletter

Read articles from Muhammad Ihsan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Muhammad Ihsan
Muhammad Ihsan

AI, ML and DL Enthusiast. https://www.upwork.com/freelancers/emhaihsan https://github.com/emhaihsan https://linkedin.com/in/emhaihsan