Nhận diện giọng nói python
Mục lục bài viết:
Show
Bạn đã bao giờ tự hỏi làm thế nào để thêm nhận dạng giọng nói vào dự án Python của mình? Nếu vậy, sau đó tiếp tục đọc! Nó dễ dàng hơn bạn nghĩ. Không còn là một thứ lỗi mốt, sự thành công vượt bậc của các sản phẩm hỗ trợ giọng nói như Amazon Alexa đã chứng minh rằng hỗ trợ giọng nói ở một mức độ nào đó sẽ là một khía cạnh thiết yếu của công nghệ gia dụng trong tương lai gần. Nếu bạn nghĩ về nó, lý do tại sao là khá rõ ràng. Việc kết hợp tính năng nhận dạng giọng nói vào ứng dụng Python của bạn mang lại mức độ tương tác và khả năng truy cập mà ít công nghệ nào có thể sánh kịp. Chỉ riêng các cải tiến về khả năng tiếp cận cũng đáng được xem xét Nhận dạng giọng nói cho phép người già và người khiếm thị tương tác với các sản phẩm và dịch vụ hiện đại một cách nhanh chóng và tự nhiên — không cần GUI! Hơn hết, bao gồm cả nhận dạng giọng nói trong một dự án Python thực sự đơn giản. Trong hướng dẫn này, bạn sẽ tìm hiểu cách thực hiện. Bạn sẽ học:
Cuối cùng, bạn sẽ áp dụng những gì bạn đã học được vào trò chơi “Đoán từ” đơn giản và xem tất cả kết hợp với nhau như thế nào. Cách hoạt động của tính năng Nhận dạng giọng nói - Tổng quanTrước khi chúng ta đi đến thực tế của việc thực hiện nhận dạng giọng nói bằng Python, hãy dành một chút thời gian để nói về cách hoạt động của nhận dạng giọng nói. Một cuộc thảo luận đầy đủ sẽ lấp đầy một cuốn sách, vì vậy tôi sẽ không cung cấp cho bạn tất cả các chi tiết kỹ thuật ở đây. Trên thực tế, phần này không bắt buộc đối với phần còn lại của hướng dẫn. Nếu bạn muốn đi thẳng vào vấn đề, vui lòng bỏ qua. Nhận dạng giọng nói bắt nguồn từ nghiên cứu được thực hiện tại Bell Labs vào đầu những năm 1950. Các hệ thống ban đầu chỉ giới hạn ở một người nói duy nhất và có lượng từ vựng giới hạn khoảng một chục từ. Các hệ thống nhận dạng giọng nói hiện đại đã có một chặng đường dài kể từ những hệ thống cổ xưa của chúng. Họ có thể nhận dạng bài phát biểu từ nhiều người nói và có vốn từ vựng khổng lồ bằng nhiều ngôn ngữ. Tất nhiên, thành phần đầu tiên của nhận dạng giọng nói là giọng nói. Lời nói phải được chuyển đổi từ âm thanh vật lý sang tín hiệu điện bằng micrô, sau đó sang dữ liệu kỹ thuật số bằng bộ chuyển đổi tương tự sang kỹ thuật số. Sau khi được số hóa, một số mô hình có thể được sử dụng để chuyển âm thanh thành văn bản. Hầu hết các hệ thống nhận dạng giọng nói hiện đại dựa trên cái được gọi là Mô hình Markov ẩn (HMM). Cách tiếp cận này hoạt động dựa trên giả định rằng một tín hiệu giọng nói, khi được xem trên một khoảng thời gian đủ ngắn (ví dụ, mười mili giây), có thể gần đúng một cách hợp lý như một quá trình tĩnh — nghĩa là một quá trình trong đó các thuộc tính thống kê không thay đổi theo thời gian. Trong HMM điển hình, tín hiệu lời nói được chia thành các đoạn dài 10 mili giây. Phổ công suất của mỗi đoạn, về cơ bản là một đồ thị công suất của tín hiệu như một hàm của tần số, được ánh xạ tới một vectơ của các số thực được gọi là hệ số cepstral . Thứ nguyên của vectơ này thường nhỏ — đôi khi thấp nhất là 10, mặc dù các hệ thống chính xác hơn có thể có thứ nguyên 32 trở lên. Đầu ra cuối cùng của HMM là một chuỗi các vectơ này. Để giải mã lời nói thành văn bản, các nhóm vectơ được đối sánh với một hoặc nhiều âm vị —một đơn vị cơ bản của lời nói. Việc tính toán này đòi hỏi phải được đào tạo, vì âm thanh của một âm vị thay đổi từ người nói này sang người nói khác, và thậm chí thay đổi từ cách phát âm này sang cách phát âm khác của cùng một người nói. Một thuật toán đặc biệt sau đó được áp dụng để xác định từ (hoặc các từ) có nhiều khả năng nhất tạo ra chuỗi âm vị nhất định. Người ta có thể tưởng tượng rằng toàn bộ quá trình này có thể tốn kém về mặt tính toán. Trong nhiều hệ thống nhận dạng giọng nói hiện đại, mạng nơ-ron được sử dụng để đơn giản hóa tín hiệu giọng nói bằng cách sử dụng các kỹ thuật chuyển đổi đặc trưng và giảm kích thước trước khi nhận dạng HMM. Bộ phát hiện hoạt động giọng nói (VAD) cũng được sử dụng để giảm tín hiệu âm thanh xuống chỉ những phần có khả năng chứa giọng nói. Điều này ngăn bộ nhận dạng mất thời gian phân tích các phần không cần thiết của tín hiệu. May mắn thay, là một lập trình viên Python, bạn không phải lo lắng về bất kỳ điều gì trong số này. Một số dịch vụ nhận dạng giọng nói có sẵn để sử dụng trực tuyến thông qua API và nhiều dịch vụ trong số này cung cấp các SDK Python . Chọn gói nhận dạng giọng nói PythonCó một số ít các gói để nhận dạng giọng nói trên PyPI. Một vài trong số chúng bao gồm:
Một số gói này — chẳng hạn như wit và apiai — cung cấp các tính năng tích hợp sẵn, như xử lý ngôn ngữ tự nhiên để xác định ý định của người nói, vượt ra ngoài nhận dạng giọng nói cơ bản. Những người khác, như google-cloud-speech, chỉ tập trung vào chuyển đổi giọng nói thành văn bản. Có một gói nổi bật về tính dễ sử dụng: SpeechRecognition. Nhận dạng giọng nói yêu cầu đầu vào âm thanh và SpeechRecognition giúp việc truy xuất đầu vào này thực sự dễ dàng. Thay vì phải xây dựng các tập lệnh để truy cập micrô và xử lý các tệp âm thanh từ đầu, SpeechRecognition sẽ giúp bạn thiết lập và chạy chỉ trong vài phút. Thư viện SpeechRecognition hoạt động như một trình bao bọc cho một số API giọng nói phổ biến và do đó cực kỳ linh hoạt. Một trong số này — API Web Speech của Google — hỗ trợ khóa API mặc định được mã hóa cứng vào thư viện SpeechRecognition. Điều đó có nghĩa là bạn có thể xuống chân mà không cần phải đăng ký dịch vụ. Tính linh hoạt và dễ sử dụng của gói SpeechRecognition khiến nó trở thành lựa chọn tuyệt vời cho bất kỳ dự án Python nào. Tuy nhiên, không đảm bảo hỗ trợ cho mọi tính năng của mỗi API mà nó kết thúc. Bạn sẽ cần dành một chút thời gian nghiên cứu các tùy chọn có sẵn để tìm hiểu xem liệu SpeechRecognition có hoạt động trong trường hợp cụ thể của bạn hay không. Vì vậy, bây giờ bạn đã được thuyết phục rằng bạn nên thử SpeechRecognition, bước tiếp theo là cài đặt nó trong môi trường của bạn. Cài đặt SpeechRecognitionSpeechRecognition tương thích với Python 2.6, 2.7 và 3.3+, nhưng yêu cầu một số bước cài đặt bổ sung cho Python 2 . Đối với hướng dẫn này, tôi sẽ giả sử bạn đang sử dụng Python 3.3+. Bạn có thể cài đặt SpeechRecognition từ một thiết bị đầu cuối bằng pip:
Sau khi cài đặt, bạn nên xác minh cài đặt bằng cách mở phiên thông dịch và nhập: >>>
Lưu ý: Số phiên bản bạn nhận được có thể khác nhau. Phiên bản 3.8.1 là phiên bản mới nhất tại thời điểm viết bài. Hãy tiếp tục và giữ cho phiên này mở. Bạn sẽ bắt đầu làm việc với nó chỉ trong giây lát. SpeechRecognition sẽ hoạt động hiệu quả nếu tất cả những gì bạn cần làm là hoạt động với các tệp âm thanh hiện có. Tuy nhiên, các trường hợp sử dụng cụ thể yêu cầu một số phụ thuộc. Đáng chú ý, gói PyAudio là cần thiết để thu đầu vào micrô. Bạn sẽ thấy những phụ thuộc nào bạn cần khi đọc thêm. Bây giờ, hãy đi sâu vào và khám phá những điều cơ bản của gói. các RecognizerLớpTất cả điều kỳ diệu trong SpeechRecognition xảy ra
với Tất nhiên, mục đích chính của một Tạo một >>>
Mỗi
Trong số bảy, chỉ Phần thảo luận đầy đủ về các tính năng và lợi ích của mỗi API nằm ngoài phạm vi của hướng dẫn này. Vì SpeechRecognition đi kèm với khóa API mặc định cho Google Web Speech API, bạn có thể bắt đầu với nó ngay lập tức. Vì lý do này, chúng tôi sẽ sử dụng API Web Speech trong hướng dẫn này. Sáu API khác đều yêu cầu xác thực bằng khóa API hoặc kết hợp tên người dùng / mật khẩu. Để biết thêm thông tin, hãy tham khảo tài liệu SpeechRecognition . Thận trọng: Khóa mặc định do SpeechRecognition cung cấp chỉ dành cho mục đích thử nghiệm và Google có thể thu hồi khóa này bất kỳ lúc nào . Không phải là một ý kiến hay khi sử dụng Google Web Speech API trong quá trình sản xuất. Ngay cả với một khóa API hợp lệ, bạn sẽ chỉ bị giới hạn ở 50 yêu cầu mỗi ngày và không có cách nào để tăng hạn ngạch này . May mắn thay, giao diện của SpeechRecognition gần như giống hệt nhau cho mỗi API, vì vậy những gì bạn học hôm nay sẽ dễ dàng chuyển sang một dự án trong thế giới thực. Mỗi Ok, đủ trò chuyện. Hãy làm bẩn bàn tay của chúng ta. Hãy tiếp tục và cố gắng gọi >>>
Chuyện gì đã xảy ra? Bạn có thể nhận được một cái gì đó giống như sau:
Bạn có thể đoán điều này sẽ xảy ra. Làm thế nào có thể nhận ra thứ gì đó từ hư không Tất cả bảy Có hai cách để tạo Làm việc với tệp âm thanhTrước khi tiếp tục, bạn cần tải xuống tệp âm thanh. Bạn có thể tìm thấy cái mà tôi đã sử dụng để bắt đầu, “harvard.wav” ở đây . Đảm bảo bạn lưu nó vào cùng một thư mục mà phiên thông dịch Python của bạn đang chạy. SpeechRecognition giúp làm việc với các
tệp âm thanh dễ dàng nhờ Các loại tệp được hỗ trợHiện tại, SpeechRecognition hỗ trợ các định dạng tệp sau:
Nếu bạn
đang làm việc trên Linux, macOS hoặc Windows dựa trên x-86, bạn sẽ có thể làm việc với các tệp FLAC mà không gặp sự cố. Trên các nền tảng khác, bạn sẽ cần cài đặt bộ mã hóa FLAC và đảm bảo bạn có quyền truy cập vào Sử dụng record()để chụp dữ liệu từ tệpNhập thông tin sau vào phiên thông dịch của bạn để xử lý nội dung của tệp “harvard.wav”: >>>
Trình quản lý ngữ cảnh mở tệp và đọc nội dung của nó, lưu trữ dữ liệu trong một >>>
Bây giờ bạn có thể gọi >>>
Xin chúc mừng! Bạn vừa sao chép tệp âm thanh đầu tiên của mình! Nếu bạn đang tự hỏi các cụm từ trong tệp “harvard.wav” đến từ đâu, chúng là ví dụ về Câu Harvard. Những cụm từ này đã được IEEE xuất bản vào năm 1965 để sử dụng trong kiểm tra độ rõ giọng nói của các đường dây điện thoại. Chúng vẫn được sử dụng trong VoIP và thử nghiệm di động ngày nay. Harvard Sentences bao gồm 72 danh sách mười cụm từ. Bạn có thể tìm thấy các bản ghi âm có sẵn miễn phí của những cụm từ này trên trang web của Open Speech Repository . Bản ghi âm có sẵn bằng tiếng Anh, tiếng Quan Thoại, tiếng Pháp và tiếng Hindi. Họ cung cấp một nguồn tài liệu miễn phí tuyệt vời để kiểm tra mã của bạn. Chụp phân đoạn với offsetvàdurationĐiều gì sẽ xảy ra nếu bạn chỉ muốn ghi lại một phần của bài phát biểu trong một tệp tin? Các Ví dụ: phần sau ghi lại bất kỳ bài phát biểu nào trong bốn giây đầu tiên của tệp: >>>
Các >>>
Lưu ý rằng Ngoài việc chỉ định thời lượng ghi, Để chỉ ghi lại cụm từ thứ hai trong tệp, bạn có thể bắt đầu với khoảng chênh lệch là bốn giây và ghi lại, chẳng hạn, ba giây. >>>
Các đối số >>>
Khi bắt đầu ghi ở 4,7 giây, bạn bỏ lỡ phần “it t” ở đầu cụm từ “cần nhiệt để tạo ra mùi”, vì vậy API chỉ nhận được “akes heat”, nó khớp với “Mesquite. ” Tương tự, ở cuối đoạn ghi âm, bạn bắt được “a co”, là phần mở đầu của cụm từ thứ ba “ngâm mình trong nước lạnh phục hồi sức khỏe và niềm say mê”. Điều này được đối sánh với “Aiko” bởi API. Có một lý do khác khiến bạn có thể nhận được phiên âm không chính xác. Tiếng ồn! Các ví dụ trên hoạt động tốt vì tệp âm thanh khá sạch. Trong thế giới thực, trừ khi bạn có cơ hội xử lý các tệp âm thanh trước đó, bạn không thể mong đợi âm thanh không bị nhiễu. Ảnh hưởng của tiếng ồn đối với nhận dạng giọng nóiTiếng ồn là một thực tế của cuộc sống. Tất cả các bản ghi âm đều có tiếng ồn ở một mức độ nào đó và tiếng ồn không được xử lý có thể phá hỏng độ chính xác của các ứng dụng nhận dạng giọng nói. Để biết tiếng ồn có thể ảnh hưởng đến nhận dạng giọng nói như thế nào, hãy tải xuống tệp “jackhammer.wav” tại đây . Như mọi khi, hãy đảm bảo rằng bạn lưu nó vào thư mục làm việc của phiên thông dịch viên của bạn. Tệp này có cụm từ “mùi hôi của bia cũ còn sót lại” được nói với một chiếc búa khoan lớn ở phía sau. Điều gì xảy ra khi bạn cố gắng phiên âm tệp này?
>>>
Đường tắt! Vì vậy, làm thế nào để bạn đối phó với điều này? Một điều bạn có thể thử là sử dụng >>>
Điều đó giúp bạn gần hơn một chút với cụm từ thực tế, nhưng nó vẫn chưa hoàn hảo. Ngoài ra, “the” bị thiếu ở đầu cụm từ. Tại sao vậy? Các Bạn có thể điều chỉnh khung thời gian >>>
Chà, bạn có “the” ở đầu cụm từ, nhưng bây giờ bạn có một số vấn đề mới! Đôi khi không thể loại bỏ ảnh hưởng của nhiễu — tín hiệu quá ồn để được xử lý thành công. Đó là trường hợp của tệp này. Nếu bạn thường xuyên gặp phải những vấn đề này, bạn có thể phải sử dụng đến một số xử lý trước âm thanh. Điều này có thể được thực hiện bằng phần mềm chỉnh sửa âm thanh hoặc gói Python (chẳng hạn như SciPy ) có thể áp dụng bộ lọc cho tệp. Phần thảo luận chi tiết về vấn đề này nằm ngoài phạm vi của hướng dẫn này — hãy xem cuốn sách Think DSP của Allen Downey nếu bạn quan tâm. Hiện tại, chỉ cần lưu ý rằng tiếng ồn xung quanh trong tệp âm thanh có thể gây ra sự cố và phải được giải quyết để tối đa hóa độ chính xác của nhận dạng giọng nói. Khi làm việc với các tệp ồn ào, có thể hữu ích khi xem phản hồi API thực tế. Hầu hết các API trả về một chuỗi JSON chứa nhiều phiên âm có thể có. Các Bạn có thể làm điều này bằng cách đặt >>>
Như bạn có thể thấy, Bây giờ, bạn đã có một ý tưởng khá tốt về những điều cơ bản của gói
SpeechRecognition. Bạn đã thấy cách tạo một Bây giờ cho phần thú vị. Hãy chuyển từ phiên âm các tệp âm thanh tĩnh sang làm cho dự án của bạn trở nên tương tác bằng cách chấp nhận đầu vào từ micrô. Làm việc với micrôĐể truy cập micrô của bạn bằng SpeechRecognizer, bạn sẽ phải cài đặt gói PyAudio . Hãy tiếp tục và đóng phiên thông dịch hiện tại của bạn, và hãy làm điều đó. Cài đặt PyAudioQuá trình cài đặt PyAudio sẽ khác nhau tùy thuộc vào hệ điều hành của bạn. Debian LinuxNếu bạn đang sử dụng Linux dựa trên Debian (như Ubuntu),
bạn có thể cài đặt PyAudio với
Sau khi cài đặt, bạn vẫn có thể cần chạy hệ điều hành MacĐối với macOS, trước tiên bạn cần cài đặt PortAudio với Homebrew, sau đó cài đặt PyAudio với
các cửa sổTrên
Windows, bạn có thể cài đặt PyAudio với Kiểm tra cài đặtSau khi cài đặt xong PyAudio, bạn có thể kiểm tra cài đặt từ bảng điều khiển.
Đảm bảo rằng micrô mặc định của bạn được bật và tắt tiếng. Nếu quá trình cài đặt hoạt động, bạn sẽ thấy một cái gì đó như sau:
Hãy tiếp tục và thử nghiệm nó một chút bằng cách nói vào micrô của bạn và xem SpeechRecognition phiên âm bài phát biểu của bạn tốt như thế nào. Lưu ý: Nếu bạn đang sử dụng Ubuntu và nhận được một số đầu ra thú vị như 'ALSA lib… PCM không xác định', hãy tham khảo trang này để biết các mẹo về cách chặn các thông báo này. Đầu ra này đến từ gói ALSA được cài đặt với Ubuntu — không phải SpeechRecognition hoặc PyAudio. Trên thực tế, những thông báo này có thể chỉ ra sự cố với cấu hình ALSA của bạn, nhưng theo kinh nghiệm của tôi, chúng không ảnh hưởng đến chức năng của mã của bạn. Chúng hầu hết là một mối phiền toái. các MicrophoneLớpMở một phiên thông dịch khác và tạo một phiên bản của lớp trình nhận dạng. >>>
Bây giờ, thay vì sử dụng tệp âm thanh làm nguồn, bạn sẽ sử dụng micrô hệ thống mặc định. Bạn có thể truy cập
điều này bằng cách tạo một thể hiện của >>>
Nếu hệ thống của bạn không có micrô mặc định (chẳng hạn như trên Raspberry Pi ) hoặc bạn muốn sử dụng micrô khác với micrô mặc định, bạn sẽ cần chỉ định micrô sẽ sử dụng bằng
cách cung cấp chỉ mục thiết bị. Bạn có thể lấy danh sách tên micrô bằng cách gọi >>>
Lưu ý rằng đầu ra của bạn có thể khác với ví dụ trên. Chỉ mục thiết bị của micrô là chỉ mục tên của micrô trong danh sách được trả về >>>
Tuy nhiên, đối với hầu hết các dự án, có thể bạn sẽ muốn sử dụng micrô hệ thống mặc định. Sử dụng listen()để chụp đầu vào micrôBây giờ bạn đã có một Cũng giống như >>>
Sau khi bạn thực hiện >>>
Nếu lời nhắc không bao giờ quay trở lại, rất có thể micrô của bạn đang nhận quá nhiều tiếng ồn xung quanh. Bạn có thể làm gián đoạn quá trình bằng + ctrl + c ++ để lấy lại lời nhắc. Để xử lý tiếng ồn xung quanh, bạn sẽ cần sử dụng >>>
Sau khi chạy mã trên, hãy đợi một giây Nhớ lại rằng Tài liệu SpeechRecognition khuyến nghị sử dụng thời lượng không dưới 0,5 giây. Trong một số trường hợp, bạn có thể thấy rằng thời lượng dài hơn mặc định là một giây tạo ra kết quả tốt hơn. Giá trị tối thiểu bạn cần tùy thuộc vào môi trường xung quanh của micrô. Thật không may, thông tin này thường không được biết trong quá trình phát triển. Theo kinh nghiệm của tôi, thời lượng mặc định là một giây là đủ cho hầu hết các ứng dụng. Xử lý giọng nói không thể nhận dạngHãy thử nhập ví dụ mã trước đó vào bộ ngắt âm thanh và tạo ra một số tiếng ồn khó hiểu vào micrô. Bạn sẽ nhận được một cái gì đó như thế này để phản hồi:
Âm thanh mà API không thể khớp với văn bản sẽ tạo ra một Lưu ý : Bạn có thể phải cố gắng nhiều hơn mong đợi để có được ngoại lệ. API hoạt động rất chăm chỉ để phiên âm bất kỳ âm thanh nào. Ngay cả những tiếng càu nhàu ngắn cũng được phiên âm thành những từ như "làm thế nào" đối với tôi. Ho, tiếng vỗ tay và tiếng tặc lưỡi sẽ liên tục làm tăng ngoại lệ. Kết hợp tất cả lại với nhau: Trò chơi “Đoán từ”Bây giờ bạn đã thấy những kiến thức cơ bản về nhận dạng giọng nói với gói SpeechRecognition, hãy sử dụng kiến thức mới học của bạn và viết một trò chơi nhỏ chọn một từ ngẫu nhiên từ danh sách và cho người dùng ba lần thử đoán từ đó. Đây là toàn bộ kịch bản:
Hãy phá vỡ điều đó một chút. Các Trước tiên, hàm sẽ kiểm tra xem các đối
số
Sau đó,
Các Tiếp
theo,
Bạn có thể kiểm tra >>>
Bản thân trò chơi khá đơn giản. Đầu tiên, một danh sách các từ, số lượng đoán được phép tối đa và giới hạn nhanh chóng được khai báo:
Tiếp theo, một
Sau khi in một số hướng dẫn và đợi trong 3 ba giây, một Nếu
Khi
Nếu không có bất kỳ lỗi nào, bản phiên âm sẽ được so sánh với từ được chọn ngẫu nhiên. Các Nếu đoán đúng, người dùng thắng và trò chơi kết thúc. Nếu người dùng không chính xác và vẫn còn bất kỳ lần thử nào,
Khi chạy, đầu ra sẽ giống như sau:
Tóm tắt và bổ sung tài nguyênTrong hướng dẫn này, bạn đã biết cách cài đặt gói SpeechRecognition và sử dụng Bạn đã thấy ảnh hưởng của tiếng ồn có thể có đối với độ chính xác của các phiên âm và đã học cách điều chỉnh Nhận dạng giọng nói là một chủ đề sâu sắc và những gì bạn đã học ở đây hầu như không làm nổi bề mặt. Nếu bạn muốn tìm hiểu thêm, đây là một số tài nguyên bổ sung. Để biết thêm thông tin về gói SpeechRecognition:
Một số tài nguyên Internet thú vị:
Một số sách hay về nhận dạng giọng nói:
Phụ lục: Nhận dạng giọng nói bằng các ngôn ngữ khác ngoài tiếng AnhTrong suốt hướng dẫn này, chúng tôi đã nhận dạng giọng nói bằng tiếng Anh, là ngôn ngữ mặc định cho mỗi Để nhận dạng giọng nói bằng một ngôn ngữ khác, hãy đặt
Chỉ các phương thức sau chấp nhận
Để biết những thẻ ngôn ngữ nào được API bạn đang sử dụng hỗ trợ, bạn sẽ phải tham khảo tài liệu tương ứng . Bạn |