Inspirado por esta pergunta da electronics.SE , aqui está um desafio para você:
Escreva um programa ou sub-rotina que pegue uma sequência de dígitos decimais (0 a 9) e fale-os em voz alta, sem usar uma ferramenta de síntese de fala existente.
Entrada:
Você pode solicitar que os dígitos da entrada sejam fornecidos em qualquer formato razoável, por exemplo, como uma sequência de dígitos ASCII, uma matriz de números inteiros, um número codificado em BCD, etc. Se a sua solução for um programa executável, você poderá considerar a entrada como um parâmetro da linha de comandos, leia-o da entrada padrão ou obtenha-o de qualquer outra maneira razoável.
Seu programa deve ser capaz de falar pelo menos oito dígitos por chamada. Você pode assumir que o primeiro dígito não é zero, a menos que seja o único dígito.
Resultado:
Seu programa pode falar os números diretamente usando um dispositivo de áudio ou pode gerar um arquivo de som reproduzível. O arquivo de saída, se houver, pode estar em qualquer formato de áudio padrão ou pode consistir em dados de amostra brutos. Se você fornecer dados de amostra brutos, observe os parâmetros apropriados para a reprodução (taxa de amostragem, bits por amostra, endianness, assinado / não assinado, número de canais). Formatos suportados pelo aplay são preferidos.
Você é livre para decidir os detalhes de como os números serão falados, mas sua saída deve consistir em dígitos do idioma inglês falados de maneira compreensível para um falante típico de inglês e deve ser suficientemente claro para que o ouvinte possa transcrever com precisão um número aleatório falado de oito dígitos. Não, apenas apitar n vezes não conta. Não se esqueça de incluir pausas entre os dígitos.
Pontuação:
Aplicam-se as regras padrão de pontuação de código-golfe : Sua pontuação é o tamanho do seu código em bytes ou, se o seu código estiver escrito em texto Unicode, em caracteres Unicode. Menor pontuação ganha. Qualquer idioma vai.
Como a pergunta original sobre a eletrônica. E se tratava de programação incorporada, achei que seria apropriado lançar um osso para os autores usando linguagens de baixo nível: se a sua solução estiver escrita em uma linguagem compilada, você poderá contar a duração da arquivo executável compilado em bytes como sua pontuação. (Sim, .class
o código de código pré-compilado, como um arquivo Java , também é bom.) Se você optar por fazer uso dessa opção, inclua uma cópia do executável compilado em sua resposta (por exemplo, como um hex dump) junto com seu código-fonte e a versão do compilador e as opções usadas para gerá-lo.
Uma menção honrosa , juntamente com uma recompensa de +50 representantes, será concedida à primeira resposta que também atenda aos critérios da pergunta original , ou seja, é capaz de rodar em um MCU incorporado com 4 kb de flash e 1 kb de SRAM.
Restrições:
Você não pode usar arquivos ou recursos de rede que não façam parte do ambiente de tempo de execução padrão do idioma escolhido, a menos que conte a duração desses arquivos ou recursos como parte de sua pontuação. (Isso é para não permitir, por exemplo, carregar amostras de áudio da Web.)
Você também não pode usar nenhuma ferramenta de síntese de fala, biblioteca ou compilação de dados de áudio preexistentes (a menos que você também conte o tamanho como parte da sua pontuação), mesmo que elas estejam incluídas no ambiente de tempo de execução padrão do idioma escolhido.
Respostas:
ruby - 3710 = código de 90 caracteres + dados de 3620 bytes
input: um único argumento de linha de comando, o número a ser lido
saída: dados de som brutos, PCM 8bit / 8kHz
Isso pode ler qualquer sequência de entrada, desde que
5e3
codifica a pausa entre duas palavras. Aqui, 5 amostras = 0,6s. Ajuste conforme desejado.Agora, a parte mais complicada é obter os arquivos de amostra em 4K e ainda poder descompactá-los facilmente e com qualidade suficiente. Aqui está como eu os peguei:
Agora, é preciso escolher uma taxa de amostragem e um valor de dizimação. Demais, e o som não será compreensível. Muito pouco e você não se encaixa. Eu me conformei com 8kHz / 3b. Lá estão eles: https://github.com/honnza/drops/raw/master/digits.zip
Aqui está o script de dizimação:
Quanto ao desafio original: existem 476 bytes de espaço para o código e a tabela de arquivos. Isso pode ser um pouco demais, dependendo do tamanho que podemos obter com uma biblioteca DEFLATE. Se necessário, podemos cortar alguns cantos aqui e ali cortando as amostras de áudio um pouco mais agressivamente.
[fo:r]
ou[o:]
realmente não importa, mas salva bytes. Fui um pouco benevolente ao cortar os números. Além disso, um esquema de dizimação diferente ou o sacrifício de alguma dizimação por downsampling pode ajudar - vou brincar com isso mais tarde. Além disso, soltar os cabeçalhos DEFLATE pode economizar uma pequena quantidade de espaço.Concatenar amostras de som é bastante fácil, mas o 4K é um pouco apertado. Se você não está limitado pelo espaço de 4k, sugiro menos dizimação. Na verdade, 4 bits por amostra se saem muito bem e são apenas um pouco maiores.
fonte