Viết mã nhận dạng giọng nói của riêng tôi [đã đóng]


17

Mô tả vấn đề

Tôi muốn sử dụng nhận dạng giọng nói như một phần của dự án phần cứng mà tôi muốn hoàn toàn tự chứa (Tôi đang sử dụng các thiết bị tốc độ thấp, năng lượng thấp như Arduino và Raspberry Pi, Kinects, v.v., không chạy máy tính truyền thống với một hệ điều hành có liên quan. Vì vậy, một dự án khép kín / tự chứa).

Nhận dạng giọng nói có thể rất phức tạp tùy thuộc vào mức độ tinh tế mà bạn mong muốn. Tôi có những gì tôi tin rằng một bộ yêu cầu tương đối đơn giản. Tôi chỉ muốn nhận ra giọng nói của chính mình và tôi có một từ điển nhỏ gồm 20 từ hoặc hơn những từ tôi muốn nhận ra. Do đó, tôi không yêu cầu các thư viện nhận dạng giọng nói và văn bản phức tạp hoặc bất kỳ phần mềm bên thứ 3 tuyệt vời nào tôi tìm thấy thông qua các công cụ tìm kiếm Internet (không thiếu những thứ này!). Tôi tin rằng các yêu cầu của tôi là "đủ đơn giản" (trong lý do) để tôi có thể mã hóa giải pháp của riêng mình. Tôi tự hỏi nếu có ai đã viết quy trình của riêng họ như thế này, và phương pháp của tôi có bị sai sót ồ ạt không? Có cách nào tốt hơn để làm điều này mà không đòi hỏi trình độ toán học cao hay phải viết một thuật toán phức tạp không? Đó là giải pháp tôi đã cố gắng nghĩ ra dưới đây.

Mô tả giải pháp

Tôi sẽ viết bài này bằng C nhưng tôi muốn thảo luận về một quá trình bất khả tri ngôn ngữ, tập trung vào quá trình tự nó. Vì vậy, hãy bỏ qua điều đó nếu chúng ta có thể.

1. Tôi sẽ ghi lại từ điển các từ của mình để khớp với những từ đang được nói. Chúng ta có thể tưởng tượng tôi có 20 bản ghi âm của 20 từ khác nhau của tôi, hoặc có thể là cụm từ ngắn hoặc câu của hai hoặc ba từ. Tôi tin rằng điều này làm cho quá trình so sánh hai tệp ghi âm dễ dàng hơn thực tế chuyển đổi âm thanh thành văn bản và so sánh hai chuỗi.

2. Một micrô được kết nối với thiết bị phần cứng của tôi chạy mã của tôi. [1]. Mã này liên tục lấy các mẫu có chiều dài cố định, ví dụ độ dài 10msec và lưu trữ 10 mẫu liên tiếp, ví dụ, theo kiểu ghi nhật ký tròn. [2]. (Tôi đang phát minh ra những số liệu này trên đỉnh đầu để chúng chỉ là ví dụ để mô tả quá trình).

[1] Điều này có thể sẽ được kết nối thông qua bộ lọc thông dải và op-amp, cũng như các bản ghi từ điển sẽ được thực hiện, để giữ cho các mẫu âm thanh được lưu trữ và thu thập nhỏ hơn.

[2] Tôi không chắc chắn chính xác mình sẽ lấy mẫu như thế nào, tôi cần tìm ra một phương thức mặc dù tôi đã tạo ra một hình số (số nguyên / float / double) đại diện cho âm thanh của mẫu 10msec (có lẽ là giá trị CRC hoặc MD5 tổng vv của mẫu âm thanh) hoặc luồng hình (có thể là luồng đọc âm thanh tần số). Cuối cùng, một "mẫu" sẽ là một con số hoặc số liệu. Phần này sẽ liên quan đến phần cứng nhiều hơn nên không thực sự thảo luận ở đây.

3. Mã nhìn vào nó được lưu trữ 10 mẫu liên tiếp và tìm cách tăng âm lượng để chỉ ra một từ hoặc cụm từ đang được nói (một khoảng nghỉ từ im lặng) và sau đó tăng là thu thập mẫu liên tiếp để nói 500 mẫu chẳng hạn. Điều đó có nghĩa là nó thu được 5 giây âm thanh trong 10 mẫu msec.

Đó là những mẫu hoặc "lát" được so sánh giữa âm thanh được lưu trữ và âm thanh thu được. Nếu một tỷ lệ đủ cao của các mẫu được chụp khớp với các mẫu được lưu trữ tương đương, mã sẽ giả sử cùng một từ.

The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also

Stored Sample No           | 1| 2| 3| 4| 5| 6| 7|  8|
Stored Sample Value        |27|38|41|16|59|77|200|78|

Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence

Incoming Sample No         | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value      |  |  |  |20|27|38|46|16|59|77|200|78|

4 . Khi mã đã thu thập một luồng mẫu đầy đủ, sau đó nó sẽ loại bỏ các mẫu trống khi bắt đầu để tạo bản ghi âm thanh sau. Nó cũng có thể di chuyển mẫu được đặt ngược và chuyển tiếp một vài vị trí để căn chỉnh tốt hơn với mẫu được lưu trữ.

Điều này tạo ra một bộ mẫu như sau:

Stored Sample No           | 1| 2| 3| 4| 5| 6|  7| 8|
Stored Sample Value        |27|38|41|16|59|77|200|78|

Incoming Sample No      |-1| 1| 2| 3| 4| 5| 6|  7| 8|
Incoming Sample Value   |20|27|38|46|16|59|81|201|78|

5. Tôi tin rằng bằng cách có giá trị phần trăm cho mỗi mẫu phải gần nhau, vì vậy mẫu 7 khác với giá trị 1 nhỏ hơn% 1 và giá trị phần trăm cho tổng số mẫu phải nằm trong tỷ lệ phần trăm khớp mẫu của chúng , mã có mức độ chính xác dễ điều chỉnh.

Tôi chưa bao giờ làm bất cứ điều gì như thế này với âm thanh trước đây, nó có thể là rất nhiều công việc. Đây là lý do tại sao tôi hỏi câu hỏi này, nếu bạn có thể đã biết câu trả lời cho câu hỏi này là rõ ràng (câu trả lời đó có thể là gì). Tôi hy vọng đây sẽ không phải là một nhiệm vụ lớn về mặt tính toán vì một số phần cứng tôi sẽ sử dụng sẽ là những thứ thấp. Trong hàng trăm Megahertz (Có thể là 1Ghz khi sử dụng Rasp Pi quá xung nhịp). Vì vậy, đây là một cách khá thô để khớp các mẫu âm thanh sử dụng công suất tính toán thấp hơn. Tôi không nhắm đến kết quả tức thì, nhưng chưa đến 30 giây cho một bằng chứng xác thực.

PS Tôi không có đại diện để gắn thẻ này với một thẻ mới như "âm thanh", "nhận dạng âm thanh", "giọng nói", "nhận dạng giọng nói", v.v.


17
VR khá phức tạp và tôi nghi ngờ ai đó không có kiến ​​thức trong lĩnh vực này sẽ có thể thực hiện nhiều bước tiến mà không cần đọc nhiều. Điều đầu tiên gây ấn tượng với tôi về thuật toán của bạn là nó sẽ không xử lý được sự khác biệt về tốc độ của một từ được nói. Ngay cả VR đơn giản cũng mất nhiều năm để có được đúng.
Gort Robot

4
Thật. Bạn, trừ khi bạn bận tâm nhiều năm phát triển, có thể muốn xem xét các thư viện bạn có thể biên dịch theo mục tiêu của mình. Tôi chắc rằng chúng tồn tại.
Giàn khoan

6
Tôi sẽ đề nghị một bước bổ sung - thực hiện chuyển đổi phạm vi của từng mẫu. Điều này cung cấp cho bạn cường độ của từng tần số âm thanh theo thời gian, thay vì xử lý trực tiếp các mẫu. Sẽ có một tần số cơ bản phù hợp hợp lý cho các nguyên âm mà bạn thường nói mà bạn có thể phát hiện ra. Bạn cần xem xét các đặc điểm cụ thể của lời nói, không chỉ âm thanh. Như những người khác đã nói, đây là một nhiệm vụ khó khăn.
Paul Anderson

1
Tôi khuyên bạn nên thử chơi xung quanh với một số thư viện nhận dạng giọng nói, ngay cả khi bạn không thể sử dụng chúng cho sản phẩm cuối cùng. Chúng sẽ hữu ích cho việc tạo ra một bằng chứng về khái niệm.
sav

Câu trả lời:


3

Chà, tôi không tin Arduino có sức mạnh ngựa để làm việc này. Hoạt động ở mức 16Mhz Một Arduino có bộ nhớ khoảng 32K. Ngay cả 20 từ được lấy mẫu trong Mp3 (nhỏ hơn wav) sẽ không phù hợp với nó, mặc dù đó chỉ là giọng nói của riêng bạn.

Các rasberi pi có thể thực hiện thủ thuật, hoạt động ở mức 700Mhz tùy thuộc vào phiên bản mà nó có thể có bộ nhớ 512MB. Đó vẫn chưa phải là nhiều bột.

Bạn có thể cần một cú ném bóng ( http://www.drdobbs.com/cpp/a-simple-and-ffic-fft-im THỰCatio / 99500857 )

Hoặc nếu bạn có ý định sử dụng âm lượng, hãy thực hiện một số trung bình với các mẫu trước đó như
x = (x + x [n-1] + x [n-2] + x [n-3]) / 4 // điều đó khá đơn giản cần thêm

Một điều tiếp theo bạn cần làm là tôi nghĩ rằng nếu bạn sẽ vẽ các giá trị X này thì bạn cần một số loại phát hiện độ dốc của dòng đó Bởi vì việc phát hiện các lệnh dựa trên âm lượng phụ thuộc rất nhiều vào khoảng cách Trong khi bạn muốn phát hiện mẫu của từ

Sau đó, nó phụ thuộc một chút làm thế nào để ghi lại độ dốc để mô hình phù hợp với thời gian khác. Ý tôi là người ta không nói theo nhịp độ chính xác mà máy tính có thể khớp và độ dốc có thể dốc hơn một chút. Cuối cùng, tôi nghĩ rằng đây là một chút độ dốc của các đường đó và trục y dài của chúng, nên nằm trong một số trung bình


1
  1. Arduino và Raspberry Pi là các bảng tạo mẫu với ít chip trên chúng. Bạn nên tập trung vào chip trước. Tìm kiếm thứ gì đó với hộp công cụ DSP (xử lý tín hiệu số), có thể bạn đã có hộp công cụ DSP và không biết điều đó. Các hộp công cụ DSP có các thuật toán về cuộc gọi như fft (biến đổi phạm vi nhanh) và ifft (nghịch đảo fft) để phân tích miền tần số nhanh.

  2. Tập trung vào phong cách lập trình của bạn: Các mẫu của bạn trong một ngăn xếp hoặc hàng đợi? Bạn sẽ muốn một hàng đợi cho loại dữ liệu này. Một hàng đợi trông như:

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |5|7|9|1|2|2|9|8|
    

    Lặp lại tiếp theo:

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |0|5|7|9|1|2|2|9|
    ->  First in First out (FIFO)
    

    Lưu ý cách mọi thứ thay đổi theo hướng 'phải'? Tôi nghĩ rằng bạn đã mô tả một thuật toán "tròn". Chỉ cần ghi đè lên các mẫu cũ nhất bằng các mẫu cũ nhất thứ hai, sau đó ghi đè lên các mẫu cũ thứ hai bằng mẫu cũ thứ ba, ..., cho đến khi bắt đầu hàng đợi nơi bạn chèn dữ liệu mới nhất của mình.

  3. "Mã liên tục lấy các mẫu có chiều dài cố định, giả sử 10msec" <- không chính xác Hãy nghĩ theo cách này: Mã đang lấy mẫu một cách riêng biệt (chiều cao), với tốc độ lấy mẫu là 10000 mẫu mỗi giây, làm cho mỗi mẫu cách nhau 0,1 ms.

    Tần suất lấy mẫu của bạn là gì? Bitrate trên bộ lượng tử hóa của bạn là gì? Số thấp hơn sẽ giúp bạn giải phóng bộ nhớ. Tôi sẽ đề xuất tỷ lệ lấy mẫu thấp như 6600 mẫu mỗi giây (Nyquist). Tôi nghi ngờ 4 bit (16 cấp độ) sẽ đủ để nhận ra. Vì vậy, đó là 3300 byte ghi âm mỗi giây. Bây giờ làm fft và xóa mọi thứ trên 3300 Hz (bộ lọc điện thoại). Bây giờ bạn có 1650 byte được sử dụng cho một giây âm thanh. Những thủ thuật DSP này sẽ tiết kiệm rất nhiều bộ nhớ.

    Tôi không biết ai nghĩ 512 MB là nhỏ. Với thông tin trên có hơn 300.000 giây ghi âm ... trong hơn 3 ngày.

  4. Tôi nghĩ bạn sẽ tìm thấy miền tần số (bằng cách sử dụng fft) là môi trường tốt hơn để thực hiện nhận dạng giọng nói.

Tôi hy vọng tôi đã không nhầm lẫn bạn tồi tệ hơn :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.