Меня заинтриговали Блэнд и Вапи, и я захотел создать своего собственного помощника по вызову с помощью искусственного интеллекта. Для вызова я решил использовать Twilio. Я попробовал использовать живую модель преобразования речи в текст от AssemblyAI, но для этого мне необходимо предоставить данные моей кредитной карты. Поэтому я попробовал использовать Deepgram. Проблема в том, что ни одно из моих решений до сих пор не работало. Хороших руководств по этой проблеме почти нет, учитывая, что каждая другая модель преобразования речи в текст имеет свое собственное руководство, даже несколько раз.
В последнее время я застрял в очень запутанной ситуации. часть программы. Взгляните на код вместе с выводом терминала.
Вот код из main.py:
import os
import asyncio
from flask import Flask, request, Response
from flask_sock import Sock
import ngrok
from twilio.rest import Client
from twilio.twiml.voice_response import Connect, VoiceResponse, Say, Stream
from dotenv import load_dotenv
load_dotenv()
from twilio_transcriber import TwilioTranscriber
# Flask settings
PORT = 5000
DEBUG = False
INCOMING_CALL_ROUTE = '/'
WEBSOCKET_ROUTE = '/realtime'
# Twilio authentication
account_sid = os.environ['TWILIO_ACCOUNT_SID']
api_key = os.environ['TWILIO_API_KEY_SID']
api_secret = os.environ['TWILIO_API_SECRET']
client = Client(api_key, api_secret, account_sid)
# Twilio phone number to call
TWILIO_NUMBER = os.environ['TWILIO_NUMBER']
# ngrok authentication
ngrok.set_auth_token(os.getenv("NGROK_AUTHTOKEN"))
app = Flask(__name__)
sock = Sock(app)
@app.route(INCOMING_CALL_ROUTE, methods=['GET', 'POST'])
def receive_call():
if request.method == 'POST':
xml = f"""
You will currently be talking to an AI assistant. By continuing this call, you are consenting for the transcript of this call to be anonymously recorded and used for improving our AI calling functions.
""".strip()
return Response(xml, mimetype='text/xml')
else:
return f"This is the calling URL for any incoming number."
@app.route(INCOMING_CALL_ROUTE + "num/", methods=['GET', 'POST'])
def receive_outgoing_call(Number):
if request.method == 'POST':
xml = f"""
You will currently be talking to an AI assistant. By continuing this call, you are consenting for the transcript of this call to be anonymously recorded and used for improving our AI calling functions.
""".strip()
return Response(xml, mimetype='text/xml')
else:
return f"This is the calling URL for {Number}."
@sock.route(WEBSOCKET_ROUTE + "/")
def transcription_websocket(ws, Number):
asyncio.run(handle_websocket(ws, Number))
async def handle_websocket(ws, Number):
transcriber = TwilioTranscriber(ws, Number)
await transcriber.connect()
if __name__ == "__main__":
try:
# Open Ngrok tunnel
listener = ngrok.forward(f"http://localhost:{PORT}")
print(f"Ngrok tunnel opened at {listener.url()} for port {PORT}")
NGROK_URL = listener.url()
# Set ngrok URL to be the webhook for the appropriate Twilio number
twilio_numbers = client.incoming_phone_numbers.list()
twilio_number_sid = [num.sid for num in twilio_numbers if num.phone_number == TWILIO_NUMBER][0]
client.incoming_phone_numbers(twilio_number_sid).update(account_sid, voice_url=f"{NGROK_URL}{INCOMING_CALL_ROUTE}")
call = client.calls.create(
url=NGROK_URL + "/num/+91xxxxxxxxxx",
to='+91xxxxxxxxxx',
from_=TWILIO_NUMBER,
)
print(call.sid)
# run the app
app.run(port=PORT, debug=DEBUG)
finally:
# Always disconnect the ngrok tunnel
ngrok.disconnect()
C:\Users\admin\AppData\Local\Programs\Python\Python312\Lib\site-packages\pydub\utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
Ngrok tunnel opened at https://7018-2405-201-8026-300f-3828-7548-4a2-67a.ngrok-free.app for port 5000
CAca39dfd003f34e29a1d0fef5f89aeb59
* Serving Flask app 'main'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
127.0.0.1 - - [31/May/2024 10:45:02] "POST /num/+919382280814 HTTP/1.1" 200 -
Connecting to Deepgram WebSocket...
Connected to Deepgram WebSocket.
deepgram_sender started
deepgram_receiver started
twilio_receiver started
Если вы думаете, что я вставил неполный вывод терминала, то нет. Он фактически застревает здесь, и я не получаю ответа ни от моего телефонного звонка, ни от терминала.
Меня заинтриговали Блэнд и Вапи, и я захотел создать своего собственного помощника по вызову с помощью искусственного интеллекта. Для вызова я решил использовать Twilio. Я попробовал использовать живую модель преобразования речи в текст от AssemblyAI, но для этого мне необходимо предоставить данные моей кредитной карты. Поэтому я попробовал использовать Deepgram. Проблема в том, что ни одно из моих решений до сих пор не работало. Хороших руководств по этой проблеме почти нет, учитывая, что каждая другая модель преобразования речи в текст имеет свое собственное руководство, даже несколько раз. В последнее время я застрял в очень запутанной ситуации. часть программы. Взгляните на код вместе с выводом терминала. Вот код из main.py: [code]import os import asyncio
from flask import Flask, request, Response from flask_sock import Sock import ngrok from twilio.rest import Client from twilio.twiml.voice_response import Connect, VoiceResponse, Say, Stream from dotenv import load_dotenv load_dotenv()
@app.route(INCOMING_CALL_ROUTE, methods=['GET', 'POST']) def receive_call(): if request.method == 'POST': xml = f"""
You will currently be talking to an AI assistant. By continuing this call, you are consenting for the transcript of this call to be anonymously recorded and used for improving our AI calling functions.
""".strip() return Response(xml, mimetype='text/xml') else: return f"This is the calling URL for any incoming number."
@app.route(INCOMING_CALL_ROUTE + "num/", methods=['GET', 'POST']) def receive_outgoing_call(Number): if request.method == 'POST': xml = f"""
You will currently be talking to an AI assistant. By continuing this call, you are consenting for the transcript of this call to be anonymously recorded and used for improving our AI calling functions.
""".strip() return Response(xml, mimetype='text/xml') else: return f"This is the calling URL for {Number}."
if __name__ == "__main__": try: # Open Ngrok tunnel listener = ngrok.forward(f"http://localhost:{PORT}") print(f"Ngrok tunnel opened at {listener.url()} for port {PORT}") NGROK_URL = listener.url()
# Set ngrok URL to be the webhook for the appropriate Twilio number twilio_numbers = client.incoming_phone_numbers.list() twilio_number_sid = [num.sid for num in twilio_numbers if num.phone_number == TWILIO_NUMBER][0] client.incoming_phone_numbers(twilio_number_sid).update(account_sid, voice_url=f"{NGROK_URL}{INCOMING_CALL_ROUTE}")
# run the app app.run(port=PORT, debug=DEBUG) finally: # Always disconnect the ngrok tunnel ngrok.disconnect() [/code] Вот код из twilio_transcriber.py: [code]import os import json import base64 import asyncio import websockets from dotenv import load_dotenv from pydub import AudioSegment
async for message in self.twilio_ws: print(f'Received message from Twilio: {message}') try: data = json.loads(message) print(f'Parsed JSON data: {data}')
if data['event'] == 'start': start = data['start'] callsid = start['callSid'] self.callsid_queue.put_nowait(callsid) print(f'Received start event for callSid: {callsid}') elif data['event'] == 'connected': print('Received connected event') continue elif data['event'] == 'media': media = data['media'] chunk = base64.b64decode(media['payload']) print(f'Received media chunk: {len(chunk)} bytes')
# The code below is just for demonstration purposes and assumes you have an established websocket connection `twilio_ws` and a phone number `number`. # You would need to replace these with your actual websocket connection and phone number. # Example usage: # transcriber = TwilioTranscriber(twilio_ws, number) # asyncio.run(transcriber.connect()) [/code] Вот вывод терминала: [code]C:\Users\admin\AppData\Local\Programs\Python\Python312\Lib\site-packages\pydub\utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning) Ngrok tunnel opened at https://7018-2405-201-8026-300f-3828-7548-4a2-67a.ngrok-free.app for port 5000 CAca39dfd003f34e29a1d0fef5f89aeb59 * Serving Flask app 'main' * Debug mode: off WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit 127.0.0.1 - - [31/May/2024 10:45:02] "POST /num/+919382280814 HTTP/1.1" 200 - Connecting to Deepgram WebSocket... Connected to Deepgram WebSocket. deepgram_sender started deepgram_receiver started twilio_receiver started [/code] Если вы думаете, что я вставил неполный вывод терминала, то нет. Он фактически застревает здесь, и я не получаю ответа ни от моего телефонного звонка, ни от терминала.
Я работаю над функциональностью, которую можно будет подключить к веб-видеоплееру, в данном случае JW Player, где пользователь выбирает язык, и звук будет обрабатываться с помощью моего специального API перевода 1.) Преобразование речи в текст и 2.)...
Я пытаюсь расшифровать аудиофайл из Twilio с помощью Deepgram API, но при попытке расшифровать аудио возникает ошибка 401 Unauthorized.
Вот мой код:
async def transcribe_audio(audio_url: str) -> dict:
try:
print(f Sending audio to Deepgram for...
Я построил приложение Call-Center с помощью Next.js для Frontend и Fastapi для бэкэнда, интегрированного с Twilio для голосовых вызовов. Основные функции работают: пользователи могут инициировать исходящие вызовы от портала Frontend до любого номера...
Мне нужно распознавание речи, поэтому API речи Java кажется довольно хорошим решением моей проблемы с поиском подходящего API. Я попробовал API Sphinx-4, но не смог найти никаких JAR-файлов в загруженном мной пакете PreAlpha.zip. Я смог найти только...
Я впервые изучаю программируемый голос Twilio и не могу найти, как получить речевой ввод пользователя в виде текста.
TwiML Gather с помощью речевого ввода gather: Gather = Gather(
input= speech ,
action=process_response_url,...