يتطلب المشروع استخدام معالجة تغيير الصوت لبيانات الصوت البشري للصوت البشري . بعد الكفاح لمدة أسبوع ، وجدت أخيرًا إطارًا لتنفيذ Java الخالص - TarsOSDSP. قوي جدا! معالجة الصوت في الوقت الحقيقي! بالطبع أنا فقط استخدمت معالجة الملفات. في الواقع ، المنطق هو نفسه
عنوان GitHub الخاص بـ Tarsosdsp: https://github.com/jorensix/tarsosdsp يدمجه في مشاريع المشروع الخاصة به.
رمز فئة أدوات جافا المحدد:
/ *** تغيير الصوت* param rawpcminputStream RAW PCM دفق إدخال البيانات* param معدل تباين speedfactor (0،2) أكبر من 1 هو تسريع سرعة الكلام ، أقل من 1 هو تباطؤ سرعة الكلام* @param معدل تغيير النغمة (0،2) أكبر من 1 هو انخفاض درجة الحرارة (عمق). inputster inputstream staticstream (inputstream final rawpcminputstream ، double speedfactor ، double ratefactor) {tarsosdspaudioformat format = tarsosspaudioformat (16000،16،1 ، true ، false) ؛ AudioInputStream inputStream = AudioInputStream جديد (RawPcMinputStream ، JvMaudioInputStream.toaudioformat (التنسيق) ، Audiosystem.not_specified) ؛ jvMaudioPutStream Stream = new JVMaudioInputStream (inputStream) ؛ waveformsimilaritybasedoverlapadd w = new waveformsimilaritybasedoverlapadd (waveformsimilaritybasedoverlapadd.parameters.speechDefaults (speedfactor ، 16000)) ؛ int inputbuffersize = w.getInputBuffersize () ؛ int verlap = w.getOverlap () ؛ Audiodispatcher Dispatcher = جديد Audiodispatcher (دفق ، inputbuffersize ، تداخل) ؛ W.SetDispatcher (مرسل) ؛ AudioOutputToByTearray Out = AudioOutputToByTearRay () ؛ Dispatcher.Addaudioprocessor (W) ؛ Dispatcher.AddaudaOprocessor (New Ratetransposer (RateFactor)) ؛ Dispatcher.AddaudaOprocessor (Out) ؛ Dispatcher.run () ؛ إرجاع bytearrayinputStream (OutData ()) ؛ }رمز نسخة البيانات (AudioOutputTobyTearray) هو كما يلي:
الطبقة العامة AudioOutputTobyTearray تنفذ المعالجات السمعية {private boolean isDone = false ؛ بايت خاص [] خارج = فارغ ؛ خاص BytearRayoutputStream BOS ؛ AudioOutputToByTearRay () {bos = new ByTearRayOutputStream () ؛ } public byte [] getData () {بينما (! isDone && out == null) {try {thread.sleep (10) ؛ } catch (تم تجاهل interruptedException) {}} العودة ؛ } Override Public Boolean Process (AudioEvent AudioEvent) {Bos.Write (AudioEvent.getByTebuffer () ، 0 ، AudioEvent.getByTebuffer (). الطول) ؛ العودة صحيح. } Override public void processingfinishized () {out = bos.tobytearray (). clone () ؛ BOS = فارغة ؛ isDone = صحيح ؛ }}يمكنك تشغيل الصوت من خلال هذه الأداة:
/** * تشغيل PCM * * لا تتصل في بيئات غير desktop. . . ماذا تعرف ما سيحدث* param RawPcMinputStream Raw PCM دفق إدخال البيانات* throws lineUnavailable*/ public static static play (inpectstream rawpcminputstream) يطرح LineUnavailable {tarsosdaudioformat format = new tarssdormatormat (16000،16،1 AudioInputStream inputStream = AudioInputStream جديد (RawPcMinputStream ، JvMaudioInputStream.toaudioformat (التنسيق) ، Audiosystem.not_specified) ؛ jvMaudioPutStream Stream = new JVMaudioInputStream (inputStream) ؛ Audiodispatcher Dispatcher = جديد Audiodispatcher (دفق ، 1024 ، 0) ؛ Dispatcher.Addaudioprocessor (New Audioplayer (Format ، 1024)) ؛ Dispatcher.run () ؛ }