Escolar Documentos
Profissional Documentos
Cultura Documentos
Casa Sobre
Depois de anos tentando fazer com que o software existente fizesse coisas que nunca
pretendia fazer, finalmente escrevi um código próprio para converter imagens de ondas
sonoras em áudio reproduzível. Ele não tem interfaces amigáveis, mas é relativamente fácil
de usar e é grátis (como na cerveja grátis, não no cachorro grátis), então o preço é justo.
Digamos que você tenha uma imagem digitalizada de uma forma de onda de áudio - um
gráfico da amplitude das vibrações sonoras em função do tempo. Talvez seja um fono-
logógrafo da década de 1850 ou 1860: um registro de som traçado em fuligem em uma
folha de papel em movimento para análise visual em um momento em que a reprodução
ainda não estava na mesa. Ou talvez seja uma impressão de tinta em papel feita de um
disco de gramofone algumas décadas depois (convertida, neste caso, de uma espiral em
linhas paralelas por uma transformação de coordenadas polar para retangular). Ou talvez
seja apenas uma linha aleatória que você quer tratar como uma forma de onda de áudio
para descobrir o que acontece. Quem sou eu para julgar?
A questão é como converter essa imagem em um arquivo de áudio reproduzível para que
possamos ouvi-la.
Eu já descrevi anteriormente um método tortuoso de fazer isso aqui e aqui , assim como no
meu livro Pictures of Sound . Esse método funciona, mas um ponto levantado por um leitor
é bem aceito:
A tecnica
Este procedimento tem suas desvantagens. Ele pode exigir muita edição manual demorada
para limpar a área em ambos os lados do traçado e conectar quaisquer quebras nele, de
modo que a ferramenta paintbucket não “transborde” para o outro lado. Enquanto isso, o
software ImageToSound tem algumas peculiaridades e limitações infelizes e está se
tornando cada vez mais difícil de executar - ainda posso executá-lo com êxito no meu
laptop atual do Windows 10 no modo de compatibilidade do Windows 98, mas outros me
disseram que não podem funcionar . Infelizmente, não houve alternativas convenientes.
AEO-Lighté projetado para converter imagens digitais de trilhas sonoras de filmes ópticos
em áudio sobre praticamente o mesmo princípio do ImageToSound, mas está configurado
para assumir que haverá quadros de imagem acompanhantes como um ponto de
referência. Nada mais do que eu estou ciente nas mesmas linhas está prontamente
disponível para uso público (PRISM, o software anexado ao IRENE , não é). Há programas
em abundância por aí para converter imagens em áudio, mas praticamente todos tratam
imagens de origem espectrograficamente, como gráficos de tempo e frequência -
Photosounder é um excelente exemplo - em vez de oscilograficamente, como gráficos de
tempo e amplitude.
Agora você pode inserir comandos no cursor na janela de comando. E aqui está uma
sequência deles que realiza a mesma coisa que eu tenho usado o ImageToSound,
presumindo que a imagem de origem seja em escala de cinza com um eixo de tempo
horizontal:
“
F = imread (“C: / sourcefile.tif ”);
F = duplo (F);
S = soma (F, 1);
U = (S-min (S)) ./ (0,5. * (Max (S) -min (S)) - 1;
wavwrite (U, 44100,24, “C: / targetfile.wav ”);
Dependendo do que você escolher para uma imagem de origem, poderá receber uma
mensagem como esta:
“
aviso: sua versão do GraphicsMagick limita as imagens a 16 bits por
pixel
Octave irá processar sua imagem de qualquer maneira, mas aparentemente ela não tirará
proveito de qualquer resolução disponível além de dezesseis bits por pixel. Para explorar
resoluções mais altas, é possível reconstruir GraphicsMagick com uma profundidade
quântica de 32 bits - veja a discussão aqui -, mas eu ainda não tentei isso. Dezesseis bits
por pixel realmente não são muito ruins.
Mas agora que conseguimos reduzir o tempo e começamos a criar algoritmos de imagem
para áudio, não há razão para pararmos lá. Eu convertei linhas onduladas em faixas
brilhantes de largura variável para conversão para WAV no passado, principalmente porque
esse era o único tipo de entrada que eu poderia encontrar software pronto para manipular.
No entanto, agora eu criei uma maneira razoavelmente simples para evitar a etapa de
edição de gráficos e converter linhas onduladas diretamente em áudio usando o Octave.
Abaixo estão algumas linhas de código que traduzem uma imagem em tons de cinza de um
traço de luz em um fundo escuro com um eixo de tempo horizontal em um arquivo WAV.
“
F = imread (“C: / sourcefile.tif ”);
F = duplo (F);
S = soma (F, 1);
Q = (F./S);
Q (isnan (Q)) = 0;
Z (1: (linhas (F))) = 1: linhas (F);
Z = rot90 (Z, 1);
Y = (Z * Q);
W = soma (Y, 1);
V = (W-min (W)) ./ (0,5. * (Max (W) -min (W))) - 1;
wavwrite (V, 44100,24, "C: / targetfile.wav ");
The first three lines are the same as before. But the fourth line creates a matrix Q of
individual pixel intensities (in matrix F) divided by total column intensity (in vector S), while
the fifth line cleans up any cases where this would entail division by zero by substituting a
zero for each “NaN” (“Not a Number”) value. Lines six and seven then create a column
vector Z of descending row numbers; line eight calculates a matrix Y by multiplying the
fractional pixel intensities in matrix Q by the row numbers in vector Z; and line nine creates
a row vector W from the sums of each column in matrix Y, which we proceed to rescale to
the range -1 to +1 as row vector V and write to a WAV file as before.
To illustrate what this sequence of steps accomplishes, let’s consider how it would handle
an exceedingly simple case: a row of five columns (presuming a vertical time axis) in which
0% of total pixel intensity is in Column 1, 20% in Column 2, 40% in Column 3, 30% in
Column 4, and 10% in Column 5.
When we multiply the column numbers by the fractions of total pixel intensity, the results are
0, 0.4, 1.2, 1.2, and 0.5; and if we sum those we get 3.3. Relative to the positions of the five
columns (marked above with red lines), 3.3 (marked above with a green line) represents the
center of total pixel intensity (represented above in yellow); thus, there should be an equal
area of yellow on either side of the green line. Or, if we want to visualize things relative to
some actual pixel intensity values:
For want of greater precision in our data, we’re inferring that the source trace would have
looked something vaguely like what I’ve shown below before pixelation (the light orange
marks the positions of the five scan lines, while the green line once again marks the center):
When we apply this same principle to an image of the wavy line of a phonautogram, or
something similar, it will return the center location of quantified brightness at each point
along the time axis, which should ideally correspond to the center of the trace (although in
practice visual background noise and imperfections or irregularities within the trace itself
can complicate things).
We shouldn’t necessarily evaluate numerical pixel intensity values in the linear fashion I’ve
described so far. I’ve found through trial and error that results can often be dramatically
improved by raising the original pixel intensity values to a certain power before
carrying out the calculations. Here’s how we would raise them to the power of ten, which
can yield good results:
“ F=imread(“C:/sourcefile.tif”);
F=double(F);
F=F^10;
S=sum(F,1);
[and so on]
The optimal power value will vary from case to case, but it looks like there will be a sweet
spot each time where noise is most fully attenuated, and beyond which raising the power
further will only add noise. Here’s an animation that shows some typical effects of raising
the power of source pixel intensities incrementally by values up to 100:
And here’s the source image for comparison, excerpted from one of Eli Whitney Blake, Jr.’s
1878 photographic sound recordings of the phrase “Brown University” (with height and
width adjusted here to match the scale of the waveform view above):
Larger flecks of visual background noise sometimes produce deflections in the WAV output
which could be got rid of by manually cleaning up the source image beforehand. But the
single most consistent and conspicuous glitch in the audio actually comes from an azimuth
problem where the trace itself runs slightly backwards in time:
O que quer dizer que o método em si parece estar funcionando como pretendido aqui: ele
está identificando o centro de brilho em cada coluna de pixel. Há apenas alguns problemas
com este rastreio de origem específico que não tentamos corrigir e que minha técnica
anterior usando o ImageToSound não teria tratado melhor. Com um rastreamento limpo e
bem formado, essa nova abordagem deve produzir resultados sólidos; e quando não
tivermos muita sorte em nosso material de origem, ele ainda será capaz de lidar com
qualquer coisa que pudermos lançar de uma maneira lógica e consistente, não importa o
quanto seja confuso, assim como minha técnica anterior.
A primeira variante importa o arquivo WAV como um vetor de coluna A (ou se é um arquivo
multicanal, como uma matriz A com canais atribuídos a colunas diferentes e amostras
sucessivas atribuídas a linhas sucessivas - para um arquivo estéreo, a primeira coluna é a
canal direito e a segunda coluna é o canal esquerdo). A segunda variante faz a mesma
coisa ao mesmo tempo que configura samplerate igual à taxa de amostragem e
bitdepthigual à profundidade do bit. A terceira variante importa um arquivo WAV e, em
seguida, exporta uma duplicata dele, como confirmei por meio da experiência. Então, uma
vez lidos em um arquivo WAV, podemos processá-lo de maneiras que podem ser menos
convenientes, ou mesmo impossíveis, usando um software de edição de áudio comum. Por
exemplo, para converter dados de deslocamento em dados de velocidade - como discuti
aqui, de forma mais indireta, há alguns meses - o comando para tomar a derivada de A é
simplesmente:
“
D = diff (A);
“ R (1) = A (1);
para i = 2: (comprimento (D) +1);
R (i) = R (i-1) + D (i-1);
endfor;
I’m not really digressing, by the way, since these are both steps we’ll sometimes want to
carry out on the raw results we get from converting a picture of a sound wave into audio.
Picture Kymophone
It’s possible to convert images into audio using Octave by entering commands one by one
at the command prompt, as I’ve been describing. But it’s tedious and inefficient to key
these sequences in by hand over and over again, so I started piecing together a reusable
“function” to take care of them for me automatically. Over time, as I’ve added in more
features and customizable options, this has grown into several hundred lines of code which
I call Picture Kymophone 1.0. You can download it in a zip file here. (It’s furnished with
no warranty of any kind: use at your own risk.)
To run Picture Kymophone it in its simplest form, place picky.m in a directory somewhere
agreeable to you, navigate to it (e.g., in the Octave GUI File Browse window), and then
enter picky at the Octave command prompt. You’ll then be asked to select an image file to
process. Keep in mind that the function assumes the smaller dimension represents
amplitude, the larger dimension represents time, the time scale runs from left to right or top
to bottom, and the trace is light against a dark background (if it’s not, invert it before
processing). Also, if the image file contains multiple channels, such as RGB, they’ll all be
summed indiscriminately to grayscale. Anyhow, once you’ve selected your source image, it
will get processed and you’ll receive a notification like this:
Haverá agora quatro arquivos WAV no mesmo diretório que picky.m , com nomes de
arquivos deste formulário:
sourcefile_1478341446_pdp.wav
sourcefile_1478341446_pvl.wav
sourcefile_1478341446_idp.wav
sourcefile_1478341446_ivl.wav
"1478341446" é simplesmente uma referência de tempo que indica quando os WAVs foram
gerados - útil para acompanhar os resultados de experiências sucessivas - enquanto
"sourcefile" é o nome da imagem de origem truncada no primeiro período. O elemento final
no nome do arquivo mostra o que as amostras no arquivo representam:
É assim que o Picture Kymophone é executado por padrão, mas você também pode
personalizar um número de variáveis no prompt de comando, assim:
Eu gostaria de poder oferecer uma boa interface gráfica com botões de rádio e assim por
diante, mas no momento, é isso que eu tenho. Uma lista de pdf em uma página acessível
de comandos está disponível aqui . Os onze argumentos precisam aparecer na ordem
exata mostrada e especificam:
Se você inserir valores apenas para algumas das variáveis, a função atribuirá valores
padrão a todas as variáveis subseqüentes. Então, por exemplo:
>> exigente w 0 10
Isso faria com que a função aumentasse os valores de intensidade de pixel para a potência
de dez antes de executar seus cálculos enquanto revertia para os padrões de todos os
outros parâmetros. Ou para limitar a saída WAV ao arquivo "pdp" enquanto nada muda,
você deve digitar:
If you don’t want to downsample your source image, one option would be to build Octave to
allow for larger arrays than 2 Gb, but this looks like a lot of work and I haven’t tried it. As an
alternative, I created two alternative numerical format settings you can invoke with upper-
case D or S. Instead of running calculations on a whole array at once, which is where the
memory problems often arise, these options loop through each of the columns separately in
turn. The trade-off is that the processing takes a bit longer. But if a memory error occurs
when Octave is initially reading the image file, then you’re out of luck and may just need to
scale down your image somehow.
Now let’s consider the processing mode (argument #2). Sometimes we simply want to
convert a single image file into audio, but sometimes we want to tackle a whole group of
images at once (such as separate rotations of a phonautogram or revolutions of a disc after
a polar-to-rectangular-coordinates transform), and we may also want to process them in a
mutually consistent way. With that in mind, I’ve provided for a few different processing
options:
So let’s say we have five separate image files representing successive parts of a given
recording. First we process the images once without generating any WAVs, the first in
mode 1 and the remaining four in mode 2; and then we generate the output WAV files while
processing all five images a second time in mode 3, applying the data we collected about
the cumulative maximum amplitude range during the first pass. This would be cumbersome
to do manually, but I’ve created some additional processing modes to support different kinds
of batch processing:
Arquivos WAV e vetores concatenados são preenchidos com 3.000 amostras de silêncio no
início e no final. A referência “arquivo de clique” marca cada segmento concatenado com
um valor de -1 para a última amostra de uma imagem de origem e +1 para a primeira
amostra da próxima, assim:
Abaixo está um exemplo real que mostra o recurso de “junção” em ação - é uma sequência
de rotações de uma impressão em papel de um disco de gramofone que sofreu uma
transformação de coordenadas polar para retangular que deixou uma curvatura significativa
em cada rotação.
A forma de onda no topo mostra as rotações concatenadas sem ajuste, enquanto a forma
de onda abaixo mostra os resultados ajustados, com uma “trilha de clique” abaixo para
mostrar onde os segmentos foram costurados juntos. A faixa de amplitude exportada do
sinal significativo é minúscula aqui em relação à curvatura rotacional, que não é tão boa
para nossos níveis, mesmo com resolução de 24 ou 32 bits, mas podemos melhorar as
coisas implementando um filtro de 20 Hz antes da exportação, que é precisamente o
cenário em que construí essa funcionalidade para abordar. Os cliques descendente
representam quebras no traço original e podem ser facilmente removidos com ferramentas
padrão de atenuação de ruído por impulso.
Resultados da Amostra
Para ver como a Picture Kymophone lidaria com isso, juntei os três segmentos numerados
à mão em uma única faixa longa e estreita, apaguei apenas os numerais e a dúzia de
partículas de ruído visual e processei o resultado editado usando este comando:
“
exigente w 0 10 d 1 1 0,95 pdp 25770
00:00 00:00
Cleaning up images in graphics editing software before processing them still improves our
results—I haven’t rendered that step obsolete, much as I’d like to. However, getting to hear
something out of an image takes a lot less work now than it did before with my earlier
technique. That makes it much more feasible to test-play a waveform picture and get a
sense for what it will sound like before investing serious time in it.
Next, here’s a source that didn’t lend itself well to my earlier technique: a recording Dayton
Miller made with his phonodeik on May 18, 1909, of himself saying “Lord Rayleigh,”
reproduced as a halftone illustration in his book The Science of Musical Sounds (published
1922, on page 238).
As cristas e vales estão claramente marcados aqui, mas não há muito de um traço de
conexão entre eles. A reprodução dessa gravação usando minha técnica antiga exigiria a
incorporação de cada crista e vale manualmente no Photoshop para criar um limite claro
capaz de conter a ação da ferramenta paintbucket. Mas o Picture Kymophone não precisa
de um limite para encontrar o centro de brilho em cada coluna de pixel. Então eu consegui
unir as duas imagens - há uma pequena sobreposição entre elas - e depois processá-las
em áudio em alguns segundos (marcas representando centésimos de segundo estão
espaçadas em intervalos de aproximadamente 157,2 pixels, daí a taxa de amostragem):
“
exigente w 0 20 d 1 1 0,95 pos 15720
Aqui está o resultado em um arquivo de som com (1) amostras baseadas em deslocamento
e (2) amostras baseadas em velocidade.
00:00 00:00
Em seguida, vamos tentar algum processamento em lote. Com a minha nova ferramenta
na mão, voltei para o trabalho de preparação que eu já havia feito há alguns anos em uma
impressão de papel de um disco de gramofone em um álbum de recortes nos jornais Emile
Berliner na Biblioteca do Congresso, o “Schalldruck” de novembro. 11 de janeiro de 1889:
Eu já havia feito alguma limpeza básica no traçado enquanto ainda era uma espiral,
converti a espiral em linhas paralelas usando uma transformação de coordenadas polar
para retangular e, em seguida, isolei cada uma das 124 rotações em um arquivo de
imagem separado. Da última vez, usando o ImageToSound, eu também precisei gastar
bastante tempo pesquisando o rastreamento de intervalos e juntando-os, além de unir
todas as rotações separadas à mão. Mas desta vez eu coloquei as 124 imagens separadas
em uma pasta como TIFs e executei este comando:
“
exigente x 51 10 d 330 0,008 0,95 pdp 26460
00:00 00:00
Finalmente, eu reprocipei algumas imagens limpas que eu já tinha em mãos para o famoso
9a 9 de abril de 1860 do Au Clair de la Lune, usando este comando (note a maiúscula D
para acomodar arquivos de imagem extraordinariamente grandes):
“ picky s 51 10 D 2
Eu não tenho corrigido a velocidade dos resultados, porque eu sou otimista, eu vou ser
capaz de implementar um algoritmo de correção de velocidade no Octave também, e eu
prefiro dedicar qualquer tempo que eu tenho livre para tais coisas do que para corrigir
arquivos à mão como eu fiz no passado. Os seguintes arquivos de som, portanto, exibem
extrema irregularidade na velocidade de gravação. Eles também combinam um registro
da voz no canal esquerdo com um registro traçado simultaneamente por um diapasão no
canal direito. Com essas ressalvas, aqui está uma transdução de deslocamento (que se
tornou o padrão tradicional para os fonoautogramas):
00:00 00:00
00:00 00:00
Quer experimentar o software você mesmo, mas não tem nenhuma foto adequada à mão
para experimentar? Você é bem-vindo a praticar na imagem de exemplo abaixo, que é uma
varredura de 1200 dpi da vogal “o” como gravada por William Preece e Augustus Stroh em
algum momento antes de fevereiro de 1879, invertida de escuro sobre luz para claro sobre
o escuro mas de outro modo inalterado. (Veja a fonte no contexto aqui .)
Se você decidir dar uma reviravolta na Picture Kymophone, eu apreciaria um relatório de
suas experiências e resultados, sejam eles positivos ou negativos. E se alguém lá fora
puder descobrir uma maneira de construir uma interface de usuário mais conveniente, isso
também seria ótimo.
Anúncios
Compartilhar isso:
Facebook Google
Like
2 bloggers like this.
Posts relacionados