Einzelnen Beitrag anzeigen

Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Playbackrate & Pitch bei WAV-Dateien

  Alt 12. Aug 2005, 16:18
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat