2015-05-30 2 views
1

У меня возникли проблемы с компиляцией этой программы. .Ошибка кода на Python 2.7

Я новичок в python.I Я использую Python 2.7 (Anaconda)

Вот код:

import numpy as numpy 
import scipy 
from scipy.io.wavfile import read 
from scipy.io.wavfile import write 
def getwavdata(file): 
return scipy.io.wavfile.read(file)[1] 
data=getwavdata('myvoice.wav') 
print data 
frameDuration = 0.01 

frequency   = 44100 
numSamplesPerFrame = int(frequency * frameDuration) 
frameSize=int(frequency*frameDuration) 
signalEnergy=sum([ abs(x)**2 for x in data ]) 
print 'signal energy',signalEnergy 
threshold=signalEnergy/3 
print threshold 
base=0 
i=0 
    count=0 
wordNumber=0 
length=len(data) 
    print 'length of data is', length 
word=[] 
while i<length: 
    #print 'entered while loop' 
     frame=data[base:frameSize] 
    base=base+frameSize 
    frameEnergy=sum([ abs(x)**2 for x in frame ]) 
    if frameEnergy < threshold: 
     count=count+1 
     word.append(frame) 
     word=numpy.array(word) 
    else : 
     count=0 
     word=[] 
    if count == 4: 
     print 'silence expected' 
     wordNumber=wordNumber+1 
     scipy.io.wavfile.write('word%d.wav' %wordNumber,44100,word) 
     count=0 
     word=[] 
     i = i+1 

Теперь проблему когда я первый запустил эту программу, напечатанными некоторые ожидали значения.

Он напечатан signalEnergy = некоторое значение около 3000000 и порога = некоторое значение около 1000000. (1/3 signalEnergy), но с ошибкой здесь:

scipy.io.wavfile.write('word%d.wav' %wordNumber,44100,word) 

ошибка: список имеет нет массива атрибутов (что-то вроде этого. Не помню точного предложения)

Я нашел googled и обнаружил, что write() принимает массив как один аргумент.

Попытка исправить эту ошибку привела к тому, что вся программа не работает.

Теперь для signalEnergy и порога, я получаю массив из двух значений вместо одного значения.

Изменения, которые я сделал:

while (base+frameSize)<length: 
    #print 'entered while loop' 
    frame=data[base:base+frameSize] 
    frameEnergy=sum([ abs(x)**2 for x in frame ]) 
    print frameEnergy 
    if frameEnergy.all() < threshold.all(): 
     count=count+1 
     word.append(frame) 
    else: 
     count=0 
     word=[] 
    if count == 4: 
     print 'word detected' 
     wordNumber=wordNumber+1 
     word = numpy.array(word) 
     scipy.io.wavfile.write('word'+str(wordNumber)+'.wav',44100,word) 
     count=0 
     word=[] 
    base = base + frameSize 

Error: 

[-29501 24682](**this is what it is giving as signalEnergy now**) 


[-9834 8227] 


length of data is 122240 
Traceback (most recent call last): 
File "C:\Users\Nancy Semwal\Documents\Python Scripts\program2.py",  line 34, in <module> 


if frameEnergy < threshold: 


ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Я понимаю ошибку, но то, что я не могу получить, что, почему это правильно баллотировался в первый раз?

В чем может быть причина? Какие изменения я должен внести?

+0

Какая часть кода относится к вопросу? Удалите все, что не имеет значения. –

ответ

0

Это очень трудно читать код и понять точные ошибки, которые вы получаете, но я вижу несколько очевидных ошибок, которые могут двигаться вам вместе:

  1. В своем первом коде, срез списка:
    frame=data[base:frameSize]
    прекратит работать, как только вы запустите цикл frameSize. Поскольку вы никогда не увеличиваете свою верхнюю границу. В основном нарезка:
    myList[included_bottom_bound:excluded_top_bound]

    Вы, кажется, зафиксировали, что в вашей второй карусели, хотя с
    frame=data[base:base+frameSize]
    хотя я не 100% уверен, что ваши намерения. Похоже, вы просматриваете звуковой файл для небольших томов. В первый раз через вас каждый шаг идет на шаг вперед и смотрит на следующий фрагмент данных, а во второй раз вы смотрите на кусок, а затем перемещаете шаг на шаг вперед. Представьте, что звуковой файл выглядел так:
    *--*
    где * (звезда) означает большой объем и - (тире) означает низкий объем. Представьте, что у вашего frameSize было 2.Шагая 1 шаг в то время (как в попытке 1) вы бы 4 образца
    1. * -
    2. -
    3. - *
    4. *
    и вы обнаружите раздел низкой громкости в (пункт № 2 выше).
    С помощью нового способа делать вещи, которые вы бы в конечном итоге с 2-х образцов только
    1. * -
    2. - *
    и в конечном итоге отсутствует раздел низкой громкости вы охота на.
  2. Что сделка с линией:
    if frameEnergy.all() < threshold.all():
    frameEnergy является суммой, так что это будет в Int или длинным или что-то числовое, по крайней мере. Вы не можете сделать все() на что-то подобное. То же самое касается порога.

Глядя на ваши комментарии, похоже, что signalEnergy теперь не простое число? Это кажется странным. Может быть, вы должны добавить в свой код еще несколько инструкций печати и выяснить, почему.
Я загрузил образец wav-файла и запустил ваш код против него, и он сработал и напечатал кучу файлов wordX.wav. Они не играли против вас, но код работал. Я исправил проблемы с пробелами и т. Д., Но ... Вот мой окончательный код:

<pre><code>import numpy as numpy 
import scipy 
from scipy.io.wavfile import read 
from scipy.io.wavfile import write 
def getwavdata(file): 
    return scipy.io.wavfile.read(file)[1] 
data=getwavdata('E:\\Music\\Sounds\\carlin_letter.wav') 
print data 
frameDuration = 0.01 

frequency   = 44100 
numSamplesPerFrame = int(frequency * frameDuration) 
frameSize=int(frequency*frameDuration) 
signalEnergy=sum([ abs(x)**2 for x in data ]) 
print 'signal energy',signalEnergy 
threshold=signalEnergy/3 
print threshold 
base=0 
i=0 
count=0 
wordNumber=0 
length=len(data) 
print 'length of data is', length 
word=[] 
while (base+frameSize)&lt;length: 
    #print 'entered while loop' 
    frame=data[base:base+frameSize] 
    frameEnergy=sum([ abs(x)**2 for x in frame ]) 
    print frameEnergy 
    if frameEnergy &lt; threshold: 
     count=count+1 
     word.append(frame) 
    else: 
     count=0 
     word=[] 
    if count == 4: 
     print 'word detected' 
     wordNumber=wordNumber+1 
     word = numpy.array(word) 
     scipy.io.wavfile.write('e:\\music\\sounds\\word'+str(wordNumber)+'.wav',44100,word) 
     count=0 
     word=[] 
    base = base + frameSize 
print "done"</code></pre> 
+0

да .. это то, что я не могу понять. Я сделал эту функцию threshold.all() после прочтения ошибки. SignalEnergy и Threshold должны иметь бесчисленные значения, бог знает, почему программа дает 2-элементный массив вместо одно значение для них. – Nancy

+0

Кроме того, извините за ужасное форматирование и длинный код. Я новичок в StackOverflow..так будет учиться писать лучшие вопросы. – Nancy

Смежные вопросы