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.
Далее создал приветствие. "Назовите фамилию сотрудника".
И добавил его в IVR.