Дворниченко Михайло

Blog

Як швидко створити сервіс мультимовної транскрибації аудіо для IP-телефонії

В корпоративній IP-телефонії виклики переводяться на автовідповідач, де абонент залишає повідомлення. Аудіоповідомлення має бути перетворене в текст і відправлене на електронну пошту разом з аудіофайлом. Ситуація типова, але як автоматично зробити транскрибацію, коли абоненти  говорять різними мовами? Раніше це була проблема і потрібно було проводити абонента через надокучливий IVR з типовими фразами “Для української мови натисніть “1”… “, а зараз це всеробить потужна нейромережа від OpenAI.

Рішення:
Для якісної мультимовної транскрибації використовуємо аудіомодель Whisper-1

Алгоритм дій:

  1. Розробляємо REST API сервіс, який отримуватиме POST-запит із номером телефону абонента та посиланням на запис розмови.
  2. Далі цей файл передаємо в OpenAI та отримуємо транскрибацію.
  3. Отриманий текст відправляємо на електронну пошту разом із файлом аудіозапису.

Нижче наведено спрощений код для пояснення процесу:

import os
import requests
from flask import Flask, request, jsonify
import openai
from pydub import AudioSegment
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

from email.mime.base import MIMEBase
from email import encoders
import logging

app = Flask(__name__)

openai.api_key = os.getenv("OPENAI_API_KEY")

UPLOAD_FOLDER = 'uploads'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

logging.basicConfig(level=logging.DEBUG)

@app.route('/transcribe', methods=['POST'])

#Transcribation
def transcribe_audio():
    data = request.get_json()

    if not data or not data.get('recordingUrl') or not data.get('callerNumber'):
        return jsonify({'error': 'Missing recording URL or callerNumber'}), 400

    recording_url, caller_number = data['recordingUrl'], data['callerNumber']
    file_path = os.path.join(UPLOAD_FOLDER, "audio.wav")

    try:
        # Upload file
        print(recording_url)
        response = requests.get(recording_url)
        if response.status_code == 200:
            with open(file_path, 'wb') as f:
                f.write(response.content)
        else:
            return jsonify({'error': 'Failed to download recording'}), 500

        with open(file_path, 'rb') as audio_file:
            transcription = openai.Audio.transcribe(model="whisper-1", file=audio_file)['text']

    except Exception as e:
        return jsonify({'error': f'Error during processing: {str(e)}'}), 500
    print(transcription)
    send_email(transcription, caller_number, file_path)
    return jsonify({'message': 'Transcription completed', 'transcription': transcription}), 200

def send_email(transcription_text, caller_number, attachment_path):
    msg = MIMEMultipart()
    msg['From'] = "info@sender.com"
    msg['To'] = ", ".join(["mail@mydomain.com"])
    msg['Subject'] = f"Incoming Voicemail from {caller_number}"
    msg.attach(MIMEText(f"Phone number: {caller_number}\n\nText: {transcription_text}", 'plain'))
    with open(attachment_path, 'rb') as attachment:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(attachment.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', f'attachment; filename={os.path.basename(attachment_path)}')
        msg.attach(part)

    try:
        server = smtplib.SMTP_SSL('sender.com', 465)
        server.login("info@sender.com", "password")
        server.sendmail(msg['From'], msg['To'].split(", "), msg.as_string())
        server.quit()
    except Exception as e:
        logging.error(f"Failed to send email: {e}")

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9810, debug=True)

Code language: Python (python)

Перевірку будемо робити на двох різномовних файлах (англійська та іспанська) 

Відправляємо POST запит та отримуємо відповідь

Також отримуємо email повідомлення з телефоном, текстом транскрибації та аудіо-файлом

Повторюємо запит для іспанської версії файлу

Це все, що потрібно для сворення швидкого сервісу. Сподіваюсь інформація була корисною!