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:
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.py và texttospeech.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é!
Hóng quá anh ơi
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 đỡ
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.
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”)
Dạ, để em sửa lại
Cám ơn Anh
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á
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
Anh làm thêm cách điều khiển nhạc đi Anh
Điền khiển nhạc là sao em? Anh chưa hiểu câu hỏi lắm!
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 ạ
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).
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 ạ
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.
ImportError: cannot import name ‘speechtotext’ from ‘speechtotext’ là bị sao v ad
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
sao không có cách chạy python
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 ạ.
sao em sr.Recognizer() ko dc a
a ơi e muốn xem bài viết xử dụng NLP của a thì tìm ở đâu ạ, em cảm ơn ạ
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 ạ
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
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.
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.
anh hướng dẫn chi tiết modul intent_classification với ạ. Tks anh
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