Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Playbackrate & Pitch bei WAV-Dateien (https://www.delphipraxis.net/51452-playbackrate-pitch-bei-wav-dateien.html)

Vroomfondel 12. Aug 2005 14:53


Playbackrate & Pitch bei WAV-Dateien
 
Hallo zusammen,

ich programmiere zur Zeit eine digitales Diktiergerät. Im Grunde ist das nichts anderes als ein simpler Player/Recorder mit der Möglichkeit eine WAV-Datei aufzunehmen, an beliebiger Stelle und in "real-time" einzufügen, zu überschreiben, zu löschen, (hörbar) vor- bzw. zurückzuspulen, Kontrolle des Pegels mit VU-Meter und Verwaltung aufgenommener Diktate. Das ist so weit fertig.
Später werde ich mich wohl noch um die Zusammenarbeit des Programms mit einem Diktiermikrofon (z.B. Philips Speechmike o.ä.) kümmern müssen, aber das ist vorerst nicht mein Problem.
Es geht um folgendes: Damit ein Diktat leichter abgetippt werden kann, sollte die Möglichkeit bestehen, die WAV-Datei langsamer abzuspielen, d.h. die Playbackrate der WAV-Wiedergabe sollte (möglichst stufenlos) regelbar sein. Noch besser wäre es, wenn gleichzeitig der Pitch so angepasst werden könnte, dass die Sprache natürlich, und weniger nach Darth Vader klingt. Beides geht wohl mit der MCI. Möglicherweise aber nicht so wie ich sie verwende (mciSendString). Nur ungern würde ich zu komplizierteren Lösungen greifen, weil sich mit mciSendString ansonsten alles und frappierend einfach realisieren läßt.

Prinzipiell gibt es einen MCI-Befehl zu Einstellung der Playbackrate:
SET alias SPEED [Playbackrate]

...nur scheint der bei WAV-Dateien nicht zu funktionieren. Mit MP3 z.B. geht's. Für den Pitch habe ich bislang kein entsprechendes Kommando gefunden, irgendwie soll es aber möglich sein.

Sieht jemand eine Möglichkeit oder führt kein Weg daran vorbei, maschinennäher in die Materie einzusteigen?

http://www.imgzhost.com/uploads/97d08e932b.gif

dizzy 12. Aug 2005 15:18

Re: Playbackrate & Pitch bei WAV-Dateien
 
Ich habe große Zweifel daran, dass Windows eine Methode mitliefert um Timestretching ohne Pitchshift zu realisieren. Das ist nämlich garnicht so simpel! Es mag die Strings SPEED oder auch PITCH geben (weiss net obs die wirklich gibt, aber wenn :)), jedoch vermute ich stark dass beides sowohl Tonhöhe als auch Länge beeinflussen.

Das wirst du vermutlich von Hand machen müssen. Die einfachste variante ist es, dein Wave zu segmentieren, und zwischen die Segmente gleich lange Abschnitte von Stille einzufügen um auf die Ziellänge zu kommen. Nun noch die jeweils vorhergehenden Segmente so oft (und möglw. auch abgeschnitten) in die zugehörigen stillen Teile zu kopieren.
Was treten da für Probleme auf?
1) Du wirst bei fixer Segmentierung wohl kaum passend immer Nulldurchgänge erwischen. Daher wird das ein ziemliches "Geklicker" im Resultat
2) Es klingt nicht wie natürlich langsamer gesprochen, da der Mensch z.B. Klicklaute wie sie in "t" oder "p" vorkommen NICHT in die Länge zieht. Es wird je nach Größe der Segmente also wie "tttt" oder "pppp" klingen, oder einen komischen Ton erzeugen der nichts mehr mit einem Klicklaut gemein hat ;)

Punkt 1 ließe sich noch auf 2 Arten verbessern:
- Dynamische Segmentierung nur an Nulldurchgängen der Waveform, so dass Schnitte immer mit 0 beginnen und enden (und somit immer aneinander passen). Es bleibt das Problem bei Füllungen die nicht ganz in die Stille passen - sie müssen ja abgeschnitten werden, so dass dort wieder ein Sprung entstehen dürfte.
- Ganz kurzes Crossfading an den Segmentgrenzen. Dies dürfte im Regelfall die bessere, aber auch weit kompliziertere Variante sein.

Bei Punkt 2 gibt es z.B. von Steinberg Tools die analysieren wo Klicklaute vorkommen, und diese gesondert behandeln. Wie die das machen weiss ich aber auch nicht. Die Programme werden aber nicht umsonst eine Kleinigkeit kosten ;).

Was du dir aber denke ich generell abschminken kannst, ist das alles in Realtime zu machen. Am ehesten wirst du mit einem Buffer arbeiten können, so dass du immer eine gewisse Menge vorausberechnest. So einen Buffer für diese Anwendung zu verwalten dürfte aber auch garnicht so einfach mehr sein... Und mit den MCI-Klamotten wirdst du dann auch nicht mehr arbeiten können, da du ja rohe Daten ausgeben musst. Da wäre evtl. ASIO was für dich. Das einfachste wäre aber, wenn man ein gesamtes File vorausberechnet. Dauert aber im Vorfeld, und Änderungen mitten beim Abspielen wären dann auch nicht mehr möglich.
Da müsstest du abwägen ob dir die Dynamik so viel Mehraufwand wert ist.

Gruss,
Fabian

Wishmaster 14. Aug 2005 06:18

Re: Playbackrate & Pitch bei WAV-Dateien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi

@Vroomfondel

Warum nimmst du nicht bass.dll? damit kannst du doch alles machen was du vorhast.
Tempo, Pich, ASIO, Recording as (mp3, ogg, wav,….)! FX, DSP, Equalizer,…!


Oder was ist mit
FMod-EX v4 Neu [01.08.05]
Es wurde von Grund auf neu geschrieben unter Rückblick auf 10 Jahre Erfahrung durch FMOD!

http://www.fmod.de/
http://www.fmod.org/


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz