0에서 9까지 큰 소리로 말하기


15

electronics.SE의이 질문에서 영감을 얻은 것은 다음과 같습니다.

기존 음성 합성 도구를 사용 하지 않고 10 진수 (0-9)의 시퀀스를 취하여 큰 소리로 말하는 프로그램 또는 서브 루틴을 작성하십시오 .

입력:

입력 자릿수를 ASCII 형식의 문자열, 정수 배열, BCD 인코딩 숫자 등의 적절한 형식으로 제공하도록 요청할 수 있습니다. 솔루션이 실행 가능한 프로그램 인 경우 다음과 같이 입력 할 수 있습니다. 명령 행 매개 변수, 표준 입력에서 읽거나 합리적인 방법으로 얻습니다.

프로그램 호출 당 8 자리 이상 을 말할 수 있어야합니다 . 첫 번째 숫자가 유일한 숫자가 아닌 한 첫 번째 숫자가 0이 아니라고 가정 할 수 있습니다 .

산출:

프로그램은 오디오 장치를 사용하여 직접 숫자를 말하거나 재생 가능한 사운드 파일을 출력 할 수 있습니다. 출력 파일이있는 경우 표준 오디오 형식이거나 원시 샘플 데이터로 구성 될 수 있습니다. 원시 샘플 데이터를 출력하는 경우 재생에 적합한 파라미터 (샘플 속도, 샘플 당 비트 수, 엔디안, 부호있는 / 부호없는 채널 수)를 기록하십시오. aplay에서 지원하는 형식 이 선호됩니다.

숫자를 어떻게 말할지에 대한 세부 사항을 자유롭게 결정할 수 있지만, 출력은 일반적인 영어 사용자가 이해할 수있는 방식으로 영어 숫자로 구성 되어야하며 청취자가 정확하게 녹음 할 수있을 정도로 명확해야합니다. 8 자리 난수입니다. 아니오, 단지 n 번 울리는 것은 계산되지 않습니다. 숫자 사이에 일시 정지를 포함시키는 것을 잊지 마십시오.

채점 :

표준 스코어링 규칙이 적용됩니다. 스코어는 코드 길이 (바이트) 또는 코드가 유니 코드 텍스트로 작성된 경우 유니 코드 문자입니다. 최저 점수가 이깁니다. 모든 언어는 간다.

electronics.SE에 대한 원래 질문은 임베디드 프로그래밍에 관한 것이 었으므로 저수준 언어를 사용하여 저자에게 뼈를 던지는 것이 적절하다고 생각했습니다. 솔루션이 컴파일 된 언어로 작성된 경우 길이를 계산하도록 선택할 수 있습니다 점수로 컴파일 된 실행 파일 (바이트) (예, Java .class파일 과 같은 사전 컴파일 된 바이트 코드 도 괜찮습니다.)이 옵션을 사용하기로 선택한 경우 소스 코드와 함께 답변에 컴파일 된 실행 파일의 사본 (예 : 16 진 덤프)을 포함 시키십시오. 그리고 컴파일러 버전 및 생성에 사용한 옵션.

선외 가작을 하는 50 렙 현상금과 함께, 또한의 기준을 충족하는 첫 번째 대답에 부여됩니다 원래의 질문에 , 즉 플래시의 4킬로바이트 및 SRAM의 1킬로바이트와 임베디드 MCU에서 실행 할 수 있습니다.

제한 사항 :

해당 파일 또는 리소스 의 길이를 점수의 일부로 계산하지 않으면 선택한 언어의 표준 런타임 환경에 포함되지 않은 파일 또는 네트워크 리소스 를 사용할 수 없습니다. (예 : 웹에서 오디오 샘플로드를 허용하지 않습니다.)

또한 선택한 언어의 표준 런타임 환경에 포함되어 있더라도 기존 음성 합성 도구 나 오디오 데이터의 라이브러리 또는 편집을 사용하지 않을 수도 있습니다 (점수의 일부로 크기를 계산하지 않는 한) .


추신. 실제로 이해하기 쉬운 것을 만들어 내면 나중에 나만의 해결책을 게시 할 수 있습니다. 그러나 자신의 글을 올리는 것을 부끄러워하지 마십시오. 이 시점에서 모든 대답은 좋은 대답입니다.
Ilmari Karonen

1
우리는 말한 자릿수의 데이터베이스를 다운로드 할 수 있습니까 (그리고 그 크기를 점수에 포함) 우리 자신의 목소리를 녹음해야합니까? 알고리즘으로 음성 샘플을 생성 할 수 있을지 의심됩니다.
John Dvorak

음 ... "출력"섹션은 음성 샘플을 출력해야한다고 지정하지 않습니다. 우리는 단순히 10 번 울리는 것이 허용됩니까?
John Dvorak

@PeterTaylor : 점수의 일부로 크기를 세면 괜찮습니다. 표준 런타임 환경 어딘가에 묻힌 숫자의 오디오 샘플이있는 시스템이 있을지 걱정이되었습니다.
Ilmari Karonen

3
헤비급 라이브러리 주변에서 끝까지 질문을 읽고 사소한 래퍼를 게시하지 않는 사람들이 꾸준히 등장하는 것처럼 보이므로 "직접 수행"측면에 더 중점을 두는 것이 좋습니다.
피터 테일러

답변:


10

루비-3710 = 90 자 코드 + 3620 바이트 데이터

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

입력 : 단일 명령 행 인수, 읽을 숫자

출력 : 원음 데이터, PCM 8 비트 / 8kHz

이것은 입력 문자열을 읽을 수있는 한 모든 입력 문자열을 읽을 수 있습니다

  • 유효한 파일 이름 인 문자 만 포함합니다. 4 자만 사용하면 해당 문자를 모든 문자로 확대 할 수 있습니다.
  • 필요한 파일이 있습니다.
  • 왜 오 당신 공간 디 오 en 아포스트로피 티 공간 em 나는 디 공간 티 aitch i es 기간

5e3두 단어 사이의 일시 중지를 인코딩합니다. 여기서 5ksamples ~ = 0.6s입니다. 원하는대로 조정하십시오.

이제 까다로운 부분은 샘플 파일을 4K로 가져 오는 동시에 쉽고 충분한 품질로 압축을 풀 수있는 것입니다. 내가 그들을 얻는 방법은 다음과 같습니다.

이제 샘플 속도와 데시 메이션 양을 선택해야합니다. 너무 많으면 소리를 이해할 수 없습니다. 너무 작고 적합하지 않습니다. 나는 8kHz / 3b에 정착했다. 그들은 다음과 같습니다 : https://github.com/honnza/drops/raw/master/digits.zip

  • 8KHz * 4b / 샘플 및 높은 품질-너무 큼
  • 8KHz * 3b / sample-저품질이지만 4K에 적합
  • 8KHz * 2b / sample-kch kchhhhhhhhh [이해 불가]
  • 2KHz * 8b / 샘플-너무 큼
  • 2KHz * 3b / sample-kch kchhhhhhhhh
  • 1KHz * 8b / 샘플-kch kchhhhhhhhh

다음은 데시 메이션 스크립트입니다.

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

원래의 문제는 코드와 파일 테이블을위한 476 바이트의 공간이 있습니다. DEFLATE 라이브러리로 얻을 수있는 작은 크기에 따라 약간 너무 클 수 있습니다. 필요한 경우 오디오 샘플을 조금 더 자르면 여기 저기 몇 구석을 줄일 수 있습니다. [fo:r]또는 [o:]중요하지 않지만 바이트를 절약합니다. 나는 숫자를자를 때 다소 호의적이었습니다. 또한 다른 데시 메이션 체계 또는 다운 샘플링을 위해 일부 데시 메이션을 희생하면 도움이 될 수 있습니다. 또한 DEFLATE 헤더를 삭제하면 공간을 절약 할 수 있습니다.

사운드 샘플을 연결하는 것은 매우 쉽지만 4K는 약간 비좁습니다. 4k 공간에 묶이지 않으면 데시 메이션이 적습니다. 샘플 당 4 비트는 실제로 꽤 잘 전달되며 약간 더 큽니다.


+1, 나쁘지 않습니다. 그러나 명확성은 매우 미미합니다. 몇 개의 난수를 전사하려고 시도했으며 약 70 %의 성공률을 얻었습니다. (나는 99 %에 가까운 것을 기대하고 있었다.) 나는 또한 명예로운 언급에 대해 약간의 울타리에 있다 .4K 이런 식으로 달성 할 수 있다고 꽤 좋은 주장을했지만 , 실제로 그것을 보여주었습니다. C를 위해 루비를 버렸다고해도 (쉽게 수행 할 수 있습니다. 믿을 것입니다.) 남은 플래시 공간에 DEFLATE 디코더 를 실제로 맞출 수 있습니까? 또한 언급했듯이 음질이 매우 나쁩니다.
Ilmari Karonen

추신. 더 나은 압축에 대한 몇 가지 팁 : 모든 샘플을 null 바이트로 고정 길이로 압축하고 (압축해야 함) 하나의 압축 파일로 연결 한 다음 압축을 풀고 슬라이스 할 수 있습니다. 또한 이 답변 의 KZIP 트릭은 더 나은 DEFLATE 압축을 제공 할 수 있습니다. 마지막으로, 결합 된 사운드 파일을 편집하여 동등한 음소를 정확한 사본으로 바꾸십시오.
Ilmari Karonen

음, 오리지널 사운드 샘플은 어느 IMO도 이해할 수 없었습니다. 내가 아는 가장 작은 DEFLATE 라이브러리-wikipeda로 연결된 첫 번째 라이브러리는 약 500b입니다. 솔직히, 인플레이터를 특정 장치에 이식하길 원하십니까? 실제로 얻을 수는 있지만 이전에는 ARM을 코딩 한 적이 없습니다.
John Dvorak

70 %의 성공률에 놀랐습니다. 숫자가 이해하기 쉽다는 것을 알았습니다. 어떤 숫자를 가장 혼동 했습니까?
존 드보락

코어 텍스 M0에 포팅하는 것은 아마 인 비트 (당신이 할 수 있다면, 그 멋진 것 있지만!) 물어,하지만 난 독립형 바이너리 (+ 데이터 파일 (있는 경우)가)에서 피팅 있다는 생각을 너무 많이 4k는 합리적인 데모처럼 보입니다. (임베디드 디바이스에서는 필요하지 않기 때문에 libc에서 정적으로 링크 할 필요는 없지만 DEFLATE 코드는 반드시 세어야합니다.) 기본적으로 원래 질문에 대한 답변으로 게시 할 수있는 것 "전자 장치에 맞게 컴파일하면 적합 할 것"이라고 자신있게 말합니다.
Ilmari Karonen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.