Mười vạn câu hỏi vì sao-Phần 1

Tình cờ hôm cuối tuần lên công ty, mình có gặp một chị dẫn hai con nhỏ lên công ty vừa trông trẻ vừa làm việc. Chị kể: hai đứa nhỏ quậy lắm, vừa nghịch vừa liên tục hỏi mẹ những câu hỏi vì sao. Và chị phải dọa là: Mẹ sẽ bị trừ lương nếu các con hỏi nhiều ở trên công ty của mẹ.

Quả thực trẻ nhỏ có rất nhiều câu hỏi mong được giải đáp, nhưng không phải lúc nào các bậc phụ huynh cũng có đủ thời gian để trả lời các bé. Vậy nếu có một món đồ chơi có thể giải đáp mọi thắc mắc của trẻ nhỏ trong lúc ba mẹ đang bận thì thật tuyệt. Vậy ta thử làm xem sao 😄

Tưởng tượng trong đầu

Mục tiêu

Sản phẩm ra sẽ có hình dáng con thú nhồi bông nhỏ, có khả năng giải đáp các câu hỏi vì sao của trẻ nhỏ. Chắc hình dáng sản phẩm sẽ kiểu như thế này 😄

Định hình bài toán

Về cơ bản, mình sẽ chia bài toán thành 3 phần:

  • Ghi nhận câu hỏi của bé
  • Phân tích thông tin câu hỏi và đưa ra nội dung cần trả lời
  • Trả lời cho bé bằng một giọng nói dễ thương

Chuẩn bị phần cứng:

  • 1 Board Raspberry Pi 3: Raspberry Pi là một máy tính nhúng có kích thước khá nhỏ gọn, chạy hệ điều hành nhân linux. Trong ứng dụng của mình, chiếc Raspberry Pi này sẽ đóng vai trò là bộ xử lý thông tin câu hỏi và đưa ra tín hiệu trả lời. Lí do mình chọn Raspberry Pi vì nó có kích thước nhỏ gọn, cấu hình tốt và 1 điều quan trọng nữa là nó có giá thành phù hợp với ví tiền của mình (ahihi).

  • 1 Micro thu âm: Chắc chắn rồi, để hiểu được giọng nói của bé, thì ta cần phải thu được âm trước đã 😄

  • 1 chiếc loa để phát ra âm thanh câu trả lời.

  • Các phụ kiện: Thẻ nhớ, nguồn, bộ chia mic-audio, wifi...

    Connect chúng lại ta được hệ thống đơn giản như sau:

Chuẩn bị phần mềm:

  1. Mô hình chuyển đổi speech to text tiếng việt: Các câu hỏi của bé sẽ được micro thu lại và tiền xử lí, sau đó dữ liệu sẽ đi qua mô hình chuyển đổi speech to text để thu được câu hỏi dưới dạng văn bản. Trước đây mình có thử thực hiện ứng dụng chuyển đổi speech to text nhưng độ chính xác chưa cao nên phần này mình sẽ sử dụng api của google để thực hiện này.

  2. Phân tích câu hỏi và đưa ra câu trả lời: Mình có 2 phương án giải quyết như sau:

  • Tìm kiếm trong một danh sách câu hỏi và trả lời tương ứng.
  • Áp dụng machine learning để học cách trả lời câu hỏi. Nếu thực hiện theo phương án này, mình dự định xây dựng mô hình seq2seq. Mô hình seq2seq sinh ra đầu tiên cho ứng dụng dịch máy nhưng sau này mô hình được ứng dụng cho chatbot và mang lại hiệu quả bất ngờ.
  1. Mô hình chuyển đổi text to speech: Phần này có vai trò xuất ra file audio nội dung cần trả lời. Phần xây dựng mô hình có lẽ mình sẽ nhờ đến sự trợ giúp của ông Toằn Vi Lốc. Chắc nhiều bạn đã biết về bài chia sẻ Ứng dụng đọc chuyện ma của ổng. Bạn nào muốn tìm hiểu về bài viết này có thể đọc tại đây nhé: https://viblo.asia/p/ong-toan-vi-loc-ung-dung-deep-learning-tu-dong-sinh-ra-series-audio-truyen-ma-sieu-to-khong-lo-bJzKmwqkl9N

Thực hành

Cài đặt Google Speech API trên Rasberry Pi

Google Speech API v2 cho 50 truy vấn mỗi ngày, con số này hơi ít nhưng méo mó có hơn không các bạn ạ.

Thông tin OS version trên con Pi của mình:

PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Download gói package pyaudio (hỗ trợ python):

git clone http://people.csail.mit.edu/hubert/git/pyaudio.git

Cài đặt pyaudio:

cd pyaudio
sudo python setup.py install

Cài đặt một số package audio:

sudo apt-get installl libportaudio-dev
sudo apt-get install python-dev
sudo apt-get install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev

Cài đặt package Google Speech API cho python:

sudo pip3 install SpeechRecognition

OK, chúng ta test thử thôi: Tạo file test.py và thêm đoạn code sau:

#!/usr/bin/env python3
# Requires PyAudio and PySpeech.

import speech_recognition as sr

# Bắt đầu ghi âm
r = sr.Recognizer()
with sr.Microphone() as source:
    print("Say something!")
    audio = r.listen(source)

# Chuyển đổi Speech to text
try:
    print("You said: " + r.recognize_google(audio, language="vi-VN")) # các bạn nhớ setup language ở dòng này
except sr.UnknownValueError:
    print("Google Speech Recognition could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Google Speech Recognition service; {0}".format(e))

Tạm thời thiết bị của mình đã có thể thu âm, và nhận dạng tiếng việt. Do mình chưa chuẩn bị được nhiều nên xin kết thúc phần 1 tại đây. Trong thời gian tới, mình sẽ vừa làm vừa chia sẻ lại kết quả (kể cả các kết quả false ), hi vọng sẽ tạo ra được sản phẩm vui vui.

Nội dung phần 2:

  • Bổ xung vấn đề nhận diện giọng nói
  • Bài toán Seq2Seq sinh văn bản tự động cho 10 vạn câu hỏi vì sao

Lời kết

Vì vừa làm vừa chia sẻ nên nội dung còn nhiều sai sót, rất mong các bạn góp ý để mình có thể hoàn thiện đến sản phẩm cuối. Cảm ơn mọi người đã đọc bài!