أهلا وسهلا بك! تهدف سلسلة مقالاتي الأولى إلى دراسة طرق ضغط وتخزين الصور / الصوت ، مثل JPEG (صورة) و WAVE (صوت) ، وسوف تتضمن أيضًا أمثلة لبرامج تستخدم هذه التنسيقات (.jpg ، .wav) في الممارسة. في هذا الجزء سوف ننظر في الموجة.
القصة
WAVE (تنسيق ملف صوتي Waveform) هو تنسيق ملف حاوية لتخزين تسجيلات دفق الصوت. عادة ما تستخدم هذه الحاوية لتخزين الصوت غير المضغوط في تعديل شفرة النبض. (مقتبس من ويكيبيديا)
تم اختراعه ونشره في عام 1991 مع RIFF بواسطة Microsoft و IBM (شركات تكنولوجيا المعلومات الرائدة في ذلك الوقت).
هيكل الملف
يحتوي الملف على جزء رأس ، البيانات نفسها ، لكن لا يوجد تذييل. يزن الرأس إجمالي 44 بايت.
يحتوي الرأس على إعدادات لعدد البتات في العينة ، وتكرار إزالة التعرية ، وعمق الصوت ، إلخ. المعلومات اللازمة للحصول على بطاقة الصوت. (يجب كتابة جميع قيم الجدول الرقمي بترتيب Little-Endian)
موجة مثال
يمكن ترجمة الجدول السابق بسهولة إلى بنية C ، ولكن لغتنا اليوم هي Python. أسهل ما تفعله باستخدام الموجة هو مولد الضوضاء. لهذه المهمة ، نحن لسنا بحاجة إلى بايت عالية وضغط.
للبدء ، نستورد الوحدات اللازمة:
بعد ذلك ، نحتاج إلى إنشاء جميع المتغيرات الضرورية من الجدول وفقًا لأحجامها. تعتمد القيم المتغيرة فيه فقط على numSamples (عدد العينات). كلما زاد عددهم ، كلما طالت مدة الضوضاء.
numSamples = int(argv[1]) output_path = argv[2] chunkId = b'RIFF' Format = b'WAVE' subchunk1ID = b'fmt ' subchunk1Size = b'\x10\x00\x00\x00'
يبقى فقط لكتابتها بالتسلسل اللازم (كما في الجدول):
with open(output_path, 'wb') as fh: fh.write(chunkId + chunkSize + Format + subchunk1ID + subchunk1Size + audioFormat + numChannels + sampleRate + byteRate + blockAlign + bitsPerSample + subchunk2ID + subchunk2Size + data)
وهكذا ، فعلت. لاستخدام البرنامج النصي ، نحتاج إلى إضافة وسيطات سطر الأوامر الضرورية:
python3 WAV.py [num of samples] [output]
عدد العينات - العد عينات
الإخراج - المسار إلى ملف الإخراج
فيما يلي رابط لملف صوتي تم اختباره مع وجود ضوضاء ، ولكن لحفظ الذاكرة ، قمت بخفض BPS إلى 1b / s وانخفض عدد القنوات إلى 1 (مع دفق صوت ستيريو غير مضغوط 32 كيلو بت بسرعة 64 كيلو بايت ، تم إيقاف 80M من ملف .wav نظيف ، و 10 فقط): https: / /instaud.io/3Dcy
الشفرة بأكملها (WAV.py) (تحتوي الشفرة على العديد من القيم المكررة للمتغيرات ، هذا مجرد رسم تخطيطي):
from struct import pack
يؤدي
لذلك تعلمت أكثر قليلاً عن الصوت الرقمي وكيف يتم تخزينه. في هذا المنشور ، لم نستخدم الضغط (audioFormat) ، ولكن لمراجعة كل مقالة شهيرة ستحتاج إلى مقالات 10. آمل أن تكون قد تعلمت شيئًا جديدًا لنفسك وسيساعدك ذلك في التطورات المستقبلية.
شكرا لك
مصادر
هيكل ملف WAV
WAV - ويكيبيديا