summary refs log tree commit diff
diff options
context:
space:
mode:
authorMalte Voos <git@mal.tc>2025-11-15 01:05:24 +0100
committerMalte Voos <git@mal.tc>2025-11-15 02:14:19 +0100
commit016b76acba13e86df59f818581aa61f7bbaffff8 (patch)
treee88417289428a947d818d3eeaeafbd2df34b4efb
parenta8457a25ccb9b1ef47f5ce9d7ac1a84c47600c9e (diff)
downloadlleap-016b76acba13e86df59f818581aa61f7bbaffff8.tar.gz
lleap-016b76acba13e86df59f818581aa61f7bbaffff8.zip
whisper transcription working
-rw-r--r--Cargo.lock28
-rw-r--r--Cargo.toml2
-rw-r--r--src/subtitle_extraction/embedded.rs8
-rw-r--r--src/subtitle_extraction/whisper.rs100
-rw-r--r--subs.srt644
5 files changed, 762 insertions, 20 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 9519efd..78245df 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1139,6 +1139,12 @@ dependencies = [
 ]
 
 [[package]]
+name = "itoa"
+version = "1.0.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
+
+[[package]]
 name = "jiff"
 version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1248,6 +1254,8 @@ dependencies = [
  "objc",
  "relm4",
  "relm4-components",
+ "serde",
+ "serde_json",
  "system-deps",
  "tracker",
  "unicode-segmentation",
@@ -1638,6 +1646,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
 
 [[package]]
+name = "ryu"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
+[[package]]
 name = "scopeguard"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1656,6 +1670,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
 dependencies = [
  "serde_core",
+ "serde_derive",
 ]
 
 [[package]]
@@ -1679,6 +1694,19 @@ dependencies = [
 ]
 
 [[package]]
+name = "serde_json"
+version = "1.0.145"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
+dependencies = [
+ "itoa",
+ "memchr",
+ "ryu",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
 name = "serde_spanned"
 version = "0.6.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index ed363f7..f7e008c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -20,6 +20,8 @@ log = "0.4"
 tracker = "0.2.2"
 unicode-segmentation = "1.12.0"
 isolang = { git = "https://github.com/humenda/isolang-rs" }
+serde = { version = "1.0.228", features = ["derive"] }
+serde_json = "1.0.145"
 
 [target.'cfg(target_os = "macos")'.dependencies]
 cocoa = "0.26"
diff --git a/src/subtitle_extraction/embedded.rs b/src/subtitle_extraction/embedded.rs
index 5cdf813..0ba6178 100644
--- a/src/subtitle_extraction/embedded.rs
+++ b/src/subtitle_extraction/embedded.rs
@@ -53,9 +53,9 @@ fn parse_subtitle(
     packet: &ffmpeg::Packet,
     time_base: Rational,
 ) -> Option<SubtitleCue> {
-    let time_to_clock_time = |time: i64| {
+    let pts_to_clock_time = |pts: i64| {
         let nseconds: i64 =
-            (time * time_base.numerator() as i64 * 1_000_000_000) / time_base.denominator() as i64;
+            (pts * time_base.numerator() as i64 * 1_000_000_000) / time_base.denominator() as i64;
         gst::ClockTime::from_nseconds(nseconds as u64)
     };
 
@@ -72,8 +72,8 @@ fn parse_subtitle(
         .collect::<Vec<String>>()
         .join("\n— ");
 
-    let start = time_to_clock_time(packet.pts()?);
-    let end = time_to_clock_time(packet.pts()? + packet.duration());
+    let start = pts_to_clock_time(packet.pts()?);
+    let end = pts_to_clock_time(packet.pts()? + packet.duration());
 
     Some(SubtitleCue { start, end, text })
 }
diff --git a/src/subtitle_extraction/whisper.rs b/src/subtitle_extraction/whisper.rs
index 5622d6f..ffa2e47 100644
--- a/src/subtitle_extraction/whisper.rs
+++ b/src/subtitle_extraction/whisper.rs
@@ -1,10 +1,22 @@
-use std::sync::mpsc;
+use std::{
+    io::{self, BufRead, BufReader},
+    net::{TcpListener, TcpStream},
+    sync::mpsc,
+};
 
 use anyhow::Context;
-use ffmpeg::filter;
+use ffmpeg::{filter, frame};
+use serde::Deserialize;
 
 use crate::{subtitle_extraction::*, tracks::StreamIndex};
 
+#[derive(Debug, Deserialize)]
+struct WhisperCue {
+    start: u64,
+    end: u64,
+    text: String,
+}
+
 pub fn generate_whisper_subtitles(
     // stream index to use when storing generated subtitles, this index
     // already has to be in TRACKS when this function is called!
@@ -14,6 +26,13 @@ pub fn generate_whisper_subtitles(
     packet_rx: mpsc::Receiver<ffmpeg::Packet>,
     sender: ComponentSender<SubtitleExtractor>,
 ) -> anyhow::Result<()> {
+    // FFmpeg's whisper filter will send the generated subtitles to us as JSON
+    // objects over a TCP socket. This is the best solution I could find
+    // because we need to use one of the protocols in
+    // https://ffmpeg.org/ffmpeg-protocols.html, and TCP is the only one on the
+    // list which is portable and supports non-blocking IO in Rust.
+    let tcp_listener = TcpListener::bind("127.0.0.1:0")?;
+
     let mut decoder = context
         .decoder()
         .audio()
@@ -23,14 +42,17 @@ pub fn generate_whisper_subtitles(
 
     let abuffer_args = format!(
         "time_base={}:sample_rate={}:sample_fmt={}:channel_layout=0x{:x}",
-        decoder.time_base(),
+        time_base,
         decoder.rate(),
         decoder.format().name(),
         decoder.channel_layout().bits()
     );
+
     let whisper_args = format!(
-        "model={}:queue={}:format=json",
-        "/Users/malte/repos/lleap/whisper-models/ggml-large-v3.bin", 30
+        "model={}:queue={}:destination=tcp\\\\://127.0.0.1\\\\:{}:format=json",
+        "/Users/malte/repos/lleap/whisper-models/ggml-large-v3.bin",
+        30,
+        tcp_listener.local_addr()?.port()
     );
     let filter_spec = format!("[src] whisper={} [sink]", whisper_args);
 
@@ -45,31 +67,77 @@ pub fn generate_whisper_subtitles(
     let mut source_ctx = filter.get("src").unwrap();
     let mut sink_ctx = filter.get("sink").unwrap();
 
+    let (tcp_stream, _) = tcp_listener.accept()?;
+    tcp_stream.set_nonblocking(true)?;
+
+    let mut transcript_reader = BufReader::new(tcp_stream);
+    let mut line_buf = String::new();
+
     while let Ok(packet) = packet_rx.recv() {
-        handle_packet(&mut decoder, source_ctx.source(), sink_ctx.sink(), packet)
-            .unwrap_or_else(|e| log::error!("error handling audio packet: {}", e))
+        handle_packet(
+            stream_ix,
+            &sender,
+            &mut decoder,
+            source_ctx.source(),
+            sink_ctx.sink(),
+            &mut transcript_reader,
+            &mut line_buf,
+            packet,
+        )
+        .unwrap_or_else(|e| log::error!("error handling audio packet: {}", e))
     }
 
     Ok(())
 }
 
+// TODO: can we do this without passing all the arguments? this is kinda ugly
 fn handle_packet(
+    stream_ix: StreamIndex,
+    sender: &ComponentSender<SubtitleExtractor>,
     decoder: &mut ffmpeg::decoder::Audio,
     mut source: filter::Source,
     mut sink: filter::Sink,
+    transcript_reader: &mut BufReader<TcpStream>,
+    line_buf: &mut String,
     packet: ffmpeg::Packet,
 ) -> anyhow::Result<()> {
-    let mut in_frame = unsafe { ffmpeg::Frame::empty() };
     decoder.send_packet(&packet)?;
-    decoder.receive_frame(&mut in_frame)?;
-    source.add(&in_frame)?;
 
-    let mut out_frame = unsafe { ffmpeg::Frame::empty() };
-    sink.frame(&mut out_frame)?;
-
-    if let Some(text) = out_frame.metadata().get("lavfi.whisper.text") {
-        println!("{}", text);
+    let mut decoded = frame::Audio::empty();
+    while decoder.receive_frame(&mut decoded).is_ok() {
+        source.add(&decoded)?;
     }
 
-    Ok(())
+    let mut out_frame = frame::Audio::empty();
+    while sink.frame(&mut out_frame).is_ok() {}
+
+    line_buf.clear();
+    match transcript_reader.read_line(line_buf) {
+        Ok(_) => {
+            let whisper_cue: WhisperCue = serde_json::from_str(&line_buf)?;
+
+            let cue = SubtitleCue {
+                start: gst::ClockTime::from_mseconds(whisper_cue.start),
+                end: gst::ClockTime::from_mseconds(whisper_cue.end),
+                text: whisper_cue.text,
+            };
+
+            // TODO deduplicate this vs. the code in embedded.rs
+            SUBTITLE_TRACKS
+                .write()
+                .get_mut(&stream_ix)
+                .unwrap()
+                .cues
+                .push(cue.clone());
+            sender
+                .output(SubtitleExtractorOutput::NewCue(stream_ix, cue))
+                .unwrap();
+
+            Ok(())
+        }
+        Err(e) => match e.kind() {
+            io::ErrorKind::WouldBlock => Ok(()),
+            _ => Err(e)?,
+        },
+    }
 }
diff --git a/subs.srt b/subs.srt
new file mode 100644
index 0000000..5442ab9
--- /dev/null
+++ b/subs.srt
@@ -0,0 +1,644 @@
+0
+00:00:00.000 --> 00:00:00.040
+...
+
+0
+00:00:00.040 --> 00:00:13.000
+Alors, comment ça s'est passé ?
+
+0
+00:00:13.000 --> 00:00:17.180
+Formidable.
+
+0
+00:00:17.180 --> 00:00:23.000
+Vous voulez pas en parler ?
+
+0
+00:00:23.000 --> 00:00:25.040
+Si, je veux en parler.
+
+1
+00:00:29.994 --> 00:00:37.894
+Ça s'est passé quand ?
+
+1
+00:00:37.894 --> 00:00:38.414
+Ce matin.
+
+1
+00:00:38.414 --> 00:00:56.054
+Elle a pris ça comment ?
+
+1
+00:00:56.054 --> 00:00:58.814
+À votre avis ?
+
+1
+00:00:58.814 --> 00:00:59.974
+Et vous ?
+
+2
+00:00:59.988 --> 00:01:02.428
+ou à une vraie partie de plaisir.
+
+2
+00:01:02.428 --> 00:01:08.748
+Ça va ?
+
+2
+00:01:08.748 --> 00:01:09.428
+Je pars.
+
+2
+00:01:09.428 --> 00:01:12.788
+Tu pars où ?
+
+2
+00:01:12.788 --> 00:01:13.388
+En Jordanie.
+
+2
+00:01:13.388 --> 00:01:17.128
+Pour quoi faire ?
+
+2
+00:01:17.128 --> 00:01:19.488
+J'ai accepté un poste au lycée français d'Aman.
+
+2
+00:01:19.488 --> 00:01:23.368
+Mais longtemps ?
+
+2
+00:01:23.368 --> 00:01:24.688
+Ça remplace moi, je sais pas combien de temps.
+
+3
+00:01:29.983 --> 00:01:42.983
+Paul, tu es en train de me dire que tu pars ou tu es en train de me dire autre chose ?
+
+3
+00:01:42.983 --> 00:01:47.223
+Les deux.
+
+3
+00:01:47.223 --> 00:01:51.423
+Vous avez adopté quelle stratégie finalement ?
+
+3
+00:01:51.423 --> 00:01:51.983
+La plus nulle.
+
+3
+00:01:51.983 --> 00:01:54.023
+C'est une nuit à pas de stratégie.
+
+3
+00:01:54.023 --> 00:01:58.323
+Celle qui est naze, triste, juste on s'arrête quoi.
+
+4
+00:01:59.978 --> 00:02:03.938
+Vous avez dit quoi ?
+
+4
+00:02:03.938 --> 00:02:05.138
+Les trucs les plus nuls de la Terre.
+
+4
+00:02:05.138 --> 00:02:08.358
+Que je ne parvenais plus à comprendre ce que je faisais à Damas.
+
+4
+00:02:08.358 --> 00:02:10.978
+Que je vivais mal à mon divorce.
+
+4
+00:02:10.978 --> 00:02:14.398
+Que je ne supportais pas de vieillir, d'être prof.
+
+4
+00:02:14.398 --> 00:02:16.678
+Que ma fille me manquait.
+
+4
+00:02:16.678 --> 00:02:20.438
+Bref, qu'il fallait que je parte et que je devais partir seul.
+
+4
+00:02:20.438 --> 00:02:27.358
+Et qu'est-ce qu'elle a dit, elle ?
+
+4
+00:02:27.358 --> 00:02:29.358
+Qu'est-ce que vous voulez qu'elle dise ?
+
+5
+00:02:29.972 --> 00:02:31.772
+Elle m'a insulté.
+
+5
+00:02:31.772 --> 00:02:36.572
+Ça ne l'est pas.
+
+5
+00:02:36.572 --> 00:02:36.952
+Elle a rêvé.
+
+5
+00:02:36.952 --> 00:02:39.032
+Elle a un peu pleuré.
+
+5
+00:02:39.032 --> 00:02:47.412
+Je savais que tu n'allais pas rester éternellement en Syrie, surtout en ce moment.
+
+5
+00:02:47.412 --> 00:02:50.472
+Enfin, la scène habituelle, quoi. Je la largue un peu brutalement quand même.
+
+5
+00:02:50.472 --> 00:02:52.132
+Ça ne me dérangeait pas.
+
+5
+00:02:52.132 --> 00:02:56.232
+Je crois même que ça m'arrangeait à cause de Marwan.
+
+5
+00:02:56.232 --> 00:02:57.732
+Elle m'a crié dessus.
+
+6
+00:02:59.967 --> 00:03:02.407
+C'est triste.
+
+6
+00:03:02.407 --> 00:03:09.567
+Moi aussi, je suis triste.
+
+6
+00:03:09.567 --> 00:03:13.187
+Je t'aime bien.
+
+6
+00:03:13.187 --> 00:03:17.307
+C'est très bien.
+
+6
+00:03:17.307 --> 00:03:22.027
+Et puis c'est bien que tu me dises ça comme ça.
+
+6
+00:03:22.027 --> 00:03:25.047
+J'aurais pas aimé le savoir trop à l'avance.
+
+7
+00:03:29.962 --> 00:03:32.002
+Elle a voulu me jeter son sac au visage, mais elle s'est retenue.
+
+7
+00:03:32.002 --> 00:03:33.862
+Elle est partie.
+
+7
+00:03:33.862 --> 00:03:38.002
+En claquant la porte ?
+
+7
+00:03:38.002 --> 00:03:39.222
+En claquant la porte.
+
+7
+00:03:39.222 --> 00:03:47.862
+Bon, il va être temps que je quitte le pays, moi.
+
+7
+00:03:47.862 --> 00:03:51.242
+Il n'y a pas trop le choix, hein ?
+
+7
+00:03:51.242 --> 00:03:52.282
+Non.
+
+7
+00:03:52.282 --> 00:03:56.262
+Bon, je vais couper.
+
+7
+00:03:56.262 --> 00:03:57.222
+Ok, à bientôt.
+
+7
+00:03:57.222 --> 00:03:58.062
+À bientôt.
+
+8
+00:03:59.956 --> 00:04:09.956
+♪♪
+
+8
+00:04:09.956 --> 00:04:19.956
+♪♪
+
+8
+00:04:19.956 --> 00:04:29.956
+♪♪
+
+9
+00:04:29.951 --> 00:04:43.131
+Vous allez avec eux, moi je vous suivrai derrière.
+
+9
+00:04:43.131 --> 00:04:47.991
+Bonjour, on m'appelle Pépé.
+
+9
+00:04:47.991 --> 00:04:50.011
+Et moi c'est Mémé.
+
+9
+00:04:50.011 --> 00:04:50.691
+Enchanté.
+
+9
+00:04:50.691 --> 00:04:52.211
+Derrière c'est la mule.
+
+10
+00:04:59.946 --> 00:05:22.606
+C'est quoi le programme ?
+
+10
+00:05:22.606 --> 00:05:24.766
+On vous conduit à votre nouveau chez vous, on va passer par le SASS.
+
+10
+00:05:24.766 --> 00:05:26.666
+Celui de l'étoile ?
+
+10
+00:05:26.666 --> 00:05:27.966
+Non, celui d'opéra.
+
+12
+00:06:29.295 --> 00:06:29.935
+Bon à partir de là,
+
+13
+00:06:29.930 --> 00:06:31.930
+A partir de maintenant, vous passez toujours par un sas.
+
+13
+00:06:31.930 --> 00:06:32.930
+D'accord ?
+
+13
+00:06:32.930 --> 00:06:34.930
+Quelle que soit votre destination, vous passez par un sas.
+
+13
+00:06:34.930 --> 00:06:39.930
+Et si vous allez boulevard Mortier ou si vous en revenez, vous passez par un sas et vous changez de moyen de locomotion.
+
+13
+00:06:39.930 --> 00:06:40.930
+D'accord ?
+
+13
+00:06:40.930 --> 00:06:43.930
+Si vous venez à pied, vous prenez une voiture et vice versa.
+
+13
+00:06:43.930 --> 00:06:46.930
+D'accord.
+
+14
+00:06:59.924 --> 00:07:04.924
+I'm going to make a fire.
+
+14
+00:07:04.924 --> 00:07:09.924
+I'll make a fire with a fire extinguisher.
+
+14
+00:07:09.924 --> 00:07:14.924
+I'll make a fire with a fire extinguisher.
+
+14
+00:07:14.924 --> 00:07:19.924
+I'll make a fire with a fire extinguisher.
+
+14
+00:07:19.924 --> 00:07:24.924
+I'll make a fire with a fire extinguisher.
+
+14
+00:07:24.924 --> 00:07:29.884
+Takk for watching!
+
+15
+00:07:29.919 --> 00:07:43.919
+موسيقى
+
+15
+00:07:43.919 --> 00:07:57.919
+موسيقى
+
+17
+00:08:29.908 --> 00:08:40.308
+Il conduisait à deux à l'heure, il paraît.
+
+17
+00:08:40.308 --> 00:08:42.768
+Il était complètement ivre.
+
+17
+00:08:42.768 --> 00:08:45.748
+Il aurait dit aux policiers qu'il allait lentement parce qu'il avait peur d'avoir un incident.
+
+17
+00:08:45.748 --> 00:08:47.288
+Ils l'ont amené au poste.
+
+17
+00:08:47.288 --> 00:08:50.888
+Là, c'est là qu'a eu lieu l'interpellation, à Belouisdad.
+
+17
+00:08:50.888 --> 00:08:53.248
+Au centre d'Alger, tout près du Sofitel.
+
+17
+00:08:53.248 --> 00:08:58.368
+Ça, c'est la reconstitution du trajet à partir des points où le téléphone a borné.
+
+17
+00:08:59.468 --> 00:08:59.868
+Merci.
+
+18
+00:08:59.903 --> 00:09:00.763
+J'ai suivi cet itinéraire.
+
+18
+00:09:00.763 --> 00:09:07.283
+Là, c'est le commissariat de police de Belouisdad.
+
+18
+00:09:07.283 --> 00:09:08.903
+Et depuis ?
+
+18
+00:09:08.903 --> 00:09:10.543
+Depuis, il n'a pas bougé.
+
+18
+00:09:10.543 --> 00:09:12.623
+On vérifie tous les quarts d'heure.
+
+18
+00:09:12.623 --> 00:09:14.663
+Cyclone est toujours à l'intérieur.
+
+18
+00:09:14.663 --> 00:09:16.723
+On a mis une équipe devant l'entrée.
+
+18
+00:09:16.723 --> 00:09:18.903
+Vous êtes sûr que Cyclone était bourré ?
+
+18
+00:09:18.903 --> 00:09:20.123
+Ouais.
+
+18
+00:09:20.123 --> 00:09:22.163
+Mais il y avait pas mal de témoins.
+
+18
+00:09:22.163 --> 00:09:25.903
+Il était musulman pratiquant ?
+
+18
+00:09:25.903 --> 00:09:26.863
+Ouais.
+
+19
+00:09:29.898 --> 00:09:35.058
+Je propose qu'on envoie quelqu'un au commissariat pour vérifier dans quel état il est.
+
+19
+00:09:35.058 --> 00:09:37.178
+Très bien. Et dès qu'il sort, vous me promenez.
+
+19
+00:09:37.178 --> 00:09:45.938
+Dites-moi, vous l'aviez entraîné à subir un interrogatoire sous alcool, je suppose ?
+
+19
+00:09:45.938 --> 00:09:46.338
+Bien sûr.
+
+19
+00:09:46.338 --> 00:09:50.038
+Je peux voir les enregistrements ? J'aimerais bien savoir comment il s'en était sorti.
+
+19
+00:09:50.038 --> 00:09:53.678
+Il s'en était bien sorti ?
+
+19
+00:09:53.678 --> 00:09:55.578
+Ouais. Je vous les trouve.
+
+20
+00:09:59.892 --> 00:10:02.892
+Vous avez besoin de quelque chose, monsieur Manon ?
+
+20
+00:10:02.892 --> 00:10:04.892
+Non, non, ça va, ça va.
+
+21
+00:10:29.887 --> 00:10:37.367
+Il vient d'arriver.
+
+21
+00:10:37.367 --> 00:10:39.447
+C'est une rôle, ça.
+
+21
+00:10:39.447 --> 00:10:43.607
+J'ai déjà essayé chez le DG, ça doit te coûter un peu du cul.
+
+21
+00:10:43.607 --> 00:10:45.207
+Tu peux le dire, ouais.
+
+21
+00:10:45.207 --> 00:10:47.267
+Ça, c'est fini le dos coincé.
+
+21
+00:10:47.267 --> 00:10:49.647
+Tu veux que je t'aille à le déballer ?
+
+21
+00:10:49.647 --> 00:10:51.727
+Non, merci. Plus tard.
+
+22
+00:10:59.882 --> 00:11:10.782
+Si y a quelque chose qui m'a échappé une fois, c'est ma chatte en pêche de foie.
+
+22
+00:11:10.782 --> 00:11:20.402
+Oui, monsieur Jacques.
+
+22
+00:11:20.402 --> 00:11:22.022
+Il a été muté.
+
+22
+00:11:22.022 --> 00:11:24.882
+Il a fait une offre qu'il pouvait pas refuser.
+
+22
+00:11:24.882 --> 00:11:26.882
+Promotion ou quoi ?
+
+22
+00:11:26.882 --> 00:11:28.762
+Moi, j'avais compris.
+
+23
+00:11:29.876 --> 00:11:30.976
+Il m'en avait informé.
+
+23
+00:11:30.976 --> 00:11:35.176
+Donc c'est moi qui serai votre nouveau référent au Droneur.
+
+23
+00:11:35.176 --> 00:11:36.876
+Je m'appelle Raymond Cisteron.
+
+23
+00:11:36.876 --> 00:11:40.576
+Cisteron ?
+
+23
+00:11:40.576 --> 00:11:40.936
+Bon.
+
+23
+00:11:40.936 --> 00:11:42.996
+Et vous êtes un...
+
+23
+00:11:42.996 --> 00:11:44.476
+Oui, j'ai étudié les dossiers dans le détail.
+
+23
+00:11:44.476 --> 00:11:48.896
+Si vous êtes d'accord, on va commencer par celui du colonel Bazir.
+
+23
+00:11:48.896 --> 00:11:50.536
+D'accord.
+
+24
+00:11:59.871 --> 00:12:17.171
+Qu'est-ce que c'est ?
+
+24
+00:12:17.171 --> 00:12:19.131
+Château Giravates 2005.
+
+24
+00:12:19.131 --> 00:12:20.991
+Un Pauillac du très bon.
+
+24
+00:12:20.991 --> 00:12:24.251
+Vous voulez que je le boive ?
+
+24
+00:12:24.251 --> 00:12:25.711
+Vous voulez boire autre chose ?
+
+24
+00:12:25.711 --> 00:12:26.871
+La bière, la vodka ?
+
+25
+00:12:29.866 --> 00:12:34.026
+Je suis un peu embêté, mais vous savez que je n'ai pas le droit de boire de l'alcool, c'est contraire à ma religion.
+
+25
+00:12:34.026 --> 00:12:36.486
+Vous allez faire une entorse.
+
+25
+00:12:36.486 --> 00:12:41.286
+On doit tester votre capacité à réciter votre légende sous alcool.
+
+25
+00:12:41.286 --> 00:12:45.326
+Désolé, ce n'est pas possible.
+
+25
+00:12:45.326 --> 00:12:49.286
+Rachid, vous allez boire, ce n'est pas la peine de discuter, c'est le protocole.
+
+25
+00:12:49.286 --> 00:12:54.466
+En même temps, si vous m'envoyez à Alger, c'est aussi parce que je suis musulman.
+
+25
+00:12:55.286 --> 00:12:59.826
+Il est impossible de vous laisser partir si on ne sait pas comment vous tenez votre légende quand vous perdez le compte.
+
+26
+00:12:59.860 --> 00:13:00.260
+Je contrôle.
+
+26
+00:13:00.260 --> 00:13:06.900
+Si je n'avais jamais bu une goutte d'alcool,
+
+26
+00:13:06.900 --> 00:13:07.960
+je n'en boirais jamais de mon plein gré.
+
+26
+00:13:07.960 --> 00:13:11.160
+Si je me trouve dans une situation où on m'oblige à boire,
+
+26
+00:13:11.160 --> 00:13:12.780
+c'est que je suis déjà dans une très mauvaise posture.
+
+26
+00:13:12.780 --> 00:13:14.200
+Vous êtes d'accord ?
+
+26
+00:13:14.200 --> 00:13:15.480
+C'est que ma légende, elle pèse plus grand-chose.
+
+26
+00:13:15.480 --> 00:13:19.660
+Si on en est à me faire boire en Algérie,
+
+26
+00:13:19.660 --> 00:13:21.700
+c'est que c'est déjà trop tard.
+
+27
+00:13:29.855 --> 00:13:31.495
+Vous êtes vraiment buté.
+