Nói to các chữ số từ 0 đến 9


15

Lấy cảm hứng từ câu hỏi này từ thiết bị điện tử. E , đây là một thách thức cho bạn:

Viết chương trình hoặc chương trình con lấy một chuỗi các chữ số thập phân (0 đến 9) và nói to chúng, mà không cần sử dụng một công cụ tổng hợp giọng nói hiện có.

Đầu vào:

Bạn có thể yêu cầu các chữ số đầu vào được cung cấp ở bất kỳ định dạng hợp lý nào, ví dụ như một chuỗi các chữ số ASCII, một dãy số nguyên, số được mã hóa BCD, v.v. Nếu giải pháp của bạn là một chương trình thực thi, bạn có thể lấy đầu vào là một tham số dòng lệnh, đọc nó từ đầu vào tiêu chuẩn hoặc có được nó theo bất kỳ cách hợp lý nào khác.

Chương trình của bạn phải có khả năng nói ít nhất tám chữ số cho mỗi lần gọi. Bạn có thể cho rằng chữ số đầu tiên không bằng 0, trừ khi đó là chữ số duy nhất.

Đầu ra:

Chương trình của bạn có thể nói số trực tiếp bằng thiết bị âm thanh hoặc có thể phát ra tệp âm thanh có thể phát. Tệp đầu ra, nếu có, có thể ở bất kỳ định dạng âm thanh tiêu chuẩn nào, hoặc nó có thể bao gồm dữ liệu mẫu thô. Nếu bạn xuất dữ liệu mẫu thô, vui lòng lưu ý các tham số thích hợp để phát lại (tốc độ mẫu, bit trên mỗi mẫu, độ bền, ký / không dấu, # của các kênh). Các định dạng được hỗ trợ bởi aplay được ưu tiên.

Bạn có thể tự do quyết định các chi tiết về cách các con số sẽ được nói, nhưng đầu ra của bạn phải bao gồm các chữ số tiếng Anh được nói theo cách dễ hiểu đối với một người nói tiếng Anh thông thường , và nó phải đủ rõ ràng để người nghe có thể phiên âm chính xác một số ngẫu nhiên tám chữ số nói. Không, chỉ có tiếng bíp n lần không được tính. Đừng quên bao gồm tạm dừng giữa các chữ số.

Ghi điểm:

Áp dụng quy tắc chấm điểm tiêu chuẩn : Điểm của bạn là độ dài mã của bạn theo byte hoặc, nếu mã của bạn được viết bằng văn bản Unicode, bằng ký tự Unicode. Điểm số thấp nhất chiến thắng. Bất kỳ ngôn ngữ đi.

Như câu hỏi ban đầu về điện tử. E là về lập trình nhúng, tôi cảm thấy sẽ rất phù hợp khi ném xương cho các tác giả sử dụng các ngôn ngữ cấp thấp: nếu giải pháp của bạn được viết bằng ngôn ngữ được biên dịch, bạn có thể chọn đếm độ dài của biên dịch tập tin thực thi theo byte như điểm số của bạn. (Có, mã byte được biên dịch trước, chẳng hạn như .classtệp Java , cũng ổn.) Nếu bạn chọn sử dụng tùy chọn này, vui lòng bao gồm một bản sao của tệp thực thi được biên dịch trong câu trả lời của bạn (ví dụ như kết xuất hex) cùng với mã nguồn của bạn và phiên bản trình biên dịch và các tùy chọn bạn đã sử dụng để tạo ra nó.

Một đề cập đáng trân trọng , cùng với tiền thưởng đại diện +50, sẽ được cấp cho câu trả lời đầu tiên đáp ứng các tiêu chí của câu hỏi ban đầu , tức là có khả năng chạy trên MCU nhúng với 4 kb flash và 1 kb SRAM.

Những hạn chế:

Bạn không được sử dụng bất kỳ tệp hoặc tài nguyên mạng nào không phải là một phần của môi trường thời gian chạy tiêu chuẩn của ngôn ngữ bạn đã chọn, trừ khi bạn tính độ dài của các tệp hoặc tài nguyên đã nói là một phần của điểm số của bạn. (Điều này là không cho phép, ví dụ như tải các mẫu âm thanh từ web.)

Bạn cũng không được sử dụng bất kỳ công cụ tổng hợp giọng nói hoặc thư viện hoặc tập hợp dữ liệu âm thanh nào có sẵn (trừ khi bạn cũng tính kích thước của chúng là một phần của điểm số của mình), ngay cả khi chúng được đưa vào môi trường thời gian chạy tiêu chuẩn của ngôn ngữ bạn đã chọn.


Thi thiên Tôi có thể đăng một giải pháp của riêng mình sau này, nếu tôi quản lý để làm cho nó tạo ra thứ gì đó thực sự nghe có vẻ dễ hiểu. Đừng ngại đăng bài của riêng bạn, mặc dù; tại thời điểm này, bất kỳ câu trả lời là một câu trả lời tốt.
Ilmari Karonen

1
Chúng tôi có được phép tải xuống cơ sở dữ liệu các chữ số nói (và đếm kích thước của nó theo điểm số) hay chúng tôi phải ghi lại giọng nói của chính mình? Tôi nghi ngờ tôi có thể tạo ra các mẫu lời nói bằng thuật toán.
John Dvorak

umm ... phần "đầu ra" không chỉ định chúng ta phải xuất mẫu lời nói. Chúng ta có được phép đơn giản là tiếng bíp mười lần không?
John Dvorak

@PeterTaylor: Nếu bạn tính kích thước của chúng là một phần của điểm số của mình thì không sao. Tôi chỉ lo lắng rằng có thể có một số hệ thống ngoài đó có các mẫu âm thanh của các chữ số được chôn ở đâu đó trong môi trường thời gian chạy tiêu chuẩn của nó.
Ilmari Karonen

3
Vì dường như có một dòng người ổn định, những người không đọc câu hỏi đến cuối và đăng các trình bao bọc tầm thường xung quanh các thư viện hạng nặng, nên có thể chỉnh sửa để nhấn mạnh hơn nữa vào khía cạnh "Tự làm".
Peter Taylor

Câu trả lời:


10

ruby - 3710 = mã 90 ký tự + dữ liệu 3620 byte

require'zlib'
$><<$*[0].chars.map{|x|Zlib::Inflate.inflate File.open(x).read}.join(?0*5e3)

đầu vào: một đối số dòng lệnh, số để đọc

đầu ra: dữ liệu âm thanh thô, PCM 8 bit / 8kHz

Điều này có thể đọc bất kỳ chuỗi đầu vào, miễn là

  • nó chỉ chứa các ký tự là tên tệp hợp lệ. chỉ với bốn ký tự, bạn có thể phóng to thiết lập cho tất cả các ký tự.
  • bạn có các tập tin cần thiết.
  • Tại sao oh bạn không gian dee oh en apostrophe tee space em i en dee space tee aitch i es period

5e3mã hóa tạm dừng giữa hai từ. Ở đây, 5ksamples ~ = 0,6s. Tinh chỉnh như mong muốn.

Bây giờ, phần khó khăn là lấy các tệp mẫu trong 4K và vẫn có thể giải nén chúng dễ dàng và đủ chất lượng. Đây là cách tôi có được chúng:

  • Sử dụng công cụ chuyển văn bản thành giọng nói có thể tạo các tệp âm thanh. Wikipedia có một .
  • Cho nó một văn bản chứa tất cả các chữ số, lý tưởng gần nhau. Tôi đã sử dụng http://en.wikipedia.org/wiki/Base_13
  • Mẫu mực.
  • Cắt ra từng phần trong một trình soạn thảo âm thanh .
  • Lưu dưới dạng tệp thô.
  • Số lượng từng mẫu (loại bỏ các bit thứ tự thấp).
  • Xì hơi.

Bây giờ, người ta phải chọn một tỷ lệ mẫu và số lượng decimation. Quá nhiều, và âm thanh sẽ không thể hiểu được. Quá ít, và bạn không phù hợp. Tôi đã giải quyết cho 8kHz / 3b. Họ đang ở đó: https://github.com/honnza/drops/raw/master/digits.zip

  • 8KHz * 4b / mẫu và chất lượng cao hơn - quá lớn
  • 8KHz * 3b / mẫu - chất lượng thấp, nhưng phù hợp với 4K
  • 8KHz * 2b / mẫu - kch kchhhhhhhhh [không thể hiểu được]
  • 2KHz * 8b / mẫu - quá lớn
  • 2KHz * 3b / mẫu - kch kchhhhhhhhh
  • 1KHz * 8b / mẫu - kch kchhhhhhhhh

Đây là kịch bản decimation:

require'zlib'
Dir.glob "*.raw" do |fname|
  File.open fname[/\d/], "wb" do |out|
    File.open fname do |input|
      bytes = input.bytes.to_a
      bytes.map! {|x|x&0xE0}
      dfl = Zlib::Deflate.deflate(bytes.pack("C*"),9)
      dfl.each_byte do |byte|
        out.print byte.chr
      end
      puts "done #{fname}: #{dfl.size}"
    end
  end
end

Đối với thử thách ban đầu: có 476 byte không gian cho mã và bảng tệp. Điều này có thể hơi quá nhiều tùy thuộc vào mức độ nhỏ bé mà chúng ta có thể nhận được với thư viện DEFLATE. Nếu không cần thiết, chúng ta có thể cắt một vài góc ở đây và ở đó bằng cách cắt các mẫu âm thanh một cách tích cực hơn một chút. [fo:r]hoặc [o:]không thực sự quan trọng nhưng nó tiết kiệm byte. Tôi đã có phần nhân từ khi cắt các con số. Ngoài ra, một sơ đồ số thập phân khác nhau hoặc hy sinh một số số thập phân cho việc lấy mẫu xuống có thể giúp ích - tôi sẽ làm đồ chơi với những thứ này sau. Ngoài ra, thả các tiêu đề DEFLATE có thể tiết kiệm một lượng không gian nhỏ.

Các mẫu âm thanh ghép khá dễ dàng, nhưng 4K hơi chật chội. Nếu bạn không bị ràng buộc bởi không gian 4k, tôi đề nghị giảm số thập phân. 4 bit cho mỗi mẫu thực sự có giá vé khá tốt và chỉ lớn hơn một chút.


+1, không tệ. Tuy nhiên, sự rõ ràng là khá ít: Tôi đã thử sao chép một vài số ngẫu nhiên và đạt tỷ lệ thành công 70%. (Tôi đã hy vọng điều gì đó gần với 99%.) Tôi vẫn còn một chút trên hàng rào về điều được đề cập đáng trân trọng: trong khi bạn đã đưa ra một lập luận khá hay rằng 4K thể đạt được theo cách này, bạn đã không thực sự đã chứng minh điều đó Ngay cả khi bạn bỏ ruby ​​cho C (điều này có vẻ dễ thực hiện; tôi sẵn sàng chấp nhận điều đó), bạn có thực sự phù hợp với bộ giải mã DEFLATE trong không gian flash còn lại không? Thêm vào đó, như tôi đã lưu ý, chất lượng âm thanh khá tệ.
Ilmari Karonen

Thi thiên Một vài mẹo để nén tốt hơn: Bạn có thể đệm tất cả các mẫu đến một độ dài cố định bằng byte rỗng (cần nén tốt) và nối chúng thành một tệp nén, sau đó giải nén và cắt nó. Ngoài ra, thủ thuật KZIP từ câu trả lời này có thể cung cấp cho bạn nén DEFLATE tốt hơn. Cuối cùng, hãy thử chỉnh sửa tệp âm thanh kết hợp để thay thế các âm vị tương đương bằng các bản sao chính xác.
Ilmari Karonen

tốt, các mẫu âm thanh ban đầu cũng không thể hiểu chính xác IMO - việc lấy mẫu xuống đã làm hỏng rất ít điều đó. Thư viện DEFLATE nhỏ nhất mà tôi biết - thư viện đầu tiên được liên kết bởi wikipeda - nặng khoảng 500b. Thành thật mà nói, bạn có muốn tôi chuyển cổng vào thiết bị cụ thể đó không? Tôi có thể thực sự hiểu nó, nhưng tôi chưa bao giờ được mã hóa cho ARM trước đây.
John Dvorak

Tôi khá ngạc nhiên về tỷ lệ thành công 70% - Tôi đã tìm thấy những con số dễ hiểu. Những chữ số nào bạn đã nhầm lẫn nhất?
John Dvorak

Chuyển nó sang Cortex M0 có lẽ hơi quá nhiều để hỏi (mặc dù nếu bạn có thể làm điều đó, điều đó thật tuyệt vời!), Nhưng tôi nghĩ rằng một tệp nhị phân độc lập (+ tệp dữ liệu, nếu có) phù hợp với 4k có vẻ là một minh chứng hợp lý. (Không cần liên kết tĩnh trong libc cho tệp I / O, vì bạn sẽ không cần điều đó trên một thiết bị nhúng, nhưng mã DEFLATE chắc chắn sẽ được tính.) Về cơ bản, một cái gì đó mà bạn có thể đăng làm câu trả lời cho câu hỏi ban đầu trên thiết bị điện tử.SE và tự tin nói "nếu bạn biên dịch cái này cho thiết bị của mình, tôi cá là nó sẽ phù hợp".
Ilmari Karonen
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.