0から9までの数字を声に出して話す


15

electronics.SEからのこの質問に触発され、ここにあなたのための挑戦があります:

既存の音声合成ツール使用せずに、一連の10進数(0〜9)を取り込んで声に出して話すプログラムまたはサブルーチンを作成します。

入力:

入力数字は、ASCII数字の文字列、整数の配列、BCDでエンコードされた数字など、合理的な形式で提供されるように要求できます。ソリューションが実行可能プログラムである場合、入力をコマンドラインパラメーター、標準入力から読み取る、またはその他の合理的な方法で取得します。

プログラム、呼び出しごとに少なくとも8桁を話せる必要あります。あなたはあり、それが唯一の数字でない限り、最初の桁は、ゼロではないことを前提としています。

出力:

プログラムは、オーディオデバイスを使用して番号を直接話すか、再生可能なサウンドファイルを出力する場合があります。出力ファイルがある場合は、標準のオーディオ形式であるか、生のサンプルデータで構成されている場合があります。生のサンプルデータを出力する場合は、再生に適したパラメーター(サンプルレート、サンプルあたりのビット数、エンディアンネス、符号付き/符号なし、チャンネル数)に注意してください。aplayでサポートされている形式が推奨されます。

数字の読み方の詳細は自由に決めることができますが、出力は、典型的な英語話者が理解できる方法で話された英語の数字で構成する必要があり、リスナーが正確に文字起こしできるように十分明確にする必要があります話されている8桁の乱数。いいえ、ビープ音をn回鳴らすだけではカウントされません。数字の間に一時停止を含めることを忘れないでください。

得点:

標準のスコアリングルールが適用されます。スコアは、コードの長さ(バイト単位)、またはコードがUnicodeテキストで記述されている場合はUnicode文字です。最低スコアが勝ちます。すべての言語が行きます。

Electronics.SEの最初の質問は組み込みプログラミングに関するものであったため、低レベル言語を使用して作成者に骨を投げるのが適切だと感じました。ソリューションがコンパイルされた言語で記述されている場合、スコアとしてバイト単位でコンパイルされた実行可能ファイル。(はい、Java .classファイルなどのプリコンパイルされたバイトコードでも構いません。)このオプションを使用することを選択した場合は、ソースコードと一緒にコンパイル済み実行可能ファイルのコピーを(たとえば、16進ダンプとして)回答に含めてくださいそして、生成に使用したコンパイラのバージョンとオプション。

佳作は、50担当者の恵みとともに、またの基準に適合していることを最初の答えに付与されます元の質問を、すなわち、フラッシュの4キロバイトとSRAMの1キロバイトを埋め込んだMCU上で実行することが可能です。

制限事項:

上記のファイルまたはリソースの長さをスコアの一部としてカウントしない限り、選択した言語の標準ランタイム環境の一部ではないファイルまたはネットワークリソースを使用することはできません。(これは、Webからのオーディオサンプルの読み込みなどを禁止するためです。)

選択した言語の標準ランタイム環境に含まれている場合でも、既存の音声合成ツールやライブラリ、またはオーディオデータのコンパイルを使用することはできません(サイズをスコアの一部としてカウントしない限り)。


追伸 実際に理解できるように聞こえる何かを生成することができた場合、後で独自のソリューションを投稿することがあります。ただし、自分の投稿を恥ずかしがらないでください。この時点で、どんな答えでも良い答えです。
イルマリカロネン

1
話された数字のデータベースをダウンロードできますか(そして、そのサイズをスコアにカウントします)、または自分の声を録音する必要がありますか?音声サンプルをアルゴリズムで生成できるとは思えません。
ジョンドボラック

うーん...「出力」セクションでは、音声サンプルを出力する必要があることを指定していません。単純に10回ビープ音を鳴らすことはできますか?
ジョンドヴォルザーク

@PeterTaylor:スコアの一部としてサイズを数えれば大丈夫です。標準のランタイム環境のどこかに数字のオーディオサンプルが埋め込まれているシステムがあるかもしれないと心配しました。
イルマリカロネン

3
質問を最後まで読んでおらず、ヘビー級ライブラリーの周りにささいなラッパーを投稿しない人々が着実に流れているように見えるので、「自分でやる」という側面にさらに重点を置くのは編集する価値があるかもしれません。
ピーターテイラー

回答:


10

ルビー-3710 = 90文字のコード+ 3620バイトのデータ

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

入力:単一のコマンドライン引数、読み取る番号

出力:生の音声データ、PCM 8bit / 8kHz

これは、任意の入力文字列を読み取ることができますが、

  • 有効なファイル名である文字のみが含まれます。4文字のみの場合、そのセットをすべての文字に拡大できます。
  • 必要なファイルがあります。
  • なぜあなたはスペース・ディー・オー・ア・アポストロフィ・ティー・スペース・エミ・アン・ディー・スペース・ティー・アイチ・アイズ・ピリオド

5e32つの単語間のポーズをエンコードします。ここでは、5ksamples〜= 0.6sです。必要に応じて微調整します。

さて、トリッキーな部分は、サンプルファイルを4Kで取得し、しかも簡単かつ十分な品質で解凍できるようにすることです。ここに私がそれらを得た方法があります:

ここで、サンプルレートとデシメーション量を選択する必要があります。多すぎると、音が理解できなくなります。少なすぎると、あなたは収まりません。8kHz / 3bに落ち着きました。あります:https : //github.com/honnza/drops/raw/master/digits.zip

  • 8KHz * 4b /サンプルおよび高品質-大きすぎる
  • 8KHz * 3b /サンプル-低品質ですが、4Kに適合
  • 8KHz * 2b /サンプル-kch kchhhhhhhhh [理解できない]
  • 2KHz * 8b /サンプル-大きすぎる
  • 2KHz * 3b /サンプル-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は少しcr屈です。4kのスペースに縛られていない場合は、間引きを減らすことをお勧めします。サンプルあたり4ビットは実際には非常によく運ばれ、わずかに大きいだけです。


+1、悪くない。ただし、明快さはかなり限界です。いくつかの乱数を書き直してみたところ、約70%の成功率が得られました。(私は99%に近いものを望んでいました。)私はまだ名誉ある言及のことについても少しばかり考えています:4K この方法で達成できるというかなり良い議論をしている間、あなたはそうしていません実際にそれを実証しました。Cにルビーを捨てたとしても(これは十分簡単だと思います。私は信仰にその部分を引き受けたいと思います)、残りのフラッシュスペースにDEFLATEデコーダーを本当に適合させることができますか?加えて、私が述べたように、音質はかなり悪いです。
イルマリカロネン

追伸 圧縮の改善に関するいくつかのヒント:すべてのサンプルをnullバイトで固定長になるようにパディングして(十分に圧縮する必要があります)、それらを1つの圧縮ファイルに連結し、解凍してスライスすることができます。また、この回答からのKZIPトリックは DEFLATE圧縮を向上させる可能性があります。最後に、結合されたサウンドファイルを編集して、同等の音素を正確なコピーに置き換えてみてください。
イルマリカロネン

よく、元のサウンドサンプルはIMOとも正確に理解できませんでした-ダウンサンプリングはそれに対してほとんど損害を与えませんでした。私が知っている最小のDEFLATEライブラリ-wikipedaによってリンクされた最初のライブラリ-は約500bの重量があります。率直に言って、インフレータをその特定のデバイスに移植してほしいですか?実際に到達するかもしれませんが、ARM向けにコーディングしたことはありません。
ジョンドヴォルザーク

70%の成功率に驚いています。数字がわかりやすいことがわかりました。どの数字を最も混同しましたか?
ジョンドボラック

Cortex M0への移植はおそらく尋ねるには少々多すぎます(それができればそれは素晴らしいことです!)が、スタンドアロンのバイナリ(もしあればデータファイル)は下に収まると思います4kは妥当なデモンストレーションのようです。(ファイルI / Oのためにlibcで静的にリンクする必要はありません。組み込みデバイスでは必要ありませんが、DEFLATEコードは確実にカウントする必要があります。)基本的に、元の質問に対する回答として投稿できるものElectronics.SEで、自信を持って「これをデバイス用にコンパイルすれば、きっと合うだろう」と言います。
イルマリカロネン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.