1. Tổng quan về các bước xây dựng trợ lý ảo tiếng việt

Mình sẽ có một bài phân tích về sự khác nhau giữa chatbot và trợ lý ảo sau nhé! Còn bây giờ cứ xem như nó là một! Chúng ta bắt đầu xây dựng nào!

Để xây dựng một hệ thống trợ lý ảo gồm có 3 bước:

  • Bước thứ nhất: Nhận dạng giọng nói (speech to text) hay nói cách khác là chuyển giọng nói về dạng văn bản.
  • Bước thứ hai: Đưa ra hành động (action) có nghĩa là với văn bản đó thì sẽ đưa ra câu trả lời là gì (đưa ra hành động cho câu hỏi trên).
  • Bước thứ ba: Chuyển văn bản về giọng nói (text to speech). Ngược với bước thứ nhất, sau khi có được câu trả lời bằng văn bản ở bước 2 thì ta cần chuyển về giọng nói.

Xem hình sau để hiểu về cách hoạt động của hệ thống:

xây dựng trợ lý ảo tiếng việt

2. Speech to text

Mục đính bài viết này mình chỉ muốn các bạn viết được một chương trình trợ lý ảo bằng python cho nên mình sẽ không đi sâu vào phần lý thuyết!

Để thực hiện bước này mình sẽ sử dụng thư viện (API) của google là Speech Recognition:

pip install SpeechRecognition

Tiếp theo, để SpeechRecognition xử lý phần Microphone bạn cần cài thêm thư viện pyaudio:

pip install pyaudio

Nếu bước cài pyaudio bị lỗi, bạn vào đây ,nhấn ( ctrl + f ) gõ “pyaudio” để di chuyển đến phần thư viện pyaudio và tải thư viện tương thích với máy của bạn về sau đó cài đặt.

VD: mình tải phiên bản “PyAudio-0.2.11-cp37-cp37m-win_amd64.whl” (Do mình dùng python3.7 và win 64 bit) vào thư mục Download thì tại thư mục Download mở cmd và thực hiện lệnh cài như sau:

pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl

Như vậy đã xong phần cài đặt thư viện cho speech to text, chúng ta bắt đầu code thôi. Tạo một thư mục Trolyao và thêm vào 3 file như sau: speechtotext.py, action.py, texttospeech.py . Mỗi file tương ứng từng phần xử lý.

File speechtotext.py bạn thực hiện cho mình đoạn code sau:

import speech_recognition as sr
import pyaudio
r = sr.Recognizer()
with sr.Microphone() as source:
print("Mời bạn nói: ")
audio = r.listen(source)
try:
text = r.recognize_google(audio,language="vi-VI")
print("Bạn -->: {}".format(text))
except:
print("Xin lỗi! tôi không nhận được voice!")

Lưu ý: language=”vi-VI” là để khai báo Tiếng Việt. Nếu bạn không khai báo thì mặc định sẽ là Tiếng Anh.

Và sau đây là kết quả khi mình chạy file speechtotext.py:

3. Text to speech

Tiếp theo thì mình sẽ viết file texttopeech.py trước, để khi viết file action.py sẽ dễ hiểu hơn. Để chuyển văn bản thành giọng nói thì mình sẽ sử dụng thư viện gTTS cũng của Google:

pip install gTTS

Cài thêm thư viện playsound để phát âm thanh trực tiếp cho python.

pip install playsound

Sau khi cài đặt xong 2 thư viện trên, bạn thực hiện cho mình đoạn code sau vào file texttopeech.py:

from gtts import gTTS
import playsound

text = "Em nhà ở đâu thế" 
output = gTTS(text,lang="vi", slow=False)
output.save("output.mp3")
playsound.playsound('output.mp3', True)

Lưu ý: lang=”vi” để khai báo Tiếng Việt.

Sau đây là kết quả khi chạy file texttopeech.py:

4. Action

Để thuận tiên hơn trước khi viết file action.py thì các bạn chuyển file speechtotext.pytexttospeech.py thành các hàm (function), cụ thể như sau:

Đối với file speechtotext.py thì cần đưa vào hàm không tham số, :trả về text.

import speech_recognition as sr
import pyaudio

def speechtotext():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Mời bạn nói: ")
        audio = r.listen(source)
        try:
            text = r.recognize_google(audio,language="vi-VI")
            print("Bạn -->: {}".format(text))
        except:
            print("Xin lỗi! tôi không nhận được voice!")
    return text

Còn file texttospeech.py thì cần đưa vào hàm nhận tham số là text, không cần trả về:

from gtts import gTTS
import playsound

# text = "tôi có thể giúp gì cho bạn" 
def texttospeech(text):
    output = gTTS(text,lang="vi", slow=False)
    output.save("output.mp3")
    playsound.playsound('output.mp3', True)

Sau khi có 2 hàm trên ta bắt đầu viết file action.py:

from speechtotext import speechtotext
from texttospeech import texttospeech

text = speechtotext()

if (text=="Hello"):
    texttospeech("chào bạn")
elif (text=="Bạn tên gì"):
    texttospeech("tôi là trợ lý ảo quán trà ai")
else:
    texttospeech("xin lỗi tôi chưa thông minh nên không hiểu câu này")

Giải thích về action: nếu người dùng nói “Hello” thì bot sẽ là “chào bạn”. Nếu hỏi “Bạn tên gì” bot sẽ trả lời “tôi là trợ lý ảo quán tra ai”, câu hỏi khác thì nó không biết.

Sau đây là kết quả:

5. Tổng kết:

Trong bài viết trên mình đã hướng dẫn các bạn viết một chương trình một trở lý ảo cơ bản bằng ngôn ngữ Python. Vấn đề của con robot hiện tại:

  • Còn phải nhấn Enter để giao tiếp.
  • Nó chưa hề có gì là thông minh.

Trong bài viết tiếp theo, mình sẽ hướng dẫn các bạn giải quyết các vấn đề trên. Sử dụng kỹ thuật xử lý ngôn ngữ tự nhiên (NLP) và Machine Learning để làm cho con bot của mình thông minh lên nhé!

Cảm ơn các bạn đã xem bài viết của mình! mọi thắc mắc xin để lại bình luận bên dưới!

🤖 Hơn 1 năm rồi mình mới quay lại viết tiếp phần nâng cao 2. Mong các bạn ủng hộ và đăng ký kênh nhé!

26 thoughts on “Xây dựng trợ lý ảo Tiếng Việt bằng ngôn ngữ Python (cơ bản)

  1. Hoàng Tiều says:

    Khi em sử dụng ( while True:) để tiếp tục trò chuyện với trợ lý ảo thì em gặp vấn đề là trợ lý ảo không thể phát giọng nói lần nữa.
    Mong anh giúp đỡ

    • Chủ Quán says:

      Nguyên nhân là do lúc save file mp3. Trong quá trình thực thi lệnh playsound thì file mp3 vẫn còn đang mở, cho nên nó không thể thực hiện việc ghi đè cho lần tiếp theo. Do đó, em cần phải đóng nó lại và cách tốt nhất là nên xóa file mp3 sau mỗi lần chạy. Cách thực hiện là import thư viện os, sau đó remove file mp3 mỗi khi playsound.
      Tham khảo đoạn code anh ở dưới cho dễ hiểu.
       

    • Chủ Quán says:

      from gtts import gTTS
      import playsound
      import os
      # text = “tôi có thể giúp gì cho bạn”
      def texttospeech(text):
      print(“Bot —>:”,text)
      output = gTTS(text,lang=“vi”, slow=False)
      output.save(“output.mp3”)
      playsound.playsound(‘output.mp3’, True)
      os.remove(“output.mp3”)

    • Trần Tiến Đạt says:

      sao e dùng hàm os.remove mà nó vẫn báo Permission denied: vậy a chạy lại lần thứ 2 là nó béo y chang như vậy e thây chạy lần thứ 1 nó ko xoá chạy đến lần thứ 2 lỗi rồi dừng file nó mới xoá
       

    • phi long says:

      anh ơi em sử dụng lệnh os.remove nó nói đc 1 lần lần 2 nói lỗi xong chạy lại nó mới nói lại đc anh có cách nào giúp em với em đã dùng code ở trên rồi mà hok hiệu nghiệm hay là do em sài lệnh lặp

  2. HeiResh says:

    có cách nào Khi mình nói từ j đó như kiểu “bắt đầu” thì nó sẽ khởi động k ạ

    • Chủ Quán says:

      Anh nghĩ đường nào cưng cũng phải nhấn enter chạy chương trình nó mới bắt đầu được.
      Nếu như cưng muốn kiểu như vậy thì có thể làm theo cách này, nhưng nó không tối ưu.
      Nhấn enter cho chạy chương trình, kéo dài thuộc tính timeout (đây thời gian đợi đến khi nhận được giọng nói) vào chỗ “r.listen(source,timeout=30)”.(sau 30s không nhận được giọng nói sẽ thoát).

  3. Nguyễn Thái Bảo says:

    Anh ơi, em bị lỗi Non-ASCII character ‘\xc3’ in file noi.py on line 4
    do dòng 4 của e là tiếng việt. E đang dùng Visual Studio Code. Có cách nào fix nhanh k ạ

    • Chủ Quán says:

      sr cưng. hổm nay a bận buil web bán thiết bị thông minh nên k có trả lời ngay được!
      Thì lỗi này do mặc định encoding python sẽ là ASCII nếu cưng không khai báo utf-8. 
      Cưng có thể sửa bằng cách:
      Cách 1: Để đoạn code # coding=utf-8 đầu file python. (khai báo utf-8 ấy).
      Cách 2: Chỉnh trực tiếp trên Visual Studio Code, nhìn góc dưới bên phải màn hình.
       

  4. Tuấn says:

    Bạn ơi, mình thử file âm thanh ghi âm lại, thì trợ lý ảo nhận ra chỉ được ~10s đầu tiên của cuộc hội thoại,
    Mình dùng r.recognize_google(audio,language=”vi-VI”) cho file ghi âm từ tổng đài dài 1ph, File này convert từ mp3 sang wav mới có thể đưa vào phân tách

  5. Lý Anh Dũng says:

    a ơi, em mắc vấn đề ngay chỗ audio = r.listen(source). Mic bật liên tục, k ngừng ghi âm kể cả khi em k ns j hay có bất kì âm thanh j nữa. sau đó em thêm thuộc tính phrase_time_limit để giới hạn thời gian ghi âm thì mới ok nhưng lại hạn chế câu thoại mình đưa vào ạ.

  6. Lân Nguyễn tài says:

    dạ cho em hỏi e đã cài đặt speech_recognition rồi mà import ra vẫn không được là sao vậy ạ

  7. phi long says:

    anh ơi em sử dụng lệnh os.remove nó nói đc 1 lần lần 2 nói lỗi xong chạy lại nó mới nói lại đc anh có cách nào giúp em với em đã dùng code ở trên rồi mà hok hiệu nghiệm hay là do em sài lệnh lặp

  8. khoa says:

    Mình đã làm theo nhưng bị lỗi:
    Bạn –>: Hello
    Bot –> chào bạn
    Mời bạn nói:…..
    Bạn –>: Hello
    Bot –> chào bạn

    Error 263 for command:
    open output.mp3
    The specified device is not open or is not recognized by MCI.

    Error 263 for command:
    close output.mp3
    The specified device is not open or is not recognized “, line 11, in texttospeech
    playsound.playsound(“output.mp3”, True)
    File “C:\Users\ASUS\AppData\Local\Programs\Python\Python310\lib\site-packages\playsound.py”, line 72, in _playsoundWin
    winCommand(u’open {}’.format(sound))
    File “C:\Users\ASUS\AppData\Local\Programs\Python\Python310\lib\site-packages\playsound.py”, line 64, in winCommand
    raise PlaysoundException(exceptionMessage)playsound.PlaysoundException: Error 263 for command:
    open output.mp3
    The specified device is not open or is not recognized by MCI.

  9. khoa says:

    Bị lỗi lần 2

    Bạn –>: Hello
    Bot –> chào bạn
    Mời bạn nói:…..
    Bạn –>: Hello
    Bot –> chào bạn

    Error 263 for command:
    open output.mp3
    The specified device is not open or is not recognized by MCI.

  10. wayzvn11 says:

    result2:
    { ‘alternative’: [ {‘confidence’: 0.97219545, ‘transcript’: ‘hello hello’},
    {‘transcript’: ‘hello hello hello’},
    {‘transcript’: ‘hello hell’}],
    ‘final’: True}
    you: hello hello
    em chạy thì nó hiện dòng này

Comments are closed.

Contact Me on Zalo