2017-03-25 3 views
1

J'ai essayé de créer un décodeur audio Morse Code pour un moment maintenant, qui prendrait une entrée audio Morse Code via un micro et le décoder en anglais, en utilisant python. En ce moment ma priorité est de pouvoir reconnaître les dits et les dahs. La façon dont j'ai essayé d'aborder cette partie du décodeur est la suivante:Morse Audio décodage en utilisant Python

import pyaudio 
import struct 
import math 
from datetime import datetime 

thresh = 0.002 
sample_period = 0.01 
RATE = 44100 
sample_cycles = int(RATE*sample_period) 
SHORT_NORMALIZE = (1.0/32768.0) 

CHANNELS = 2 
FORMAT=pyaudio.paInt16 

def rms(sample): 
    count = len(sample)/2 
    format = "%dh"%(count) 
    shorts = struct.unpack(format, sample) 

    sum_squares = 0.0 
    for i in shorts: 

     n = i * SHORT_NORMALIZE 
     sum_squares += n*n 

    return math.sqrt(sum_squares/count) 

pa=pyaudio.PyAudio() 


stream = pa.open(format = FORMAT,      
     channels = CHANNELS,       
     rate = RATE,         
     input = True,         
     frames_per_buffer = sample_cycles) 


thresh_final=thresh 
list1="" 
counter=0 
for i in range(1000): 
    try: 
     sample=stream.read(sample_cycles) 
    except IOError: 
     print("Error Recording") 

    amp=rms(sample) 

    if amp>thresh: 
     list1+="1" 
    else: 
     list1+="0" 
list1=list1.split("0") 
print(list1) 
for i in range(len(list1)): 
    if len(list1[i])==45: 
     print ("Dah") 
    elif len(list1[i])==15: 
     print("Dit") 

Résumé rapide du Code/Cible:

  1. Prélevez un échantillon audio à intervalles
  2. 0,01 s
  3. Obtenez l'amplitude l'échantillon via RMS
  4. Si l'amplitude des échantillons 0,01s est supérieure à un seuil (définie juste pour reconnaître s'il y a un bip ou non), ajoutez '1' à une chaîne sinon '0'
  5. Ensuite, divisez le chaîne dans une liste à travers les zéros (car ce seront les intervalles entre les bips)
  6. Parcourez la liste si la longueur des sous-listes = 15 (15 * 0.01s = 0.15s, qui est le temps que j'utilise pour le dAHS) print « dit », et si la longueur des sous-listes = 45 print « dah »

Comme vous pouvez le dire cela n'a pas été efficace, donc des suggestions quant à la façon dont je pourrais aborder son code Morse décodage?

code Influencé par un autre poste: Detect tap with pyaudio from live mic

Répondre

0

Si vous cherchez toujours une réponse, je trouve une bibliothèque basée python appelé morse-to-text - default qui convertit un fichier de code .wav à text morse. Si vous avez un mp3, commencez par le convertir en wav.
Vous pouvez utiliser intégré pythonwave, ffmpeg ou une bibliothèque de wrapper externe pydub. Voici un exemple utilisant pydub comme très facile à utiliser.

from pydub import AudioSegment 

codefile_mp3 = "sampleMorseCode.mp3" 
codefile_wav = "sampleMorseCode.wav" 
mcode = AudioSegment.from_mp3(codefile_mp3) 
mcode.export(codefile_wav , format="wav") 

Une fois que le fichier de code est converti en morse wav, vous pouvez exécuter morse-to-text.py commandline comme suit, ou appeler dans un script python.

C:\morse-to-text>morse-to-text.py sampleMorseCode.wav 

Sortie:.

.-.. .- | .-. . ... .--. ..- . ... - .- | -.. . | . ... - . | -. .. ...- . .-.. 
| . ... | .- .-.. ..-. .-. . -.. | ...- .- .. .-.. 
LA RESPUESTA DE ESTE NIVEL ES ALFRED VAIL 

Il produit également beaucoup de données sur le signal tels que spectrogram, fft, frequency, filter etc (si vous êtes intéressé

Usage: C:\morse-to-text\morse-to-text.py soundfile.wav [--report[=pdf|=png]] 

Je viens de recevoir un exemple de fichier de code morse à partir du web, donc ce n'est pas en anglais
Espérons que cela aide