Найти тему
IVM

Голосовой набор на Asterisk (FreePBX).

Оглавление

1. Простенький код на языке python3.

У меня была установлена версия python3.6.

  • Файлик с кодом нужно сохранить в директорию:

/var/lib/asterisk/agi-bin/

  • Сам код находится ниже:
#!/usr/bin/python3.6
# -*- coding: utf-8 -*-


from asterisk.agi import AGI
import speech_recognition as sr
from pydub import AudioSegment

def main():
agi = AGI()

# Получаем информацию о входящем вызове
caller_id = agi.get_variable('CALLERID(num)')
agi.verbose(f'Incoming call from {caller_id}', 1)

# Записываем аудио в файл
audio_file = '/tmp/call_audio'
agi.record_file(audio_file, format='wav', beep=1, timeout=2000)
audio_file = '/tmp/call_audio.wav'

# Конвертируем и распознаем аудио
recognize_audio(audio_file, agi)


def recognize_audio(file_path, agi):
# Инициализируем распознаватель
recognizer = sr.Recognizer()

# Загружаем аудиофайл
with sr.AudioFile(file_path) as source:
audio_data = recognizer.record(source)

try:
# Используем Google Web Speech API для распознавания
text = recognizer.recognize_google(audio_data, language='ru-RU')
print(f"Recognized text: {text}")

# Список сотрудников (пример)
employees = {
"петров": "SIP/5073",
"пупкин": "SIP/5076",
}

# Сравниваем распознанный текст с именами сотрудников
found_employee = None
for name, extension in employees.items():
if name in text.lower(): # Сравнение без учета регистра
found_employee = extension
break
with open('/tmp/call_transcript.txt', 'w') as f:
f.write(text + ' !')
if found_employee:
agi.exec_command('Dial', found_employee)
else:
agi.hangup()
with open('/tmp/call_transcript.txt', 'w') as f:
f.write(text + ' !!')
except sr.UnknownValueError:
print("Could not understand audio")
except sr.RequestError as e:
print(f"Could not request results from Google Speech Recognition service; {e}")


if __name__ == "__main__":
main()

Прописываем файлу необходимые права и делаем его исполняемым:

chmod +x agi_script.py
chmod 755 agi_script.py

Ставим необходимые библиотеки:

Ниже список установленных у меня библиотек.

pydub==0.25.1
pydub-ffmpeg-wav==0.23.0
pyst2==0.5.1
SpeechRecognition==3.9.0

2. Прописываем скрипт в диалплан.

В директории /etc/asterisk/ находим файл extensions_custom.conf (Специально существует для безопасного добавления дополнительных настроек. Изначально пустой).

Добавляем туда следующие строки:

exten => 123456,1,Answer()
same => n,AGI(agi_script.py)
same => n, Hangup()

И перезапускаем Asterisk. Теперь при наборе номера "123456" должен прозвучать гудок, после нужно сказать фамилию Петров. Должно перенаправить на внутренний номер 5073. Вместо 123456 может быть что угодно.

Для добавления скрипта в меню IVR я создал "Дополнительное назначение".

Вкладка "Приложения" -> "Дополнительное назначение" в FreePBX.

-2

Далее создал приветствие. "Назовите фамилию сотрудника".

-3

И добавил его в IVR.