Build a Voice‑Driven WhatsApp Ticket Booking App with AI, Twilio & .NET
Time to read: 18 minutes
Build a Voice‑Driven WhatsApp Ticket Booking App with AI, Twilio & .NET
Football fans everywhere know the pain of wrestling with clunky websites, endless forms, and hold‑music marathons just to secure match tickets. Especially when you’d rather be planning your chants and kit for the big day. This application flips the script by introducing an AI‑powered agent that lets supporters book and confirm their seats entirely through WhatsApp voice notes: simply record your match details, seat preference, and personal info. The system transcribes your request, checks availability, and instantly emails your confirmation for payment and then returns a digital ticket that's printable. No web forms or phone queues required. By leaning on WhatsApp’s familiar voice messaging (with over 596 million sent daily) and .NET’s robust backend, you can deliver a seamless, multilingual, and accessible experience for all football lovers.
Fun fact: Chelsea FC fans first belted out their unofficial anthem “Blue Is the Colour” in 1972. Now they can book their tickets just as quickly as that chorus goes “Na na na na na na!”
In this tutorial, you’ll build a voice‑driven ticketing agent that:
- Leverages Twilio’s WhatsApp Business API alongside a .NET backend
- Uses AssemblyAI for accurate speech‑to‑text transcription
- Employs OpenAI GPT‑4o to personalize and polish confirmation and booking tickets.
- SendGrid delivers confirmation emails for payment then sends tickets.
Your completed system will turn WhatsApp voice notes into refined text and automatically generate customized ticket‑booking confirmations. Whether you’re streamlining customer support, sending match‑day reminders, or offering multilingual assistance, this solution enhances engagement, accessibility, and operational efficiency.To bring all of these pieces together, the diagram below visualizes how WhatsApp voice notes will flow through your .NET backend, get transcribed by AssemblyAI, enriched by GPT‑4o, and ultimately delivered as personalized email confirmations and generates tickets via SendGrid and Twilio.


Prerequisites
Ensure you have these prerequisites before getting started:
Install the following:
Sign up for required services to obtain the required credentials needed by your application for external services:
- Twilio Free Account (to handle WhatsApp messaging)
- OpenAI Account (GPT-4 for generating personalized booking confirmation and tickets)
- SendGrid Account (for email delivery)
- AssemblyAI (for transcription)
- Ngrok (to expose your local URL for webhooks)
- Basic familiarity with C#.
Once you’ve got all of these in place, you are ready to begin.
Structure Your .NET WhatsApp Ticketing AI Agent Application
To kick off development, you'll start by setting up a clean and modular solution structure. This structure separates the API layer, which handles HTTP requests and external communication, from the core business logic which contains models, services, and interfaces. This ensures your application is maintainable, testable, and ready for future scaling. This structure also makes it easier to swap or upgrade integrations like Twilio, OpenAI, or AssemblyAI without affecting your core logic.
Open Visual Studio Code and run the following commands in your terminal:
This setup:
- Creates a dedicated API project (VoiceToEmail.API) for handling routes and controllers.
- Adds a reusable Core library (VoiceToEmail.Core) for domain models, interfaces, and services.
- To equip your application with essential functionalities, this setup installs packages that enable voice transcription via AssemblyAI, email delivery through SendGrid, messaging capabilities with Twilio, and AI-driven personalization using OpenAI. It also incorporates tools for PDF generation (PdfSharpCore), image processing (ImageSharp), comprehensive API documentation through Swagger (Swashbuckle.AspNetCore), and data persistence using SQLite with Entity Framework Core. Additionally, OpenAPI support is integrated via Microsoft.AspNetCore.OpenApi to facilitate standardized API documentation.
With this foundation in place, you're ready to define your core models and interfaces.
Define Your Core Models
You start by defining the core data structures that capture everything your AI agent needs. That is conversation history, incoming messages, event and booking details, and enriched AI responses. These models form the foundation of our application’s state and data flow. In the VoiceToEmail.Core folder, create a new Models folder and add the file AIAgentResponse.cs. Update it with the code below.
The AIAgentResponse
model encapsulates the AI's response, including the detected language, message priority, category, extracted data, and suggested actions. This structured response allows our application to make informed decisions based on the AI's analysis.
The ConversationContext
model maintains the state of a user's conversation, storing their message history, preferences, and other relevant details. This context is crucial for providing personalized and coherent interactions throughout the user's journey.
Next, create a new file in the same Models folder called EventsModel.cs to define the events model. Update it with the code below:
The EventDetails
model captures the user's request, including the event name, date, fan information, ticket quantity, and any special requirements. The EventInfo
model provides details about the event itself, such as the date, venue, and available seats.
The TicketBookingResult
and BookingDetails
models represent the outcome of a booking attempt, containing information about the success of the booking and the specifics of the reservation.
Add a new file in the same Models folder called VoiceMessage.cs to define the voice message model. Update it with the code below:
The VoiceMessage
model stores information about voice messages received, including the sender and recipient emails, audio URL, transcribed text, and status. The WhatsAppMessage
model captures details of incoming WhatsApp messages, such as the message SID, sender, recipient, message body, and any media attachments.
Finally, create a new file in the Models folder called WhatsAppMessage.cs to define the WhatsApp message model. Update it with the code below:
This will deserialize the incoming WhatsAppMessage, fetch or create the user’s ConversationState, pass the message text into IAIAgentService, and then return TwiML or a reply string. With the models properly defined, proceed to the interfaces.
Define the Core Interfaces
With your data models in place, now it's time to turn your attention to the interfaces that define the contracts for your application's services. These interfaces outline the responsibilities of each component, promoting a clean separation of concerns and facilitating easier testing and maintenance.
Ensuring you are in the VoiceToEmail.Core directory. create an Interfaces folder to add service interfaces. Create a new file and name it IAIAgentService.cs. Update it with the code below.
The IAIAgentService
interface defines methods for processing messages using AI capabilities. It includes functionalities for processing and translating messages, managing conversation context, extracting data points, and deriving event details from messages.
Next, add another interface and name it ITicketService.cs. Update it with the code below.
The ITicketService
interface encapsulates methods related to event ticketing. It includes functionalities for extracting event details from transcriptions, checking ticket availability, booking tickets, and retrieving information about events and available matches.
Now, add another interface and name it ITranscriptionService.cs. Update it with the code below.
The ITranscriptionService
interface defines a method for transcribing audio data into text. This service is crucial for converting voice messages into a format that can be further processed by your AI agent and other components. The IContentService
interface provides a method for enhancing transcribed text. This could involve refining the text for clarity, correcting grammatical errors, or formatting it to suit the intended communication channel, such as email.The IEmailService
interface outlines methods for sending emails. It includes a general-purpose method for sending emails and specialized methods for sending confirmation email and soccer generated tickets, accommodating different types of booking details.
Finally, create the last interface and name it IWhatsAppService.cs. Update it with the code below.
The IWhatsAppService
interface declares a method for handling incoming WhatsApp messages. Implementing this interface allows you to process messages received via WhatsApp, extract relevant information, and initiate appropriate actions within your application.
By establishing these interfaces, you lay a solid foundation for your application's architecture. Each interface represents a distinct service with a clear set of responsibilities, promoting modularity and scalability. In the subsequent sections, you'll delve into the concrete implementations of these interfaces.
Implement the Services
In the Core library you defined what your system knows, the models, and what actions it must support, the interfaces. But a running application needs concrete implementations that:
- Wire up external dependencies (Twilio, HTTP, AI, email).
- Manage per‑user state (in‑memory or durable).
- Coordinate the flow from incoming webhook payloads through AI extraction, ticket booking, and email confirmation to ticket generation.
These services sit in VoiceToEmail.API.Services and implement the core interfaces, turning abstract contracts into testable functionality.
WhatsApp Service
This service will listen for incoming WhatsApp webhook calls, maintain an in‑memory conversation state for each phone number, then decide whether to transcribe audio or parse text. It then invokes AI to extract booking details. Finally, it books tickets and sends confirmation emails to allow tickets to be processed and generated.
In VoiceToEmail.API, create a Services folder and add service implementations. Start off by creating the WhatsAppService.cs file. Copy the code below and paste it in your newly created file.
The WhatsAppService
constructor immediately establishes the external connections and core dependencies that this class needs to function. By accepting an IConfiguration
, it seamlessly pulls in your Twilio credentials and other settings, while the injected ITicketService
, IAIAgentService
, IEmailService
, ITranscriptionService
, and an IHttpClientFactory
give it the ability to book tickets, call your AI layer, send emails, transcribe voice notes, and download media from Twilio. As the constructor body runs, it validates each dependency, throws a clear exception if something’s missing, initializes the Twilio SDK with your account SID and auth token, and sets up HTTP Basic authentication on the HttpClient
so that any attempts to fetch voice recordings succeed without additional plumbing. Finally, a log entry confirms that the service is ready to handle incoming requests.
When a WhatsApp webhook hits HandleIncomingMessageAsync
, the service first looks up or creates a ConversationState
keyed by the sender’s number, ensuring that every user’s booking flow remains isolated. Because this state dictionary is accessed by multiple threads, it’s guarded by a simple lock, allowing requests to safely arrive in parallel without corrupting shared memory. Once the state is retrieved, the method examines flags such as AwaitingConfirmation
, WaitingForEmail
, and WaitingForTicketQuantity
to decide which portion of the booking dialog the user currently resides in. If the user has already been prompted to confirm their reservation, their reply is forwarded to the confirmation handler. If the service is expecting their email address or the number of tickets, the raw text of the message is validated either via a regular expression in the email case or by parsing an integer for ticket quantity. Any validation failures result in a friendly prompt to try again.
In cases where the incoming WhatsApp payload contains media, the service recognizes it as a voice note and downloads it directly from Twilio’s media URL using the pre‑configured HttpClient. Once the audio bytes arrive, the transcription service converts speech to text, and the ticket service attempts to parse event details from that transcription. When the AI‑extracted EventDetails object contains a valid event name, the booking flow continues just as it would for a text‑only message: missing ticket quantities or email addresses trigger further prompts, while fully specified details move on to availability checks and a confirmation prompt.
Throughout this process, every branch logs its key actions, whether it’s creating a new conversation, downloading media, or encountering an error. Try‑catch blocks around the top‑level handler and each helper method ensures that even if something unexpected happens, like a network failure or a null reference, the user hears a polite fallback message instead of a cryptic exception. With this service in place, you’ve bridged the gap between Twilio’s incoming WhatsApp webhooks and your ticket‑booking logic, setting the stage for the next pieces of the puzzle.
Proceed to create the TranscriptionService.cs file.
Transcription Service: Turning Voice Notes into Text
After routing incoming WhatsApp messages through the WhatsAppService
, including any voice notes, now you need a way to convert those audio snippets into plain text your AI agent can understand. That’s where the TranscriptionService
comes in. It interfaces with AssemblyAI’s REST API to upload raw audio bytes, request a transcription, and poll for the completed text packaging everything behind our ITranscriptionService
contract so the rest of the application never has to worry about HTTP details or retry logic. Update TranscriptionService.cs with the code below.
In this implementation, the constructor reads your AssemblyAI API key from configuration, sets up the HttpClient
base address, and attaches the authorization header so every request is authenticated. When TranscribeAudioAsync
is called, the raw audio bytes are wrapped in a ByteArrayContent
with the correct MIME type and uploaded to AssemblyAI’s /upload
endpoint. Upon receiving an upload_url
, the service posts a TranscriptionRequest
to /transcript
to kick off the transcription process. The returned transcription ID is then used to poll the /transcript/{id}
endpoint once per second, waiting until the status flips to `"completed", at which point the transcribed text is returned. Any failures, upload errors, missing fields, timeouts, or API‑reported errors, are logged and thrown. This ensures that higher layers like the WhatsAppService
can handle or relay the error appropriately.
AI Agent Service
With transcription now neatly converted into text, now turn your attention to the AIAgent Service where you’ll process that raw transcript. Proceed to create the AIAgentService.cs file.
The AIAgentService
serves as the central brain, handling all interactions with the OpenAI Chat Completions API while maintaining per-user conversation context. This is all you need to technically implement the brain. Copy and paste the code below.
Upon instantiation, the service configures its HttpClient to target OpenAI’s v1 endpoint and adds the bearer token from configuration. This ensures that every request is authenticated and that JSON payloads are deserialized case‑insensitively and without null fields by default.
When ProcessMessageAsync
is called, the service first retrieves or initializes a ConversationContext
for the given userId, using a thread‑safe lock to prevent race conditions on the in‑memory dictionary. The BuildConversationMessages
helper then constructs the chat history payload by combining a system prompt. This defines the assistant’s role in guiding WhatsApp ticket bookings with the last five user/assistant exchanges and the new user message. This list of messages is wrapped in an anonymous object specifying the "gpt-4-turbo-preview"
(feel free to play with more advanced and latest models) model and tuning parameters such as temperature, max_tokens
, top_p
, frequency_penalty
, and presence_penalty
, which balance creativity and relevance in the AI’s response.
The service then posts this payload to the /chat/completions
endpoint. If the HTTP response indicates an error, it logs the status and response body, throwing an exception so that upstream callers can handle it.
Upon receiving a successful response, the raw JSON is read into a string and deserialized into an OpenAIResponse object using our preconfigured JsonSerializerOptions
. If no choices are returned, the code throws an exception, ensuring you never proceed with an empty AI reply. The selected choice’s message content is then passed, along with the original user input, to the CreateAIResponse
helper.
Inside CreateAIResponse
, the assistant’s reply is enriched by three specialized Chat API calls: DetectLanguage
(which uses a system prompt instructing the model to return only the ISO 639‑1 code), DetermineCategory
(which asks the model to classify the content into event, support, sales, billing, feedback, inquiry, complaint, or general), and GenerateSuggestedActions
(which generates a JSON array of 1–3 verb‑first actions based on the content). Each of these methods constructs its own message array with a tailored system prompt, posts to the same /chat/completions
endpoint, and parses the concise model response, defaulting gracefully on any errors.
After assembling the final AIAgentResponse
containing the assistant’s text, detected language, category, an empty ExtractedData
dictionary, and suggested action. The service updates the user’s ConversationContext
by appending a new ChatMessage
with role "assistant" and the AI response, trimming history to the last ten messages to manage memory. Logging statements capture each major step that is sending requests, handling errors, updating context, providing observability into the end‑to‑end flow from user message to AI response.
By encapsulating all OpenAI interactions, including conversation management, translation, data extraction, and classification. Inside AIAgentService, downstream services like the WhatsApp
handler and TicketService
can simply invoke ProcessMessageAsync
, TranslateMessageAsync
, or ExtractEventDetailsFromMessage
to receive typed, structured outputs without worrying about HTTP protocols, prompt engineering, or JSON serialization details.
Ticket Service: Manage Match Data, Booking Logic, and Confirmation Emails
Next, you’ll turn your attention to the Ticket Service, which takes those extracted event details and actually checks availability, books seats, and returns booking confirmations.
Proceed to create the TicketService.cs file.
The TicketService
encapsulates all match‑related business rules behind the ITicketService
interface: it holds a mock database of upcoming fixtures, reaches out to OpenAI to refine event details when necessary, checks availability, processes a simulated payment, assigns seats, generates a booking reference, and finally leverages the email service to send the user their ticket. Copy and paste the code below in it.
The ticket service begins by defining an in‑memory _matchDatabase
keyed by match names, each entry holding an EventInfo
with date, venue, pricing tiers, and a queue of seat labels. In ExtractEventDetailsAsync
, you reuse our OpenAI pattern: send a system/user
prompt pair to the Chat API to extract only the fields you need into a strict JSON format, then map that JSON via an EventDetailsDto
into your domain EventDetails
. This approach shifts the burden of natural language parsing entirely onto the AI model, letting us focus on clean mapping and fallback defaults.
Next, availability checks and match info retrieval simply query the _matchDatabase
, ensuring that the date matches and seats remain. For booking, you validate the email format, confirm payment (here stubbed out by DummyPaymentService), dequeue a seat label for each ticket, decrement the available count, and compose a BookingDetails
object that includes everything from the generated ticket reference to the total price.
Finally, the service hands off to IEmailService.SendSoccerTicketEmailAsync
, embedding the booking details into an email template. This keeps all the PDF or email attachment logic encapsulated in the email service, so the ticket service remains focused on event rules and booking flow.
Email Service: Send Fully‑Formatted Ticket Confirmations and Generated PDF Tickets
With your ticket booking logic now generating BookingDetails
, the final piece is to deliver those details to your users in a polished email. Complete with embedded HTML content and a PDF ticket attachment. The EmailService
wraps SendGrid’s client behind our IEmailService
interface, handling both simple email sends and the specialized soccer‑ticket emails with generated PDFs. Create the EmailService.cs file, and copy and paste the code below to it.
This service initializes the SendGrid client with your API key and default “from” address. The SendEmailAsync
methods create a basic text‑and‑HTML message, optionally attaching a PDF if provided. The heart of the ticket email flow is SendSoccerTicketEmailAsync
, which first enhances the body HTML with seat numbers and the amount paid, then calls GenerateSoccerTicketPdf
to programmatically draw a stadium‑style ticket using PdfSharpCore
. That PDF is encoded and attached before the final send.
WhatsApp Controller: Receiving and Routing Incoming Webhooks
With email delivery handled, you now have a complete end‑to‑end pipeline: incoming WhatsApp or voice, AI‑driven parsing and context, ticket booking, and richly formatted email notifications. Below the email service, is the HTTP endpoint that ties everything together: the WhatsAppController
.
This controller exposes a simple GET health‑check and a POST webhook that Twilio will call whenever a new WhatsApp message arrives. Its responsibility is to validate and log the incoming form data, translate it into our WhatsAppMessage
model, and then delegate all booking logic back to the IWhatsAppService
.
In the Controllers folder, create a WhatsAppController.cs file and update it with the code below.
Every WhatsApp webhook POST arrives as a URL‑encoded form data containing fields like From, Body, and any MediaUrl{i}
entries. You first log and validate that the essential fields (From and To) are present, then map the form into your WhatsAppMessage
model, including any attached media. The controller then calls into IWhatsAppService.HandleIncomingMessageAsync
, which executes all of our AI, transcription, ticketing, and email logic. Finally, you wrap the string response in TwiML XML so Twilio knows what to send back to the user on WhatsApp.
This controller neatly separates HTTP concerns validation, logging, TwiML formatting from business logic, adhering to the Single Responsibility Principle. With this in place, your Twilio number can forward incoming WhatsApp messages straight to https://<your-domain>/api/WhatsApp
, and every text or voice note will be processed end‑to‑end.
Configure Application
The JSON configuration file defines essential API keys, logging settings, and service credentials required for the VoiceToEmail API to function properly. It provides structured environment settings for external services such as OpenAI, SendGrid, Twilio, and AssemblyAI. Locate the file appsettings.json in your VoiceToEmail.API folder. Update the appsettings.json as shown below. Remember to replace the placeholders with real credential values.
For detailed instructions on obtaining API keys and service credentials (OpenAI, SendGrid, Twilio, and AssemblyAI), please refer to the Prerequisites section.
The OpenAI section contains the ApiKey
, which is used in ContentService
to enhance transcribed text by converting it into a professionally formatted email. The SendGrid section includes an ApiKey
for authentication, along with FromEmail
and FromName
, which define the sender’s email address and display name when sending emails. These settings allow EmailService
to manage email delivery reliably.
For logging, the configuration specifies different logging levels. By default, general logs are set to "Information", ensuring key events are recorded, while ASP.NET Core framework logs are filtered to "Warning" to prevent excessive log noise. This improves monitoring and debugging by focusing on important events.
The Twilio section holds credentials for handling WhatsApp messages, including the AccountSid
and AuthToken
, which authenticate API requests. Additionally, WhatsAppNumber
specifies the Twilio WhatsApp sender number used for messaging, allowing seamless integration with WhatsAppService
. You can use the phone number of a phone that you have access to with WhatsApp installed. If you want instructions on setting up a registered sender for WhatsApp, review the documentation.
The AssemblyAI section contains an ApiKey
required for speech-to-text transcription, enabling TranscriptionService
to process voice messages and convert them into text-based content. This API plays a crucial role in ensuring accurate transcriptions before they are formatted and sent via email.
Finally, the AllowedHosts
setting is configured as *
to permit requests from any domain, which is useful during development. However, in production, this setting may need to be restricted for security reasons.
Next, update the Program.cs with the code below to bundle everything in our application together and bring it to life.
In the Program.cs
file, you set up your application’s service container by registering controllers, third‑party HTTP clients, and your core services. You start by adding MVC controllers and Swagger for API exploration, then call AddHttpClient()
to enable IHttpClientFactory—a recommended pattern for creating and managing HttpClient
instances in .NET Core with built‑in DNS resilience and handler pooling. You also register a typed client for the AIAgentService
, so that its HttpClient
is preconfigured for the OpenAI base address and headers.
Next, each of your application‑specific services - ITranscriptionService, IEmailService, ITicketService, IAIAgentService, and IWhatsAppService - is added to the container with scoped lifetimes, meaning a new instance is created per HTTP request scope. This minimal‑API style setup, introduced in .NET 6 and streamlined further in .NET 9, collapses what used to be split between Startup.cs
and Program.cs
into a single, concise entry point for configuring middleware, DI, and routing.
Finally, app.MapControllers()
wires up attribute‑based controllers, and app.Run() starts the HTTP server. This configuration ensures that all our services, from transcription to email generation, are available via constructor injection wherever they’re needed.
Testing Your Voice Application
To ensure your Voice Driven WhatsApp Ticket Booking backend is running correctly, start by navigating into the VoiceToEmail.API directory, then build and launch the application with the .NET CLI:
This will compile the code and start Kestrel, typically listening on http://localhost:5168.
Feel free to change this port in your launch settings.
Because Twilio requires a public webhook URL for WhatsApp messaging, you can expose your local server using ngrok. If you prefer, you can also deploy your API to a publicly accessible domain, on Azure, AWS, or any other hosting provider. Then you can skip the ngrok setup entirely and point your Twilio WhatsApp webhook directly at your live URL.
Assuming you are choosing the ngrok method for now, spin up your ngrok tunnel with the command below:
In the terminal, it displays both an HTTP and an HTTPS forwarding URL, as shown in the screenshot below.


ngrok automatically provides valid TLS certificates for the HTTPS endpoint, satisfying Twilio’s requirement for secure webhooks.
Once ngrok is running, copy the generated HTTPS URL and navigate to your Twilio Console. Navigate to Messaging → Try it Out → Send A WhatsApp Message, and choose the Sandbox Settings tab. Paste the ngrok URL into the “WHEN A MESSAGE COMES IN” field, appending /api/whatsapp
to match your controller route.


Once your application is successfully linked to the Twilio WhatsApp Sandbox, you can initiate end-to-end testing of the voice-to-booking functionality. Begin by sending a voice note to your designated sandbox number. The system will process this audio message by transcribing its content, extracting the email address, and dispatching a booking confirmation email through SendGrid.
If the initial voice note lacks a clearly discernible email address, you have two options:
- Send another voice note that includes the email address.
- Send a text message containing just the email address.
This ensures that the application captures the necessary information to complete the email delivery process. You can monitor the application's behavior and verify the successful transcription and email dispatch by checking the logs or any provided user interface. Let’s see how the system works. The wait is now over. See the screenshots below.


On sending a voice note with the desired book details, you are then asked to confirm booking with your email address. Remember to try with what exists in your database.


Upon successful booking, you receive an email for confirmation and a link to make payment. Note that the payment link is dummy.


Finally, you receive an email with the generated pdf ticket that you can download and save.


What's Next for Your WhatsApp Voice-to-Email System?
You’ve built a seamless end‑to‑end pipeline that accepts WhatsApp voice notes or texts, uses AI to transcribe and interpret booking requests, checks availability, processes payments via a dummy service, assigns seats, and delivers PDF tickets by email. To evolve this application into a production‑ready platform, consider these next steps:
1. Integrate a Real Payment Gateway
Swap out the DummyPaymentService
for a full‑featured payment provider such as Stripe, PayPal, or Adyen. Using Stripe’s .NET SDK, you can create secure checkout sessions, handle webhooks for payment confirmation, and support multiple payment methods—all while offloading PCI compliance to Stripe.
2. Persist Conversation and Booking Data
Replace in‑memory dictionaries with a durable data store like Azure Cosmos DB or AWS DynamoDB. Cosmos DB’s .NET SDK makes it straightforward to define document models for ConversationContext
and BookingDetails
, query past interactions, and scale globally without sacrificing performance.
3. Add User Authentication & Profiles
Enable customers to register and manage their profiles—saving preferences such as preferred seating or payment methods—and view past bookings. ASP.NET Core Identity with external login providers (Google, Facebook, Microsoft) streamlines OAuth integration, letting users sign in securely and linking their WhatsApp number to a persistent account. Learn more at Microsoft Learn.
Additional Resources for Continued Learning
- AI Agent for Sending Emails Through WhatsApp Voice Notes Using Twilio, Sendgrid, .NET
- Sound Intelligence with Audio Identification and Recognition using Vector Embeddings via Twilio WhatsApp
Jacob Snipes is a seasoned AI Engineer who transforms complex communication challenges into seamless, intelligent solutions. With a strong foundation in full-stack development and a keen eye for innovation, he crafts applications that enhance user experiences and streamline operations. Jacob's work bridges the gap between cutting-edge technology and real-world applications, delivering impactful results across various industries.
Related Posts
Related Resources
Twilio Docs
From APIs to SDKs to sample apps
API reference documentation, SDKs, helper libraries, quickstarts, and tutorials for your language and platform.
Resource Center
The latest ebooks, industry reports, and webinars
Learn from customer engagement experts to improve your own communication.
Ahoy
Twilio's developer community hub
Best practices, code samples, and inspiration to build communications and digital engagement experiences.