От остановки до готовой сводки: этапы, заметки и что может пойти не так.
Остановка завершает запись и запускает всё остальное. Звук уходит на серверы Chui, там его расшифровывают и составляют сводку. На телефоне запись надёжно сохраняется на устройстве ещё до всего этого. Если связи нет, запись ждёт и отправляется, когда связь появится. Из-за плохой сети ничего не теряется, и нажимать ничего не нужно.
На Mac или Windows запись не теряется, если Chui закрылся, пока она ещё останавливалась: при следующем запуске Chui находит эту запись и загружает её во встречу, которую ты начал, вместе с заметками (начиная со сборки 236).
Встреча проходит через них, а приложение показывает, на каком этапе она сейчас:
Уведомление сообщает, когда текст и сводка встречи готовы. В нём нет ни названия, ни содержания.
Chui — не сервис для расшифровки. Задумано так: во время встречи ты набрасываешь пару строк (имя, число, твоё обещание), а Chui сводит их с тем, что было сказано на самом деле. Сводка пишется по тому и другому. Набранные строки задают ей направление, а не попадают в неё дословно. Заметки можно написать или поправить и после встречи.
list_meetings() даёт список: идентификатор, название, дату, длительность, статус, и больше ничего. get_meeting() даёт сводку одной встречи, её заметки, длительность и число распознанных говорящих. Обычно на этом и стоит остановиться. Расшифровка — отдельное и гораздо более дорогое чтение: см. Как найти сказанное.
Встреча, на которой ты сейчас, тоже есть в этом списке с пометкой in_progress. Поэтому ассистент, которого спросили «что у меня сейчас идёт?», может ответить. Пока запись не придёт, нет ни расшифровки, ни сводки: Chui расшифровывает встречу после её окончания. Нет и окончательной длительности. Вместо этого возвращается, сколько встреча уже идёт, когда Chui в последний раз получил звук с устройства, и заметки, которые в неё набирают, по мере набора. Ассистент может прочитать эти заметки, дополнить их и сказать, что встреча не закончена. Сообщать о ней как о пустой или неудавшейся не следует, хотя снаружи из-за недостающих частей она выглядит именно так.
Это значит «не закончена», а не «идёт прямо сейчас», и разницу стоит понимать. Chui узнаёт, что запись закончилась, когда об этом сообщает устройство. Для сервера три совсем разные ситуации выглядят одинаково:
Поэтому ассистенту велено не утверждать, что микрофон включён.
Вместо этого он получает один узкий факт. Пока встреча записывается, телефон каждые девяносто секунд отправляет фрагмент звука. Поэтому Chui знает, сколько времени назад пришёл последний фрагмент этой записи, и больше ничего. Большой перерыв означает, что новый звук не поступал. Возможно, запись стоит на паузе, телефон без сети или встреча закончилась, а Chui об этом не сообщили. Короткий перерыв тоже не доказывает, что запись идёт вживую. Телефон, который по новому соединению догружает старую запись, выглядит так же свежо. Chui передаёт число, а не называет причину. Там, где проверить вообще не удалось, он молчит, а не гадает.
Chui сам даёт встрече название, обычно по приглашению в календаре или по тому, что было сказано. Поэтому название часто лишь догадка. Его можно исправить в приложении или попросить ассистента: rename_meeting().
Ассистент может поправить и заметки, набранные во время встречи, но сначала спрашивает. Новый текст заменяет их все сразу, а старые нигде не сохраняются. prepare_update_meeting() показывает заметки такими, какие они есть, и такими, какими станут, и на этом этапе ещё ничего не произошло. Только после твоего «да» update_meeting() их записывает, причём ровно тот текст, который тебе показали. Ассистент должен отправлять весь текст вместе с изменением, иначе остальное пропадёт. Если заметки тем временем изменились (скажем, на другом устройстве), ничего не записывается, и спросить нужно заново.
Сводку можно поправить так же: неверное имя, неверное число, решение, записанное наоборот. prepare_update_summary() показывает сводку такой, какая она есть, и такой, какой станет. На этом этапе ещё ничего не произошло. Только после твоего «да» update_summary() записывает ровно тот текст, который тебе показали, и заменяет сводку целиком. Расшифровку нельзя редактировать: ни через ассистента, ни в приложении. Это то, что было сказано.
Сводка, исправленная вручную, дальше становится обычной сводкой, и её ничто не защищает. Chui напишет сводку заново по расшифровке и заметкам, и исправление будет заменено, если:
Поэтому если ошибка в том, кто говорил, или в том, что было в заметке, исправь именно это. Сводка сама подтянется через минуту-другую.
Еженедельный стендап — это одна и та же встреча, которая повторяется, и Chui знает, какие записи к ней относятся. Он определяет это по серии в календаре, которая сохраняется вместе с записью, а не ищется потом. get_series() даёт предыдущие повторения одной встречи, начиная с последнего. Так что «о чём мы договорились на прошлой неделе?» и «что осталось нерешённым с позапрошлой?» — это один вызов, а затем get_meeting(). Искать по названиям, которые могут быть непохожи друг на друга, не нужно. Встреча, записанная без события в календаре, не относится ни к какой серии, и ответ прямо об этом говорит, а не приходит пустым.
Встреча может вернуться с пометкой обрезана (cut short) или неполная (partial). Так Chui сообщает, что запись охватывает не весь разговор. Приложение было приостановлено, или запись восстановили после сбоя, а её конец так и не сохранился на устройстве. Пересказывай то, что есть, как фрагмент, и не описывай это как всю встречу. Если всё прошло нормально, такой пометки нет. У импортированного файла её не бывает никогда: нет хронометража встречи, с которым его можно сравнить.
get_coverage() задаёт этот вопрос напрямую и отвечает одним предложением: охватывает ли запись встречу, какова длина файла, сколько длилась встреча и какая её доля попала в запись. В расшифровке этого не видно: двадцать минут девяностоминутной встречи читаются точно так же, как целая двадцатиминутная. Поэтому стоит спросить, прежде чем рассказывать кому-то, о чём договорились. Кроме того, get_coverage() отличает «это никто не измерял» от «всё в порядке», а это разные ответы.
Сводка — это заметки, вплетённые в сказанное. Поэтому, когда меняется одно или другое, Chui сам пишет её заново через минуту-другую. Обычно достаточно назвать говорящего или поправить заметку. В приложении «Написать сводку заново» (Write the summary again) показывает неброскую строку, пока сводка переписывается (начиная со сборки 248).
Ассистент может попросить новую сводку и напрямую. Это единственное его действие здесь, которое стоит реальных денег при каждом вызове. Языковая модель заново проходит по всей встрече, а если встреча так и не была расшифрована, то ещё и расшифровка проходит по записи. К тому же текущая сводка при этом выбрасывается. Поэтому ассистент сначала спрашивает. prepare_resummarise_meeting() показывает сводку, которая исчезнет, и говорит, какой из двух проходов оплатит твоё «да». На этом этапе ничего не тратится. Только после твоего «да» resummarise_meeting() запускает проход. Если Chui тем временем уже сам написал сводку заново, он сообщает об этом и ничего не оплачивает. Встречу, в которой Chui не услышал ни слова, нельзя пересказать заново. Chui так и говорит, а не платит за то, чтобы дважды слушать тишину.
Короткая заметка для одного голоса (начиная со сборки 235). Запись, в которой звучит только один голос, например мысль, которую ты проговариваешь для себя, может вернуться в виде короткой заметки: сама мысль, приведённая в порядок, без разделов и имён говорящих. В списке встреч она отмечена значком лампочки. Начиная со сборки 236 это верно и для длинной записи на несколько часов, которую раньше могли принять за два голоса и обработать как встречу.
Своя форма, один раз. Если у твоей встречи свои разделы — еженедельный обзор это всегда цифры, риски, просьбы, — скажи это ассистенту один раз, и Chui будет писать её так и дальше. Повторяющейся встрече форма задаётся через set_series_shape() (с любой её встречи; get_series() её читает), метке — через summary_shape в update_label() (list_labels() её показывает). Chui по-прежнему начинает с короткого «вкратце» и заканчивает следующими шагами и открытыми вопросами. Форма повторяющейся встречи важнее формы метки; две метки с разными формами оставляют выбор за Chui. Пустая форма возвращает выбор Chui. Это часть платного тарифа, и просят об этом словами — кнопки в приложении нет.
Расшифровка приходит с метками speaker_0, speaker_1 … Движок различает голоса, но не может их назвать. Голос можно назвать в приложении или через ассистента с помощью name_speaker(). Тогда имя встаёт на место метки везде, где читают эту встречу. Человек добавляется в список, чтобы его предложили на следующей встрече, а сводка переписывается с учётом имени.
Когда ты называешь голос в приложении, список начинается с «Я» (Me), а рядом стоит имя твоего аккаунта: одно касание подписывает этот голос твоим именем ровно так, как оно написано в аккаунте (начиная со сборки 249).
Узнавание голоса от встречи к встрече работает только для тех, кто сам включил у себя «Распознавание своего голоса» (Own-voice recognition) (Настройки, которые меняются по просьбе). Их голос приходит уже подписанным в их собственных встречах и во встречах их компании, на которые их пригласили. Любой другой голос начинается как speaker_0, speaker_1 … и подписывается вручную. Имя, которое Chui дал голосу, меняется одним касанием, как любое другое.
Имя, которое Chui вывел из разговора и которое ещё никто не подтвердил, выглядит как обычное имя, но это только догадка. Если коснуться его, появятся варианты «Да, это …» (Yes, this is …), чтобы закрепить имя, и «Это не …» (Not …), чтобы его снять. Через ассистента get_meeting() перечисляет такие имена в tentative_speaker_names. Чтобы подтвердить имя, назови голос так же. Чтобы снять, нужно вызвать prepare_reject_speaker_name(), а затем reject_speaker_name().
Каждая ошибка сообщает, что именно случилось и что можно сделать:
В большинстве случаев можно повторить попытку.
Если сводку не удаётся написать из-за сбоя на стороне Chui, Chui сам пробует снова каждый час в течение примерно суток (начиная со сборки 230). Так что из-за ночного сбоя встрече не придётся ждать, пока ты нажмёшь «Написать сводку заново» (Write the summary again).
Удаление встречи навсегда уничтожает запись, расшифровку, сводку и заметки везде, где они есть. Вместе с ними исчезает всё, что Chui узнал из этого разговора о его участниках. Любая публичная ссылка на встречу перестаёт работать. Chui помнит, что встреча удалена. Поэтому телефон, на котором ещё остался звук, выбросит его, а не загрузит позже снова. Вернуть ничего из этого нельзя.
В приложении это Удалить встречу (Delete meeting) внизу встречи или свайп по строке. В обоих случаях Chui сначала спрашивает в окне, где указано название встречи.
Ассистент тоже может удалить встречу и спрашивает так же, в два шага, потому что это действие нельзя отменить. prepare_delete_meeting() показывает, о какой встрече речь: как она называется, когда была, сколько длилась, набирались ли в ней заметки и читает ли её кто-то вне Chui по ссылке. На этом этапе ещё ничего не произошло. Только после твоего «да» delete_meeting() её уничтожает. Он не принимает ничего, кроме ответа на этот вопрос, так что удалить встречу, которую тебе только что не показали, невозможно. Коллега может открыть встречу, которой кто-то поделился с командой, но удалить её не может. Это может только тот, кто её записал.
Запись остановили на перерыве и включили снова после него. Или запись оборвалась, и Chui сохранил остаток встречи отдельно. Так или иначе, один разговор лежит в твоём списке двумя строками, с двумя сводками и двумя наборами говорящих.
Попроси ассистента объединить их. prepare_merge_meetings() показывает:
На этом этапе ещё ничего не произошло. Только после твоего «да» merge_meetings() выполняет объединение. Он не принимает ничего, кроме ответа на этот вопрос.
Что происходит: обе записи ставятся одна за другой, в том порядке, в каком были сделаны, в более раннюю встречу. Она сохраняет свой идентификатор и дату, а более поздняя встреча затем удаляется. Chui заново читает объединённую запись с самого начала. В итоге у встречи одна расшифровка, одна сводка и один набор говорящих на весь разговор. Это занимает несколько минут. Заметки, набранные в любой из встреч, сохраняются по порядку, а заметки второй половины сдвигаются по времени.
Звук при этом никогда не теряется. Каждая секунда обеих записей переносится в оставшуюся встречу и проверяется, прежде чем трогают вторую строку. А вот слова не возвращаются. Обе сводки и обе расшифровки заменяются, и ручные исправления в любой из двух встреч тоже пропадают, и вернуть две строки обратно нельзя. Отменить объединение нельзя.
Ещё две вещи, которые стоит знать, прежде чем просить об этом.
В трёх случаях Chui отказывает и говорит об этом до того, как ты решишь, а не после.
Во-первых, он не объединит две записи, которые не может честно соединить: например, половины, записанные с разными настройками, или одну на телефоне, а другую на Mac. Иначе получился бы файл, который воспроизводится как другая встреча.
Во-вторых, он не объединит две строки, которые начались в один момент и длились одинаково. Это один разговор, дошедший до Chui дважды, а не две половины одного. Объединение дало бы встречу, где всё сказано дважды. В таком случае удали одну из них.
В-третьих, он пока не умеет объединять ничего, записанного во вкладке браузера. Запись, сделанная в браузере, пишет свой индекс по ходу, а не в одном месте в конце, и Chui не может соединить две такие записи. Сами записи в порядке и воспроизводятся нормально, Chui лишь не может их объединить. Обе половины встречи, которые ты хочешь объединить, должны быть записаны на телефоне, Mac или компьютере с Windows.
Есть ещё ограничение бесплатного аккаунта. Допустим, встреча, которая должна остаться, ещё не прочитана (например, та, где что-то пошло не так), а десять встреч в месяц уже израсходованы. Тогда Chui отказывает. Чтение объединённой записи было бы первым чтением, оно упёрлось бы в месячный лимит, и обе половины оказались бы заблокированы сразу. У платного аккаунта такого ограничения нет. На бесплатном их можно объединить в следующем месяце. Чем ограничен бесплатный аккаунт, объясняет Сколько стоит аккаунт.
Кнопки для этого в Chui нет. Это исправление обычно замечаешь, когда читаешь обе встречи, и тогда же стоит о нём попросить.
Обратная ситуация: телефон остался на столе или ноутбук открытым, и три разговора попали в одну запись. Chui сохранил одну встречу с одной сводкой. Она обо всех разговорах сразу, а значит, ни об одном.
В сборках 238 и 239 запись на телефоне по ходу сама делилась на отдельные встречи на каждой долгой паузе; начиная со сборки 240 «Новая запись» на телефоне снова создаёт одну запись, которая идёт до «Стоп» (Запись встречи).
Обычно Chui замечает это сам. Прочитав запись длиной от получаса, Chui проверяет, не несколько ли это встреч. В основном он смотрит, кто говорит: где одни люди замолкают насовсем, а другие начинают, там кончается одна встреча. Каждое такое место он сверяет с темой разговора, твоим календарём и возможной паузой. Только когда всё сходится, на экране встречи появляется карточка: «Похоже на 3 отдельные встречи» (Looks like 3 separate meetings). Для каждой части указаны время, название и участники. Сними отметку с части, чтобы она осталась соединённой с соседней. «Разделить на N» (Split into N) разрезает запись, а «Это одна встреча» (It’s one meeting) убирает карточку навсегда.
Или спроси, где разрыв. find_split_points() отвечает собственным предложением Chui, то есть теми же частями с именами, что показывает карточка. Ещё он перечисляет долгие паузы: на какой отметке от начала записи находится каждая пауза, сколько длилась тишина, что было сказано последним перед ней и что первым после. Ничего видимого это не меняет. Если ты скажешь, что это одна встреча, keep_as_one_meeting() сделает то же, что кнопка «Это одна встреча».
Потом попроси разрезать. prepare_split_meeting() перечисляет все части, которые получатся: когда каждая начинается, какой она длины и что в ней сказано первым. На этом этапе ещё ничего не произошло. Только после твоего «да» split_meeting() выполняет разделение. Он не принимает ничего, кроме ответа на этот вопрос.
Что происходит: звук делится ровно там, где указано, и каждая часть становится отдельной встречей. Первая часть сохраняет идентификатор этой встречи, её дату, название и опубликованную ссылку. Остальные становятся новыми встречами, которые начинаются в то время, когда действительно были записаны. Ничего не записывается заново и ничего не расшифровывается повторно. Chui знает, на какой секунде было сказано каждое слово, поэтому слова первого часа просто остаются с первым часом. Имена у голосов сохраняются ровно такими, как есть. Твои заметки уходят в ту часть, во время которой их набирали. Затем Chui пишет новую сводку для каждой части, это занимает меньше минуты.
Это не расходует десять встреч в месяц бесплатного аккаунта. Ничего не отправляется на повторную расшифровку, так что списывать нечего. Если до разделения было израсходовано девять встреч, после него их тоже девять.
Теряется сводка всей записи. Вместе с ней теряется и то, что эта сводка добавила в сведения об участниках. Chui заново записывает эти сведения по новым сводкам. Ни звук, ни слова не теряются. Отменить разделение нельзя. Части можно снова соединить через merge_meetings(), но тогда объединённая запись читается с нуля, и это занимает несколько минут.
Chui отказывает в разделении, ещё ни о чём тебя не спросив, в четырёх случаях:
Встречу, которую Chui собрал после того, как записывающее устройство перестало присылать запись, можно сразу разделить или объединить с другой встречей (начиная со сборки 247). Если это устройство позже пришлёт остаток записи, та часть, которой у Chui не было, придёт отдельной встречей.
Единственная кнопка для этого есть на карточке, которую Chui показывает, когда подозревает, что запись состоит из нескольких встреч. Разрезать запись в любом другом месте можно, попросив об этом словами.