Tài liệu kĩ thuật và tích hợp AI M-Speak Dialogue
- Sơ đồ tổng quan các thành phần hệ thống
- Core Dialogue: Chịu trách nhiệm xử lý các logic nghiệp vụ của dialogue, và giao tiếp với các thành phần khác trong hệ thống. Là phương thức để app kết nối thông qua GRPC
- ELS: Logging và monitoring các thông số khi được xử lý
- Triton Serving: Là một service thực hiện inference các model AI phục vụ trong quá trình dialogue xảy ra.
- OpenAI: Third party phục vụ trong mục đích generate phản hồi cho người dùng.
- Postgres: Database chính của Dialogue
- Redis: Caching
- Các modules chính trong Core Dialogue BE
Trong Core BE Dialog gồm có 5 modules chính:
2.1 Manager
- Bao gồm các class tương tác với database thực hiện các thao tác: select, update, insert, delete tương ứng với từng bảng.
-> Toàn bộ được sử dụng thông qua factory_cls.py (Factory design patterns)
Chi tiết các bảng tương ứng các class tuân theo design database bên dưới.
2.2 Modeling
- Gồm các class hỗ trợ suy luận các mô hình AI extend triton_client -> được sử dụng thông qua factory_ai.py
- Các function đã được define sẵn sử dụng với OpenAI.
2.3 Pipeline:
Các pipeline cho dialogue gồm 3 pipeline chính:
- General pipeline: Toàn bộ câu trả lời người dùng sẽ đi qua pipeline này
- Response pipeline: Tuy theo các case người dùng sẽ được điều hướng vào 1 trong 3 pipeline tuỳ theo dạng câu hỏi người dùng đang trả lời là: Yes/No question, Media question hay Openning question.
- Answer pipeline: Generate câu phản hồi cho người dùng cùng với action tiếp theo của người dùng cần thực hiện.
Sử dụng thông qua factory_pipeline.py
2.4 Resouce
- Tập hợp các file bao gồm file config, các file yaml lưu trữ default các logic và câu trả lời mẫu.
- File proto của service
2.5 Grpc_libs:
- Define toàn bộ logic in/out của service khi kết nối với core.
- Thiết kế database
Ý nghĩa các bảng và giải thích các trừơng dữ liệu
3.1 tbl_topic_dialog
Bảng lưu các chủ đề của dialog
Filed | Ý nghĩa |
---|---|
Id | Id record |
topic_name | Tên của topic |
keywords | Các key word phục vụ cho việc search topic nếu cần |
level | Độ khó của topic |
voice | Nhân vật trong dialog sẽ được sử dụng |
created_at | Thời gian tạo |
updated_at | Thời gian lần cuối update |
3.2 tbl_question_dialog
Table câu hỏi của dialogue.
Filed | Ý nghĩa |
---|---|
Id | Id record |
topic_id | Id của topic |
content | Câu hỏi |
answer_format | Câu trả lời mẫu |
keywords | Keywords cho câu hỏi -> phục vụ search |
media_url | Link media nếu là câu hỏi media |
media_type | Loại media của câu hỏi: image, audio, video |
created_at | Thời gian create |
updated_at | Thời gian update |
3.3 tbl_answer_dialog
Câu trả lời của người dùng cho các câu hỏi
Filed | Ý nghĩa |
---|---|
Id | Id record |
question_id | Question id |
content | Text cho câu trả lời |
embedding | Vector embedding của câu trả lời |
note | Note của câu trả lời -> phục vụ cho mở rộng nếu chỉ cần bắt keywords answer |
created_at | Thời gian create |
updated_at | Thời gian update |
3.4 tbl_reply_dialog
Câu phản hồi của bot dành cho các câu trả lời của người dùng
Filed | Ý nghĩa |
---|---|
Id | Id của record |
answer_id | Phản hồi dành cho câu hỏi nào |
content | Câu phản hồi của bot |
audio_path | Audio path câu phản hồi |
created_at | Thời gian create |
updated_at | Thời gian update |
3.5 tbl_default_response
Table bao gồm các câu trả lời mặc định cho các câu hỏi được detect bằng các base rule.
Filed | Ý nghĩa |
---|---|
Id | Id của record |
question_id | Question id |
content | Câu trả lời mặc định |
in_case | Case khi khi được phản hồi tuy chọn cho từng câu hỏi. |
created_at | Thời gian create |
updated_at | Thời gian update |
- Flow chi tiết các Pipeline
HỘI THOẠI MỞ CHỈ SETUP CÂU HỎI
- Logic câu hỏi mở
- Logic câu hỏi media
- Logic câu hỏi Y/N
HỘI THOẠI ĐÓNG CÓ KỊCH BẢN DÀNH CHO VIDEO DIALOGUE
Link: chỉnh sửa
- Logic tích hợp
Service sử dụng GRPC. Proto file bên dưới
syntax = "proto3";
message TopicDialog {
optional int64 id = 1;
string topic_name = 2;
optional string keywords = 3;
int32 level = 4;
string voice = 5;
}
message QuestionDialog {
optional int64 id = 1;
int64 topic_id = 2;
string content = 3;
string answer_format = 4;
int32 type = 5;
optional string keywords = 6;
optional bytes media_file = 7;
int32 media_type = 8;
}
message AnswerDialog {
optional int64 id = 1;
int64 question_id = 2;
string content = 3;
}
message ResponseRequest{
bool status = 1;
string msg = 2;
string error = 3;
optional bytes data = 4;
}
message RequestDelete {
int64 id = 1;
}
message RequestDialog{
string command = 1;
string message = 2;
optional bytes audio = 3;
}
message RequestTopicList {
int32 page = 1;
}
message ResponseTopicList {
repeated string topic_list = 1;
int32 max_page = 2;
int32 page_size = 3;
int32 page_num = 4;
}
service DialogService {
rpc CreateTopicDialog(TopicDialog) returns (ResponseRequest);
rpc EditTopicDialog(TopicDialog) returns (ResponseRequest);
rpc GetTopicDialogById(RequestDelete) returns (ResponseRequest);
rpc DeleteTopicDialogById(RequestDelete) returns (ResponseRequest);
rpc CreateQuestionDialog(QuestionDialog) returns (ResponseRequest);
rpc EditQuestionDialog(QuestionDialog) returns (ResponseRequest);
rpc GetQuestionDialogById(RequestDelete) returns (ResponseRequest);
rpc DeleteQuestionDialogById(RequestDelete) returns (ResponseRequest);
rpc CreateAnswerDialog(AnswerDialog) returns (ResponseRequest);
rpc EditAnswerDialog(AnswerDialog) returns (ResponseRequest);
rpc GetAnswerDialogById(RequestDelete) returns (ResponseRequest);
rpc DeleteAnswerDialogById(RequestDelete) returns (ResponseRequest);
rpc HandleDialogLogic(RequestDialog) returns (RequestDialog);
rpc GetTopicListByPage(RequestTopicList) returns (ResponseTopicList);
}
- Các chức năng chính trong service bao gồm:
UC1: Tạo mới một cuộc hội thoại
UC2: Tạo mới cuộc hội thoại bằng file (updating...)
UC3: Lấy danh sách các cuộc hội thoại
UC4: Điều khiển hội thoại (Answer Comunication Talk)
Để tạo mới một cuộc hội thoại cần chuẩn bị tên của hội thoại -> tương tứng với tên chủ đề.
Mỗi hội thoại bao gồm tập các câu hỏi và câu trả lời khác nhau.
Mỗi câu hỏi chỉ thuộc một trong 3 loại: Yes/No question, Media question, Opening question
Flow tích hợp dialogue
Postman document: Link
Bước 0: Khi người dùng chọn vào topic -> video introduction sẽ được play lên
B1: Khi hết intro video -> app gửi 1 request command start
Bước 2: Sau khi start thì hệ thống xác nhận một cuộc hội thoại mới và trả về một số thông tin
- session: thông tin về phiên làm việc của user, client quan tâm về session_id
- question: thông tin câu hỏi hiện tại của user
- reply: sẽ là câu phản hồi lại câu trả lời của người dùng. Nhưng do start thì câu đầu tiên nên người dùng sẽ chưa trả lời gì, vì vậy nên sẽ là câu hỏi bắt đầu luôn
Bước 3: Người dùng trả lời xong câu hỏi
Bước 4: Lặp lại đến khi hết các câu
Trong session data nếu thấy "is_last": true, có nghĩa đó là câu cuối rồi. Thì sẽ không có câu hỏi nữa. Thì sẽ play video ending về.
WebSocket Client Usage Guide for Speech-Text
This document explains how to use a WebSocket client to send JSON data followed by audio data to a WebSocket server.
Prerequisites
Ensure you have the following prerequisites:
- A WebSocket server running and accessible.
- An audio file in WAV format (sample_rate = 16000, channels = 1)
Steps to Use the WebSocket Client
-
Prepare the Audio File:
- Ensure you have an audio file in WAV format that you want to send to the WebSocket server. (sample rate 16000, channels = 1)
-
Connect to the WebSocket Server:
- Establish a connection to the WebSocket server using the server's URI (Uniform Resource Identifier). The URI typically includes the protocol (ws or wss), the server's address, and the endpoint for the WebSocket connection. For example:
ws://localhost:8000/ws/{device_id}
- Establish a connection to the WebSocket server using the server's URI (Uniform Resource Identifier). The URI typically includes the protocol (ws or wss), the server's address, and the endpoint for the WebSocket connection. For example:
Domain dev: wss://lipsync.monkeyenglish.net/ws/{device_id}
Domain live: wss://videocall.monkeyenglish.net/ws/{device_id}
Note: device_id is a unique string, can use profile Id, or others
-
Send Audio Data:
- Read the audio data from the WAV file and send it as binary data to the WebSocket server. Make sure the audio data is sent after the JSON message.
-
Send JSON Data:
- Send a JSON message containing the context of the speech. The JSON data should have a key named
context
and the value should be the text describing the context. For example:{ "context": "This is a test context for speech-to-text conversion." }
- Ensure the JSON message is sent first before sending the audio data.
- Context is question, topic type or anything to scale scope of audio input -> prefer inserting question
- Send a JSON message containing the context of the speech. The JSON data should have a key named
-
Receive the Response:
- Wait for the WebSocket server to process the data and send a response. The response could be the result of the speech-to-text conversion or any other relevant information.
Example response:
{"text": "They are very beautiful"}
- Wait for the WebSocket server to process the data and send a response. The response could be the result of the speech-to-text conversion or any other relevant information.
-
Handle Disconnection:
- Be prepared to handle disconnections from the WebSocket server gracefully. Ensure that any resources or connections are properly closed.
Example Workflow
- Connect to the WebSocket server at
ws://localhost:8000/ws/{device_id}
. - Send JSON data with the key
context
and a relevant value. - Send audio data from a WAV file.
- Receive and process the server's response.
- Close the connection gracefully.
Notes
- Ensure that the audio data is in the correct format (e.g.,
float32
) before sending it. - If an error occurs during the process, handle it appropriately and attempt to reconnect if necessary.
- The WebSocket server should be configured to handle both JSON and binary data correctly.