diff options
| author | Malte Voos <git@mal.tc> | 2025-11-15 01:05:24 +0100 |
|---|---|---|
| committer | Malte Voos <git@mal.tc> | 2025-11-15 02:14:19 +0100 |
| commit | 016b76acba13e86df59f818581aa61f7bbaffff8 (patch) | |
| tree | e88417289428a947d818d3eeaeafbd2df34b4efb | |
| parent | a8457a25ccb9b1ef47f5ce9d7ac1a84c47600c9e (diff) | |
| download | lleap-016b76acba13e86df59f818581aa61f7bbaffff8.tar.gz lleap-016b76acba13e86df59f818581aa61f7bbaffff8.zip | |
whisper transcription working
| -rw-r--r-- | Cargo.lock | 28 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/subtitle_extraction/embedded.rs | 8 | ||||
| -rw-r--r-- | src/subtitle_extraction/whisper.rs | 100 | ||||
| -rw-r--r-- | subs.srt | 644 |
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é. + |